Guice внедрение зависимостей для сущностных бинов?

из docs

Example #3 Non-obvious Ternary Behaviour

7
задан Kdeveloper 17 July 2010 в 23:05
поделиться

2 ответа

Это можно сделать с помощью AspectJ.

Создайте аннотацию @Configurable:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface Configurable {
}

Создайте 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);
        }
    } 
}

Создайте (и используйте) удерживающий класс для вашего инжектора:

public final class InjectorHolder {

    private static Injector injector;

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

    public static Injector getInjector() {
        return injector;
    }
}

Настройте 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>

Запустите свою виртуальную машину с аспектомjweaver:

-javaagent:lib/aspectjweaver.jar

Добавьте аннотации к классам домена:

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

    public User() {}
}
5
ответ дан 7 December 2019 в 03:10
поделиться

Поскольку сущности создаются провайдером JPA, я не вижу, когда Guice может вступить в игру. Возможно, стоит взглянуть на подход проекта Salve.

1
ответ дан 7 December 2019 в 03:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: