V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
Newyorkcity
V2EX  ›  Java

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

  •  
  •   Newyorkcity · Oct 30, 2020 · 1854 views
    This topic created in 2012 days ago, the information mentioned may be changed or developed.

    情景是这样的

    我有一个工具类,依赖于一个 @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 replies    2020-10-30 16:35:52 +08:00
    fdgdbr
        1
    fdgdbr  
       Oct 30, 2020   ❤️ 1
    把 key = calculateBy(options)放到 PostConstruct 注解的方法里面,然后用 Order 注解规定 Bean 的初始化顺序,不知道这样行不行
    Newyorkcity
        2
    Newyorkcity  
    OP
       Oct 30, 2020
    @fdgdbr 没太理解,你的意思是干脆把 KeyHolder 也弄成一个普通的 Bean,然后通过规定 Bean 或者依赖关系确保这个 Bean 首先加载?好像也是个好办法
    fdgdbr
        3
    fdgdbr  
       Oct 30, 2020
    @Newyorkcity 这跟是不是普通 bean 没关系,只要是 bean 就可以规定初始化顺序的把
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   818 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 19:28 · PVG 03:28 · LAX 12:28 · JFK 15:28
    ♥ Do have faith in what you're doing.