【问题标题】:How to use @Inject annotation properly in spring Java based configuration?如何在基于 Spring Java 的配置中正确使用 @Inject 注解?
【发布时间】:2017-04-18 11:27:24
【问题描述】:

我是新来的春天,并被困在某个点上,如下所述 -

我有一个具有两个不同实现名称的类颜色,红色和蓝色,我想使用 @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:不能 自动装配字段:私有 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 的集合]:预期 至少 1 个 bean 有资格作为自动装配候选者 依赖。依赖注解:{@javax.inject.Inject()}

【问题讨论】:

  • 你上课的Color看起来怎么样?它有@Component 注释吗?它在 Spring 上下文中可用吗?
  • 不,它只是一个没有@component 的简单普通类
  • 不确定,但@resource 注释也能正常工作
  • 你的颜色等级怎么样?如果 spring 上下文不知道它就不能自动装配。
  • public interface Color {} 有两个实现 Red 和 Blue 都是没有注释的普通类,但不确定使用 @resource 注释如何正常工作

标签: java spring dependency-injection


【解决方案1】:

使用@Inject 填充colorList 的正确方法显示在下面的代码中,其中包含内联cmets:

@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 在内部colorList 的特定索引处注入Color 对象,如Spring 文档here 中所述。

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

当你用@Component 标记你的bean 类时(事实上对于任何Spring 原型注解),bean 将符合注入条件并自动加载到你的colorList。因此,当您提供@Bean 注释方法并再提供一个对象时,该对象也将添加到列表中,但通常,您将使用@Component@Bean 加载列表,但不能同时使用两者。

【讨论】:

    猜你喜欢
    • 2018-02-13
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 2014-04-14
    • 2021-10-13
    • 2014-07-08
    相关资源
    最近更新 更多