实体bean的Guice依赖注入?

Kde*_*per 7 aop domain-driven-design hibernate jpa guice

对于丰富的域驱动设计,我想在JPA/Hibernate实体bean上使用Guice依赖注入.我正在寻找与非Spring bean的Spring @configurable注释类似的解决方案.

有人知道图书馆吗?任何代码示例?

Cra*_*Day 5

您可以使用AspectJ执行此操作.

创建@Configurable注释:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface Configurable {
}
Run Code Online (Sandbox Code Playgroud)

创建一个与此类似的AspectJ @Aspect:

@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);
        }
    } 
}
Run Code Online (Sandbox Code Playgroud)

为您的进样器创建(并使用)保持类:

public final class InjectorHolder {

    private static Injector injector;

    static void setInjector(Injector injector) {
        InjectorHolder.injector = injector;
    }

    public static Injector getInjector() {
        return injector;
    }
}
Run Code Online (Sandbox Code Playgroud)

配置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>
Run Code Online (Sandbox Code Playgroud)

使用aspectjweaver启动VM:

-javaagent:lib/aspectjweaver.jar
Run Code Online (Sandbox Code Playgroud)

注释您的域类:

@Entity
@Table(name = "Users")
@Configurable 
public class User {
    private String username;
    private String nickname;
    private String emailAddress;
    @Inject
    private transient UserRepository userRepository

    public User() {}
}
Run Code Online (Sandbox Code Playgroud)