2015-10-10 31 views
3

我是新来的CDI,试图找到这个问题的解决方案,但是,couln't发现任何。问题是假如我有一个正在从,其中一些价值(toPass)是越来越注入,现在我想通过这个相同的值(toPass)B类,这是越来越从A级如何将参数传递给CDI中另一个类的注入类?

注射注射(A)一类
public class A 
{ 
    String toPass = "abcd"; // This value is not hardcoded 

    @Inject 
    private B b; 
} 

public class B 
{ 
    private String toPass; 
    public B(String toPass) 
    { 
     toPass = toPass; 
    } 
} 

任何人可以请帮我在这? 注意:我们不能像我们在A中初始化一样初始化B的toPass变量,但它有一些限制。基本上在春天我们可以轻松完成,但是,我想在CDI中完成。

回答

3

你必须选择:

1. 设置从@PostConstruct方法豆AtoPass变量b

@PostConstruct 
public void init() { 
    b.setToPass(toPass); 
} 

2. 为toPass变量创建生产者并将它注入到豆AB

监制:

@Produces 
@ToPass 
public String produceToPass() { 
    ... 
    return toPass; 
} 

注:

@Inject 
@ToPass 
String toPass; 

3. 如果豆A不是依赖作用域的bean可以使用Provider接口获取bean的实例A

public class B 
{ 
    @Inject 
    Provider<A> a; 

    public void doSomeActionWithToPass() { 
     String toPass = a.get().getToPass()); 
     ... 
    } 

但你不应该从构造函数或方法@PostConstruct使用toPass。

2

我必须说,注射发生在创建对象刚过,因此万一toPass会一个对象的生命周期过程中改变之前,这种变化不会对已经注射B对象产生任何影响。

(这将是可能可能的,如创建自己的生产方法和生产一些类型的代理会懒洋洋地初始化在B比如有的哈克事情来克服这个......不过,这将是可能不是很好)

public class A 
{ 
    String toPass = "abcd"; // This value is not hardcoded 
    private B b; 

    @Inject 
    public void setB(B b) { 
     this.b = b; 
     b.pass(toPass); 
    } 
}