我非常喜欢 CDI 的构造函数注入,但现在我发现了一个用例,其中构造函数注入显然不能按预期工作。
在我的示例中,我有两个类。类“BeanA”没有定义明确的范围,也没有实现 Serializable。类“BeanB”使用@SessionScoped 进行注释,并实现了可序列化。
public class BeanA{
}
@SessionScoped
public class BeanB implements Serializable{
@Inject
private BeanA beanA;
}
当我尝试将 BeanA 的实例注入 BeanB 时,我从 Weld 得到 UnserializableDependencyException,因为 BeanA 不可序列化。这是预期的行为。
当我用“瞬态”标记字段“beanA”时,注入工作没有问题:
@Inject
private transient BeanA beanA;
现在 Weld 不会抛出任何异常。
这对我来说非常好,但是当我想通过构造函数注入来实现它时,我的理解问题就出现了。当我执行以下操作时,它不再起作用:
@SessionScoped
public class BeanB implements Serializable{
private transient BeanA beanA;
@Inject
public BeanB(BeanA beanA){
this.beanA = beanA;
}
public BeanB(){}
}
使用此代码,我再次获得 UnserializableDependencyException。我认为构造函数注入和字段注入或多或少是等效的,但显然它们不是。我的错误是什么?