【发布时间】: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 来创建 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 没有默认构造函数。
【问题讨论】:
-
你为什么要这样做?
-
问题是,在我的情况下,ClassA 和 ClassB 来自外部依赖项,因此我无法触及它们。我只能更改我的配置,我正在尝试从旧的 XML 配置切换到完整的 Java 配置。
-
由于方法是静态的,你可以在你的应用程序类中使用'@Bean'注解来调用它,例如
@Bean public static ClassA.ClassB classB() { return new ClassA.ClassB(); }
标签: java spring spring-mvc spring-boot spring-bean