首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Spring:在另一个bean中声明的静态bean不会在Java上初始化

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

Stack Overflow用户
提问于 2015-10-29 19:31:15
回答 2查看 765关注 0票数 0

我有一个简单的Spring引导应用程序,它包含以下类:

类A,它使用静态方法将B类声明为bean

代码语言:javascript
运行
复制
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类

代码语言:javascript
运行
复制
public class ClassB {
    @PostConstruct
    protected void postConstruct() {
        System.out.println("Class B initialized!");
    }
}

和我的Spring应用程序类的入口点

代码语言:javascript
运行
复制
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

我的问题是,我希望创建ClassAClassB bean,只将ClassA显式地定义为bean。如果我使用XML配置执行此操作,如:

代码语言:javascript
运行
复制
<?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类的实例。程序输出是:

代码语言:javascript
运行
复制
Class A initialized! Hello from XML Config!
Class B initialized!

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

代码语言:javascript
运行
复制
@Bean
public ClassA classA() {
    return new ClassA("Hello from Java Config!");
}

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

代码语言:javascript
运行
复制
Class A initialized! Hello from Java Config!

我的问题是,如何获得与Java配置相同的XML配置行为。

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

EN

回答 2

Stack Overflow用户

发布于 2015-10-29 21:57:51

一种选择是汇总:

代码语言:javascript
运行
复制
 @Bean
 public ClassB classB() {
    return ClassA.classB();
 }

在您的应用程序类的末尾。

代码语言:javascript
运行
复制
@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();
    }
}

结果是:

代码语言:javascript
运行
复制
Class A initialized! Hello from Java Config!
Class B initialized!
票数 0
EN

Stack Overflow用户

发布于 2015-10-29 22:14:44

您正在使用气馁模式。 Use @Configuration声明类B。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33423067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档