CDI注入多个级别?

时间:2014-11-20 16:12:03

标签: java cdi websphere-liberty

我正在使用CDI初始化数据源(请参阅我之前的问题:DataSource initialization error within liberty profile server

public abstract class DAOBase {
    @Resource(name="jdbc/Oracle", lookup = "jdbc/Oracle")
    private DataSource ds;

直接从REST类初始化DAO类时,这很有效:

@Path("/audit")
public class AuditREST extends RESTBase implements AuditRESTInterface {
    @Inject
    private AuditDAO auditDAO = new AuditDAO();

当REST类调用一个调用DAO的中间类时,我可以通过以下方式完成:

public class JobConfigurationREST extends RESTBase implements JobConfigurationRESTInterface {
    @Inject
    private JobRunner jr = new JobRunner();

public class JobRunner implements Runnable{
    @Inject
    private JobConfigurationDAO jcDAO = new JobConfigurationDAO();

然而,JobRunner还包含一个方法,可以动态创建类的一些实例(SampleModel)。然后SampleModel包含一个我需要注入的dao。

public class SampleModel extends Step implements Model {
    @Inject
    private ModelDAO modelDAO = new ModelDAO();

我看不到在JobRunner和SampleModel之间添加链接的方法。我该怎么做?

或者,这甚至是必要的吗?我觉得必须指定REST类和DAO类之间的所有链接过于复杂,我应该能够在某处声明SampleModel(可能是beans.xml?),容器应该为我处理所有事情。< / p>

编辑:

我在这里简化了问题。 SampleModel是通过Job类创建的,Job类是通过JobBuilder类中的方法创建的(我似乎也无法注入)。

JobBuilder jb = new JobBuilder();
Job j = jb.buildJob(jc, jobContext);

SampleModel也是通过buildJob方法深处的反射创建的。

    public Job buildJob(JobConfiguration inJobConfiguration, JobContext inJobContext) {
stepList.add(ModelFactory.getInstance().getModel(sc.getImplementationName()));
    }

在工厂内:

ret =(Model)Class.forName(tmpImplDetail.getClassName())。newInstance();

1 个答案:

答案 0 :(得分:1)

您的问题似乎是您希望将@Inject移动到不是容器执行注入的组件的类中。

您可以通过将新的对象分配到注射点的方式来掩盖这一点。

  • 在实际支持注入的组件中,注入过程将在分配后发生并使其无害。
  • 在容器没有为您注入的对象中,您将获得一个由new分配的对象,该对象不会满足任何自己的注入点。

如果你没有做奇怪的任务,你会问更多关于“为什么我的@Inject字段为空?”的常见问题解答。