当前位置: 首页 > 知识库问答 >
问题:

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

田翰林
2023-03-14

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

在FoodConfig.java

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

在食品服务课程中,我需要访问食品配置。所以我自动连接了食品配置。

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中的其他依赖项吗?

谢谢,苏达

共有2个答案

郤玉书
2023-03-14

斯里瓦斯塔夫@Gaurav绝对正确的答案。

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

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

而且,

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

更多信息查看这个和这个问题。

谢谢:)

席兴朝
2023-03-14

在第一种情况下,您使用@Autowired注释通过 setter 注入来使用自动布线。由于 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();
 }
 类似资料:
  • 我有一个非常简单的Spring Boot测试应用程序。 它只有一个Dog类和一个@SpringBootApplication注释的类。我创建了两个豆子的狗和一切运行的预期。 产出: 但是,现在我向Dog类添加了@Component注释,希望现在得到三个类型为Dog的bean,如果我用另一个CommandLineRunner打印所有bean,就会出现这种情况: 似乎@component bean已经

  • 我正在使用Swing和Spring创建一个金融应用程序。在应用程序的一部分中,我有一个,其中包含应用程序中每个的。单击时,我希望在中显示类型的。这都是在下面的控制器中执行的。 会为每个点击更改,因此我将设置为一个原型bean,因此我将为每个帐户接收一个新实例。为了使原型作用域工作,我需要使用。以下是代码: 您将注意到我试图自动连接类型的bean。但是,该bean没有正确地自动连接,它是空的。以下是

  • 我是Spring的新手。我正面临Spring-Boot的问题。我正在尝试将外部配置文件中的字段自动装配到自动装配的bean中。我有以下类 应用程序。Java语言 AppConfig。Java语言 服务接口 服务1 我无法在App类的postconstruct方法中显示服务名称变量。我这样做对吗?

  • 我有一个config类,我在其中创建了一个bean,在xml文件中声明的另一个bean中使用这个bean。当我试图从xml定义的bean中使用它时,它会抛出一个NPE,因为它从来没有自动连线过。我已经扫描了我要自动生成配置bean的包,但即使这样,也没有得到它。 我使用的是Spring4.3.26。不使用Springboot。

  • 问题内容: 背景: 我有一个Spring 2.5 / Java / Tomcat应用程序。下面的bean在整个应用程序中的许多地方都使用过 以下是新的bean: 第一个bean的配置如下(包含了软件包中的所有bean) 第二个(新)bean是单独配置的 启动服务器时,这(当然)会导致异常: 从试图像这样自动装配bean的类中 因为有两个bean实现相同的接口。 问题: 是否可以配置Bean,以便

  • 我有一个spring 2.5/Java/Tomcat应用程序。下面有一个bean,在整个应用程序的许多地方都使用了这个bean 和以下新bean: 第一个bean是这样配置的(包中的所有bean都包含在内) 第二个(新的)bean是单独配置的 这会导致(当然)启动服务器时出现异常: 嵌套异常为org.springframework.beans.factory.NoSuchBeanDefinitio