如何在基于Spring的Java配置中正确使用@Inject注解?
我是新来的春天,并陷入了一些问题,如下所述 -如何在基于Spring的Java配置中正确使用@Inject注解?
我有一个班级的颜色与两个不同的实施名称为红色和蓝色,我想注入颜色列表使用@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;
}
}
,但得到的例外是
注射自动装配Autowired依赖的失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:不能 autowire字段:private java.util.List org.arpit.java2blog.config.ApplicationConfiguration.colorList;嵌套0例外是 org.springframework.beans.factory.NoSuchBeanDefinitionException:[org.arpit.java2blog.config.Color]发现 依赖性[org.arpit.java2blog.config.Color的集合]没有类型的 预选赛豆:预期至少有1个豆符合此 依赖关系的自动导向候选。依赖注解:{@ javax.inject.Inject()}
使用@Inject
您colorList
填入正确的方法显示在下面的代码与内联注释:
@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
}
}
此外,你可以很正如Spring doc here中所解释的那样,使用@Order
以在colorList
的特定索引处注入Color
对象。
该解决方案是工作的罚款,如果我从两个类中删除@Component注解除去成分
后 红蓝只提供一个bean类型当你与@Component
标记您的bean类(事实上对于任何Spring stereotype注释),这些bean将有资格注入,并且会自动加载到您的colorList
。因此,当您提供@Bean
注释方法并给出多一个对象时,它也会被添加到列表中,但一般来说,您将使用@Component
或使用@Bean
加载列表,但不能同时加载这两个对象。
你怎么课'颜色'看起来像?它是否有'@ Component'注释?它在Spring上下文中可用吗? – questionare
不,它只是一个简单的普通类,没有@component – CoreThought
不确定,但同样的东西可以正常使用@resource注释 – CoreThought