如何在基于Spring的Java配置中正确使用@Inject注解?

如何在基于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()}

+0

你怎么课'颜色'看起来像?它是否有'@ Component'注释?它在Spring上下文中可用吗? – questionare

+0

不,它只是一个简单的普通类,没有@component – CoreThought

+0

不确定,但同样的东西可以正常使用@resource注释 – CoreThought

使用@InjectcolorList填入正确的方法显示在下面的代码与内联注释:

@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加载列表,但不能同时加载这两个对象。