我是春天的新手并且在某些方面陷入困境,如下所述 -
我有一个类颜色,有两个不同的实现名称为Red和Blue,我想使用@inject
将两者都注入颜色列表。
Below is my ApplicationConfiguration class
package org.arpit.java2blog.config;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import javax.inject.Inject;
import org.arpit.java2blog.model.Country;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import(CountryConfig.class)
public class ApplicationConfiguration {
@Inject
private List<Color> colorList;
@Bean
public List<Color> colorList() {
System.out.println("Second");
List<Color> aList = new ArrayList<Color>();
aList.add(new Blue());
return aList;
}
}
但是将异常视为
注入自动连接的依赖项失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:不能 autowire字段:private java.util.List org.arpit.java2blog.config.ApplicationConfiguration.colorList;嵌套 例外是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有 找到类型为[org.arpit.java2blog.config.Color]的限定bean 依赖[org.arpit.java2blog.config.Color的集合]:期望 至少有一个bean有资格作为autowire候选者 依赖。依赖注释:{@ javax.inject.Inject()}
答案 0 :(得分:1)
使用colorList
填充@Inject
的正确方法显示在下面的代码中,并带有内嵌注释:
@Configuration
@Import(CountryConfig.class)
public class ApplicationConfiguration {
@Inject
private List<Color> colorList;
@Bean
public Color color() {
return new Blue();//injects Blue object to colorList
}
@Bean
public Color color() {
return new Red();//injects Red object to colorList
}
}
此外,您可以使用@Order
将Color
对象注入colorList
内部的特定索引,如Spring doc here中所述。
如果从两个类中删除@component注释,解决方案工作正常 红色和蓝色,删除组件后只提供一种bean类型
使用@Component
标记bean类时(实际上是任何Spring构造型注释),bean将符合注入条件,并将自动加载到colorList
中。因此,当您提供@Bean
注释方法并再提供一个对象时,也会将其添加到列表中,但通常情况下,您将使用@Component
或使用@Bean
加载列表,但不是两个。