@Bean可以配置bean自动连接其他bean吗?

时间:2018-07-17 02:32:57

标签: spring-boot

我在如下配置类中创建一个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()
    }
}

我收到一个Nullpointer异常,试图从我的FoodServiceTest类访问AbstractFoodService类中的someParam。

但是,如果我将FoodConfig注入AbstractFoodServiceClass的构造函数中,它将起作用。

这有效

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

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

谢谢, Sudha

2 个答案:

答案 0 :(得分: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();
 }

答案 1 :(得分:0)

@Gaurav Srivastav的回答绝对正确。

我要添加一些关于Setter注入和构造器注入的要点:

  

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

还有

  

在使用构造函数注入时,应通过构造函数提供所有必需的依赖项,因为不应有任何setter以便以后注入它们。因此,实例具有所有必需的依赖项!   使用Setter Injection,可能会在其中创建实例,但没有所有必需的依赖项(因为尚未通过setter进行设置)。用户无需设置所需的依赖关系即可使用该对象。

更多信息查看thisthis问题。

谢谢:)