CDI - @Any和@Inject

时间:2018-04-18 15:20:31

标签: spring cdi

尝试在具有@Any注释字段的类中注入bean。但是得到错误 -

  

引起:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有类型' javax.enterprise.inject.Instance'的限定bean。可用:预计至少有1个豆有资格作为autowire候选者。依赖注释:{@ javax.inject.Inject(),@ javax.enterprise.inject.Any()}

   @Named
@Singleton
public class ProcessorFactoryImpl implements ProcessorFactory {

    @Inject @Any
    private Instance<Processor> processorList;
}

界面

public interface Processor {
some method
}

实施课程是:

@Named
@Singleton
@Default
public class ProcessorImpl implements Processor {
}

目前,我只有一个实现,所以没有创建限定符。

2 个答案:

答案 0 :(得分:1)

您是否尝试过List而不是Instance

@Autowired
private List<Processor> processorList;

答案 1 :(得分:1)

你正在混合Spring DI和CDI,它们不是一起工作的。

选择其中一个而不是两个。

如果选择CDI

@Named
@ApplicationScoped
public class ProcessorFactoryImpl implements ProcessorFactory
{  
    @Inject
    private Processor processor;
}

@Dependent
@Default
public class ProcessorImpl implements Processor {
  // etc ...
}

在这种情况下,processor属性不是List!你应该考虑你的期望。如果您需要List<Processor>,则必须使用CDI Producer

如果选择Spring DI

@Component
public class ProcessorFactoryImpl implements ProcessorFactory
{
    @Inject // or @Autowired
    private Processor processor;
}

@Scope("prototype")
public class ProcessorImpl implements Processor 
{
  // etc ...
}

混合Spring和CDI

如下面的评论所述,Spring可以使用@Inject@Named,因为这些注释是JSR-330的一部分。

麻烦的是,在@Inject字段上使用Instance<T>进行过多的框架混合并不能像Spring那样实现,因为它是CDI功能。

要使用相同的功能,请使用Spring中的@Provider

示例:

CDI

@Inject
private Instance<MyClass> lazyInstance;

用法:

MyClasse instance = lazyInstance.get();

弹簧

@Inject // or @Autowired
private Provider<MyClass> lazyInstance;

用法(与CDI相同):

 MyClasse instance = lazyInstance.get();