首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@Bean配置的bean可以自动启用其他bean吗?

@Bean配置的bean可以自动启用其他bean吗?
EN

Stack Overflow用户
提问于 2018-07-17 02:32:57
回答 2查看 63关注 0票数 0

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

在FoodConfig.java中

代码语言:javascript
复制
@Bean
@Lazy
@Scope("prototype")
public FoodService foodservice(String item, String count){...}

在FoodService类中,我需要访问FoodConfig。所以我自动给FoodConfig打电话。

代码语言:javascript
复制
abstract class AbstractFoodService{
    @Autowired
    FoodConfig foodConfig;
    String someParam;

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

我得到一个Null指针异常,试图从我的someParam类访问AbstractFoodService类中的FoodServiceTest。

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

这行得通

代码语言:javascript
复制
 public AbstractFoodService(FoodConfig foodConfig){
             this.someParam = foodConfig.getParam();
 }

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

谢谢你,苏达

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-17 02:55:33

在第一种情况下,您使用的是通过setter注入的自动装配,使用的是@Autowired注解。由于setter注入是在创建对象之后完成的,所以您将无法访问该对象。引发NullPointer是因为您在默认构造函数中访问FoodConfig,但此时没有注入FoodConfig。

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

设置器注入

代码语言:javascript
复制
abstract class AbstractFoodService{
    @Autowired
    FoodConfig foodConfig;    //Setter Injection 
    String someParam;

    public AbstractFoodService(){
         this.someParam = foodConfig.getParam()  //foodConfig is null due to setter injection
    }
}

构造器注入

代码语言:javascript
复制
public AbstractFoodService(FoodConfig foodConfig){
             this.someParam = foodConfig.getParam();
 }
票数 1
EN

Stack Overflow用户

发布于 2018-07-17 04:44:39

绝对正确的回答@Gaurav Sri瓦斯by。

我要添加一些关于Setter注入和Constructor注入的额外要点:

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

而且,

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

更多信息查看thisthis问题。

谢谢:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51372437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档