相当于@Configurable for CDI JavaEE 7

时间:2017-06-12 08:05:44

标签: java spring reflection dependency-injection cdi

目前,当我想通过他们的注释创建一个新对象时,CDI存在很大问题。

通过反射,我得到了所有用“@Connector”进行分类的课程。之后,我为每个类创建一个新对象。这工作正常,但我想将一个ServiceHandler注入试图通过'@Inject'注入它的对象。 这里的问题是CDI不知道这些对象并且无法注入它们。目前我有解决这个问题的解决方法,但这不是很好。我是CDI的新手,我正在寻找相当于Spring的'@Configurable'注释。

private Set<ApiDao> determineApiDaos() {
Set<Class<?>> classes = new Reflections("###packageName###").getTypesAnnotatedWith(Connector.class);
return FluentIterable.from(classes)
    .transform(CLASS_TO_API_DAO_FUNCTION)
    .filter(Predicates.notNull())
    .toSet(); 
}

private ApiDao instantiateApiDao(Class apiDao) {
try {
  ApiDao newApiDao = (ApiDao) apiDao.newInstance();
  newApiDao.setConfigurationService(configurationService); // Workaround inject service during creation
  return newApiDao;
} catch (Exception e) {
  LOG.error("Could not initialize Connector.", e);
  return null;
  }
}

1 个答案:

答案 0 :(得分:0)

你的问题很广泛。那将是我的答案。

首先,在使用Java EE时不要试图模仿Spring。阅读CDI规范很有用。

如果我正确理解您的问题,您有一个CDI未知的类,但您希望CDI注入它。这在CDI中很容易解决。事实上,比使用Spring要容易得多。使用producers

public class ConfigurationServiceProducer{

 @Produces
 public ConfigurationService produceConfigurationService(){
  //Instantiate and return the ConfigurationService accordingly.
  return new ConfigurationService();
 }
}

如果需要,您还可以使用Qualifiers将Bean类型区分为ConfigurationService。如果需要在producer方法中更直接地检查注入点,可以将InjectionPoint作为参数传递给producer方法。