【问题标题】:Can @Bean configured bean autowire other beans?@Bean 配置的 bean 可以自动装配其他 bean 吗?
【发布时间】:2018-12-24 15:03:57
【问题描述】:

我在配置类中创建了一个 bean,如下所示:

在 FoodConfig.java 中

@Bean
@Lazy
@Scope("prototype")
public FoodService foodservice(String item, String count){...}

在 FoodService 类中,我需要访问 FoodConfig。所以我自动装配了 FoodConfig。

abstract class AbstractFoodService{
    @Autowired
    FoodConfig foodConfig;
    String someParam;

    public AbstractFoodService(){
         this.someParam = foodConfig.getParam()
    }
}

我在尝试从我的 FoodServiceTest 类访问 AbstractFoodService 类中的 someParam 时遇到 Nullpointer 异常。

但是,如果我在 AbstractFoodServiceClass 的构造函数中注入 FoodConfig,它就可以工作。

这行得通

 public AbstractFoodService(FoodConfig foodConfig){
             this.someParam = foodConfig.getParam();
 }

我不能在使用 Java 配置创建的 bean 中自动装配其他依赖项吗?

谢谢, 苏达

【问题讨论】:

    标签: spring-boot


    【解决方案1】:

    在第一种情况下,您使用 @Autowired 注释通过 setter 注入进行自动装配。由于 setter 注入是在对象创建后完成的,因此您将无法访问它。抛出 NullPointer 是因为您在默认构造函数中访问 FoodConfig,但当时未注入 FoodConfig。

    如果您想使用 setter 注入而不是构造函数,那么您将无法在构造函数中访问它们。您可以在方法中访问它。

    Setter 注入

    abstract class AbstractFoodService{
        @Autowired
        FoodConfig foodConfig;    //Setter Injection 
        String someParam;
    
        public AbstractFoodService(){
             this.someParam = foodConfig.getParam()  //foodConfig is null due to setter injection
        }
    }
    

    构造函数注入

    public AbstractFoodService(FoodConfig foodConfig){
                 this.someParam = foodConfig.getParam();
     }
    

    【讨论】:

      【解决方案2】:

      @Gaurav Srivastav 的回答绝对正确。

      我正在添加一些关于 Setter 注入和构造函数注入的额外点:

      我们通常建议人们对所有强制协作者使用构造函数注入,对所有其他属性使用 setter 注入。同样,构造函数注入确保所有强制属性都已满足,并且根本不可能实例化处于无效状态的对象(未传递其协作者)。换句话说,当使用构造函数注入时,您不必使用专用机制来确保设置所需的属性(除了普通的 Java 机制)。

      还有,

      使用构造函数注入时,所有必需的依赖项都应通过构造函数提供,因为不应该有任何设置器,以便稍后注入它们。所以该实例具有所有必需的依赖项! 使用 Setter 注入,创建实例可能存在,但没有所有必需的依赖项(因为它们没有通过 setter 设置)。用户可以在不设置所需依赖项的情况下使用该对象。

      更多信息查看thisthis问题。

      谢谢:)

      【讨论】:

        猜你喜欢
        • 2011-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-02
        • 2020-09-09
        • 2018-06-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多