【问题标题】:Spring: Static bean declared inside another bean does not get initialized on Java ConfigSpring:在另一个 bean 中声明的静态 bean 未在 Java Config 上初始化
【发布时间】:2015-10-29 19:31:15
【问题描述】:

我有一个简单的 Spring Boot 应用程序,其中包含以下类:

A 类,它将 B 类声明为带有 静态方法的 bean:

public class ClassA {
    private String something;

    public ClassA(String something) {
        this.something = something;
    }

    @PostConstruct
    protected void postConstruct() {
        System.out.println("Class A initialized! " + something);
    }

    @Bean
    public static ClassB classB() {
        return new ClassB();
    }
}

B 类

public class ClassB {
    @PostConstruct
    protected void postConstruct() {
        System.out.println("Class B initialized!");
    }
}

以及我的Spring Boot应用类的入口点:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

我的问题是,我想通过仅将 ClassA 显式定义为 bean 来创建 ClassAClassB bean。如果我使用 XML 配置执行此操作,例如:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean class="com.mypackage.ClassA">
        <constructor-arg name="something" value="Hello from XML Config!"/>
    </bean>
</beans>

并使用@ImportResource("classpath:applicationContext.xml")将其导入Application类Spring创建类A并处理类A上的@Bean注释并创建类B的实例。程序输出为:

Class A initialized! Hello from XML Config!
Class B initialized!

但是当我尝试使用 Java 配置做同样的事情时,在 Application 类中定义 A 的 bean 如下:

@Bean
public ClassA classA() {
    return new ClassA("Hello from Java Config!");
}

然后B的实例没有被创建,所以程序输出是:

Class A initialized! Hello from Java Config!

我的问题是,我怎样才能获得与 Java 配置相同的 XML 配置行为。

注意:我在应用程序配置上尝试了@Import(ClassA.class),但在创建 B 的 bean 后失败,因为它尝试创建实例但 A 没有默认构造函数

【问题讨论】:

  • 你为什么要这样做?
  • 问题是,在我的情况下,ClassA 和 ClassB 来自外部依赖项,因此我无法触及它们。我只能更改我的配置,我正在尝试从旧的 XML 配置切换到完整的 Java 配置。
  • 由于方法是静态的,你可以在你的应用程序类中使用'@Bean'注解来调用它,例如@Bean public static ClassA.ClassB classB() { return new ClassA.ClassB(); }

标签: java spring spring-mvc spring-boot spring-bean


【解决方案1】:

一个选项是聚合的:

 @Bean
 public ClassB classB() {
    return ClassA.classB();
 }

在您的应用程序类结束时。

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public ClassA classA() {
        return new ClassA("Hello from Java Config!");
    }

    @Bean
    public ClassB classB() {
        return ClassA.classB();
    }
}

结果是:

Class A initialized! Hello from Java Config!
Class B initialized!

【讨论】:

    【解决方案2】:

    您使用discouraged lite mode. 使用@Configuration 声明B 类。

    【讨论】:

      猜你喜欢
      • 2012-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多