È possibile farlo con AspectJ.
Creare l'annotazione @Configurable:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface Configurable {
}
Crea un AspectJ @Aspect simile a questo:
@Aspect
public class ConfigurableInjectionAspect {
private Logger log = Logger.getLogger(getClass().getName());
@Pointcut("@within(Configurable) && execution(*.new(..)) && target(instantiated)")
public void classToBeInjectedOnInstantiation(Object instantiated) {}
@After(value = "classToBeInjectedOnInstantiation(instantiated)",
argNames = "instantiated")
public void onInstantiation(Object instantiated) {
Injector injector = InjectorHolder.getInjector();
if (injector == null) {
log.log(Level.WARNING, "Injector not available at this time");
} else {
injector.injectMembers(instantiated);
}
}
}
Crea (e l'uso) una classe di tenuta per il vostro iniettore:
public final class InjectorHolder {
private static Injector injector;
static void setInjector(Injector injector) {
InjectorHolder.injector = injector;
}
public static Injector getInjector() {
return injector;
}
}
Configure META-INF/aop.xml:
<aspectj>
<weaver options="-verbose">
<include within="baz.domain..*"/>
<include within="foo.bar.*"/>
</weaver>
<aspects>
<aspect name="foo.bar.ConfigurableInjectionAspect"/>
</aspects>
</aspectj>
Avviare il VM con aspectjweaver:
-javaagent:lib/aspectjweaver.jar
annotare le classi di dominio:
@Entity
@Table(name = "Users")
@Configurable
public class User {
private String username;
private String nickname;
private String emailAddress;
@Inject
private transient UserRepository userRepository
public User() {}
}
fonte
2010-07-28 12:33:57
Grazie, una soluzione codeweaving come Salve potrebbe davvero fare il trucco. Ho provato Salve, ma ha una documentazione limitata e non riesco a farlo fare nulla (nemmeno un messaggio di errore). Ho solo sperato in qualche semplice codice di esempio, ad esempio con AspectJ o ancora meglio AOP. – Kdeveloper
@Kdeveloper: Non ho alcuna esperienza con Salve quindi non posso raccomandarlo ma potrebbe darti qualche idea per implementare qualcosa di simile, motivo per cui l'ho menzionato –