我在配置类中创建了一个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()
}
}我得到一个Null指针异常,试图从我的someParam类访问AbstractFoodService类中的FoodServiceTest。
但是,如果我在FoodConfig的构造函数中注入AbstractFoodServiceClass,它就能工作。
这行得通
public AbstractFoodService(FoodConfig foodConfig){
this.someParam = foodConfig.getParam();
}我不能在使用Java配置创建的bean中自动创建其他依赖项吗?
谢谢你,苏达
发布于 2018-07-17 02:55:33
在第一种情况下,您使用的是通过setter注入的自动装配,使用的是@Autowired注解。由于setter注入是在创建对象之后完成的,所以您将无法访问该对象。引发NullPointer是因为您在默认构造函数中访问FoodConfig,但此时没有注入FoodConfig。
如果您想使用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();
}发布于 2018-07-17 04:44:39
绝对正确的回答@Gaurav Sri瓦斯by。
我要添加一些关于Setter注入和Constructor注入的额外要点:
我们通常建议人们对所有强制协作者使用构造函数注入,对于所有其他属性使用setter注入。同样,构造函数注入确保满足所有强制属性,而且不可能以无效状态实例化一个对象(没有传递它的协作者)。换句话说,在使用构造函数注入时,您不必使用专用机制来确保设置所需的属性(普通Java机制除外)。
而且,
当使用constructor注入时,所有必需的依赖项都应该通过构造函数提供,因为以后不应该有任何setter来注入它们。因此,实例具有所有必需的依赖关系!使用Setter注入,创建实例可能在那里,但没有所有必需的依赖项(因为它们尚未通过setter设置)。用户可以在不设置所需依赖项的情况下使用该对象。
谢谢:)
https://stackoverflow.com/questions/51372437
复制相似问题