我有一个简单的Spring引导应用程序,包含以下类:
Class A,它将Class 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来创建ClassA
和ClassB
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没有默认构造函数。
一个选项是聚合的:
@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!
您正在使用不鼓励的lite模式声明类B。使用@Configuration
。