Spring:在另一个bean中声明的静态bean不会在Java Config上初始化

时间:2015-10-29 19:31:16

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

我有一个简单的Spring启动应用程序,包含以下类:

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>

并使用Application@ImportResource("classpath:applicationContext.xml")类上导入它.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没有默认构造函数

2 个答案:

答案 0 :(得分:0)

选项是聚合:

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

在Application类的末尾。

@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!

答案 1 :(得分:0)

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