我班上有两个领域:
public class Class {
@Inject private ClassA a;
@Inject private ClassB b;
public void search(String lqlSentence)
{
this.a.something();
AnotherClass anotherOne = new AnotherOne;
anotherOne.method(this.b);
}
}
CDI告诉我:
类型ClassA与限定符@Default
的不满意依赖关系
但是,CDI告诉我有关ClassB b
字段的任何信息。
然后,我添加了@Dependent
注释:
@Inject @Dependent private ClassA a;
CDI告诉我同样的事情。
但是,如果我使用@New
CDI注释此字段。
为什么我使用@New
有效?
为什么CDI没有告诉我其他属性Class B
?
答案 0 :(得分:2)
此限定符注释(@Dependent
)依赖于类定义本身或bean的生成器。不在注射点上。
另外,请勿使用@New
。它被弃用了。它的功能与依赖功能相同,但是从注入点驱动,而CDI则集中在生产者端。
答案 1 :(得分:0)
Java EE中的CDI与"类型"一起使用。 因此,如果你有一个由不同的类实现的接口,并且你试图注入该接口,那么CDI会抱怨类型模糊,因为它无法解析要注入的bean实例的类型。 例如: 可以说我们有类似的东西:
public interface UserDao{
// methods......
}
public class UserDaoMongoImpl implements UserDao{
//Mongo db implementations....
}
public class UserDaoOrclImpl implements UserDao{
// oracle Db specific implementations for userDao
}
@Stateless
public class UserServiceImpl implements UserService{
@Inject private UserDao userDao; //injectPoint
//service impl ...
}
然后这里CDI将无法确定要注入哪个实现现在我们有三种不同类型的UserDao
会导致CDI出现各种混淆。
现在要克服这一点,我们有一些简单的注释限定符。
所以上面的代码变成了:
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.TYPE})
public @interface MongoImplementation {
}
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.TYPE})
public @interface OrclImplementation {
}
public interface UserDao{
// methods......
}
@MongoImplementation
public class UserDaoMongoImpl implements UserDao{
//Mongo db implementations....
}
@OrclImplementation
public class UserDaoOrclImpl implements UserDao{
// oracle Db specific implementations for userDao
}
@Stateless
public class UserServiceImpl implements UserService{
@Inject @MongoImplementation //Injection point A
private UserDao mongoUserDao;
@Inject @OrclImplementation //Injection point B
private UserDao orclUserDao;
//service impl ...
}
所以现在使用这个CDI将始终知道哪个实现或哪个类型注入哪个注入点,这不会引起类型歧义。