V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Newyorkcity
V2EX  ›  Java

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

  •  
  •   Newyorkcity · 2020-10-30 09:40:54 +08:00 · 1441 次点击
    这是一个创建于 1280 天前的主题,其中的信息可能已经有所发展或是发生改变。

    情景是这样的

    我有一个工具类,依赖于一个 @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 初始化阶段之间的。

    谢谢

    3 条回复    2020-10-30 16:35:52 +08:00
    fdgdbr
        1
    fdgdbr  
       2020-10-30 10:06:01 +08:00   ❤️ 1
    把 key = calculateBy(options)放到 PostConstruct 注解的方法里面,然后用 Order 注解规定 Bean 的初始化顺序,不知道这样行不行
    Newyorkcity
        2
    Newyorkcity  
    OP
       2020-10-30 10:18:28 +08:00
    @fdgdbr 没太理解,你的意思是干脆把 KeyHolder 也弄成一个普通的 Bean,然后通过规定 Bean 或者依赖关系确保这个 Bean 首先加载?好像也是个好办法
    fdgdbr
        3
    fdgdbr  
       2020-10-30 16:35:52 +08:00
    @Newyorkcity 这跟是不是普通 bean 没关系,只要是 bean 就可以规定初始化顺序的把
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2329 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 12:34 · PVG 20:34 · LAX 05:34 · JFK 08:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.