CDI @Dependent和@New

时间:2016-04-19 09:39:51

标签: cdi

我班上有两个领域:

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

2 个答案:

答案 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

  1. UserDao是UserDao
  2. UserDaoMongoImpl是UserDao
  3. UserDaoOrclImpl是UserDao
  4. 会导致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将始终知道哪个实现或哪个类型注入哪个注入点,这不会引起类型歧义。