我班上有两个领域:
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告诉我:
带有限定符@Default的ClassA类型的不满意依赖项
然而,CDI告诉我任何关于ClassB b字段的信息。
然后,我添加了一个@Dependent注释:
@Inject @Dependent private ClassA a;CDI也这么说。
但是,如果我用一个@New CDI对这个字段进行注释,就可以了。
如果我使用@New工作,为什么?为什么CDI不告诉我另一个属性Class B
发布于 2016-04-19 14:57:41
这个限定符注释(@Dependent)继续进行类定义本身,或者是bean的生产者。在注射点上不行。
另外,不要使用@New。这是不可取的。它的功能与依赖的功能相同,但它是从注入点端驱动的,而CDI则集中在生产者端。
发布于 2017-04-12 17:03:05
Java中的CDI与"Types“一起工作。因此,如果您有一个由不同类实现的接口,并且试图注入该接口,那么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将始终知道要注入哪种实现或哪种类型,在哪个注入点,这将不会抱怨类型的歧义。
https://stackoverflow.com/questions/36714506
复制相似问题