【问题标题】:How to inject into new SomeObject()如何注入新的 SomeObject()
【发布时间】:2016-01-22 20:53:50
【问题描述】:

我有一个类似如下的课程:

public class MyClass {

    @Inject
    private SomeClass someclass;

    //...
}

如果我通过new MyClass() 创建这个类,那么someClass 就是null。如果我注入MyClass 它不是。但我需要在这里新建。我知道我可以通过构造函数将 someClass 传递给 MyClass,但我不想要这个。我还有什么其他的可能性?

【问题讨论】:

  • @Downvoters:为什么要投反对票?请告诉我我应该怎么做才能得到你的批准。那我来解决这个问题。

标签: java dependency-injection cdi


【解决方案1】:

我找到了一个很好的解决方案。诀窍是通过以下方式注入“MyClass”:

@Inject
private Instance<MyClass> myClass;

然后你可以通过

构造bean
myClass.get();

这封装了beanManager的使用。

【讨论】:

    【解决方案2】:

    我假设您使用的是 CDI 或类似的东西。为了在这种情况下注入工作,框架必须“看到”注入某些东西的需要(以及在哪里注入)。这通常通过使用框架创建MyClass 实例来完成,但也可能有一种手动触发注入的方法。

    就 CDI 而言,它是这样的:

    BeanManager bm = ...; //lookup or let it inject        
    Bean<MyClass> bean = (Bean<MyClass>)bm.getBeans( MyClass.class ).iterator().next();    
    CreationalContext<T> ctx= bm.createCreationalContext( bean );    
    MyClass instance = bm.getReference( bean, MyClass.class, ctx);    
    

    【讨论】:

    • 对我来说这看起来并不太“干净的代码”。没有“更好”的解决方案吗?类似于最佳实践?
    • @Chris311 你也可以让 CDI 将MyClass 的实例注入到你需要的地方。如果您在那里没有注入(因为目标本身不受 CDI 管理),您将不得不使用与上述类似的代码(可能包含在方法中)。事实上,您需要在非托管对象和托管对象之间进行一些集成,因此您需要一些看起来像“样板”的代码。
    猜你喜欢
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    相关资源
    最近更新 更多