在启动类加上如下代码
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(Application.class);
springApplication.addListeners(new ApplicationStartup());
springApplication.run(args);
}
然后在跟SpringBoot启动类同样路径下新建ApplicationStartup类,实现ApplicationListener<ContextRefreshedEvent>
public class ApplicationStartup implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
// HelloHandler是要启动的类,start是项目一启动就执行的方法,
// 我这里的handler是用于开启多线程,实时接收MQ消息
HelloHandler handler =
contextRefreshedEvent.getApplicationContext().getBean(HelloHandler .class);
handler.start();
}
}
关于ApplicationListener<ContextRefreshedEvent>:
1、在IOC的容器的启动过程,当所有的bean都已经处理完成之后,spring ioc容器会有一个发布事件的动作。
2、从 AbstractApplicationContext 的源码中就可以看出:先有InitializingBean,后有ApplicationListener<ContextRefreshedEvent>。所以当ioc容器加载处理完相应的bean之后,我们可以自定义一些一启动就立即加载的bean。
3、实现方式:让我们的bean实现ApplicationListener接口,这样当发布事件时,[spring]的ioc容器就会以容器的实例对象作为事件源类,并从中找到事件的监听者,此时ApplicationListener接口实例中的onApplicationEvent(E event)方法就会被调用,我们的逻辑代码就会写在此处。这样我们的目的就达到了