首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CDI“依赖”和“新”

CDI“依赖”和“新”
EN

Stack Overflow用户
提问于 2016-04-19 09:39:50
回答 2查看 954关注 0票数 1

我班上有两个领域:

代码语言:javascript
复制
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注释:

代码语言:javascript
复制
@Inject @Dependent private ClassA a;

CDI也这么说。

但是,如果我用一个@New CDI对这个字段进行注释,就可以了。

如果我使用@New工作,为什么?为什么CDI不告诉我另一个属性Class B

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-19 14:57:41

这个限定符注释(@Dependent)继续进行类定义本身,或者是bean的生产者。在注射点上不行。

另外,不要使用@New。这是不可取的。它的功能与依赖的功能相同,但它是从注入点端驱动的,而CDI则集中在生产者端。

票数 2
EN

Stack Overflow用户

发布于 2017-04-12 17:03:05

Java中的CDI与"Types“一起工作。因此,如果您有一个由不同类实现的接口,并且试图注入该接口,那么CDI将抱怨类型模糊,因为它无法解析要注入的bean实例的类型。例如:让我们说我们有这样的东西:

代码语言:javascript
复制
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

这给CDI带来了各种各样的混乱。

现在,为了克服这个问题,我们有一些限定符,它们是简单的注释。

因此,上面的代码变成了如下所示:

代码语言:javascript
复制
@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将始终知道要注入哪种实现或哪种类型,在哪个注入点,这将不会抱怨类型的歧义。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36714506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档