Spring 中,@Configuration 类 Bean 与 @Controller/@Service 这类 Bean 注册在 IOC 容器中是否在两个阶段?能否安排一个 ApplicationListenner 监听这两者之间的事件?

2020-10-30 09:40:54 +08:00
 Newyorkcity

情景是这样的

我有一个工具类,依赖于一个 @Configuration 类的 Bean 去算出一个字段的值。

public class KeyHolder implements ApplicationListener<?> {

    private volatile static String key = null;

    public static String getKey() {
        return Objects.requireNonNull(key);
    }

    @Override
    public void onApplicationEvent(? event) {
        final Options options = event.getApplicationContext().getBean(Options.class);
        key =  calculateBy(options);
    }

然后这个 getKey() 方法会被 @Controller/@Service 这类 Bean 在初始化时调用,因此在所有 Bean 的初始化都完成后才发布的事件如 ApplicationStartedEvent,ApplicationReadyEvent 应该都不行。不知道有没有事件是正好在两类 Bean 初始化阶段之间的。

谢谢

1492 次点击
所在节点    Java
3 条回复
fdgdbr
2020-10-30 10:06:01 +08:00
把 key = calculateBy(options)放到 PostConstruct 注解的方法里面,然后用 Order 注解规定 Bean 的初始化顺序,不知道这样行不行
Newyorkcity
2020-10-30 10:18:28 +08:00
@fdgdbr 没太理解,你的意思是干脆把 KeyHolder 也弄成一个普通的 Bean,然后通过规定 Bean 或者依赖关系确保这个 Bean 首先加载?好像也是个好办法
fdgdbr
2020-10-30 16:35:52 +08:00
@Newyorkcity 这跟是不是普通 bean 没关系,只要是 bean 就可以规定初始化顺序的把

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/720028

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX