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

时间:2016-12-03 18:24:39

标签: java spring dependency-injection

我是春天的新手并且在某些方面陷入困境,如下所述 -

我有一个类颜色,有两个不同的实现名称为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()}

1 个答案:

答案 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
    }
}

此外,您可以使用@OrderColor对象注入colorList内部的特定索引,如Spring doc here中所述。

  

如果从两个类中删除@component注释,解决方案工作正常   红色和蓝色,删除组件后只提供一种bean类型

使用@Component标记bean类时(实际上是任何Spring构造型注释),bean将符合注入条件,并将自动加载到colorList中。因此,当您提供@Bean注释方法并再提供一个对象时,也会将其添加到列表中,但通常情况下,您将使用@Component或使用@Bean加载列表,但不是两个。