我在如下配置类中创建一个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
答案 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进行设置)。用户无需设置所需的依赖关系即可使用该对象。
谢谢:)