Spring 启动时加载

本文介绍了SpringMVC和Spring Boot应用启动时的组件加载顺序,包括实现特定接口如ApplicationContextAware、ServletContextAware等的方法及其执行时机。同时,探讨了如何通过实现CommandLineRunner接口或ApplicationListener接口来自定义启动时的操作。
摘要由CSDN通过智能技术生成

先看看Spring MVC启动时加载 

        SpringMVC的应用中,要实现类似的功能,主要是通过实现下面这些接口(任选一,至少一个即可)

一.ApplicationContextAware接口

Java代码  
  1. package org.springframework.context;  
  2.    
  3. import org.springframework.beans.BeansException;  
  4. import org.springframework.beans.factory.Aware;  
  5. import org.springframework.context.ApplicationContext;  
  6.    
  7. public interface ApplicationContextAware extends Aware {  
  8.     void setApplicationContext(ApplicationContext var1) throws BeansException;  
  9. }  

 

二.ServletContextAware 接口

Java代码  
  1. package org.springframework.web.context;  
  2.    
  3. import javax.servlet.ServletContext;  
  4. import org.springframework.beans.factory.Aware;  
  5.    
  6. public interface ServletContextAware extends Aware {  
  7.     void setServletContext(ServletContext var1);  
  8. }  

 

三.InitializingBean接口

Java代码  
  1. package org.springframework.beans.factory;  
  2.    
  3. public interface InitializingBean {  
  4.     void afterPropertiesSet() throws Exception;  
  5. }  

 

四.ApplicationListener<ApplicationEvent> 接口

Java代码  
  1. package org.springframework.context;  
  2.    
  3. import java.util.EventListener;  
  4. import org.springframework.context.ApplicationEvent;  
  5.    
  6. public interface ApplicationListener<E extends ApplicationEvent> extends EventListener {  
  7.     void onApplicationEvent(E var1);  
  8. }  


看看他们的启动顺序: 

Java代码  
  1. package com.bijian.study.controller;  
  2.   
  3. import javax.servlet.ServletContext;  
  4.   
  5. import org.apache.logging.log4j.LogManager;  
  6. import org.apache.logging.log4j.Logger;  
  7. import org.springframework.beans.BeansException;  
  8. import org.springframework.beans.factory.InitializingBean;  
  9. import org.springframework.context.ApplicationContext;  
  10. import org.springframework.context.ApplicationContextAware;  
  11. import org.springframework.context.ApplicationListener;  
  12. import org.springframework.context.event.ContextRefreshedEvent;  
  13. import org.springframework.stereotype.Component;  
  14. import org.springframework.web.context.ServletContextAware;  
  15.    
  16. @Component  
  17. public class StartupListener implements ApplicationContextAware, ServletContextAware,  
  18.         InitializingBean, ApplicationListener<ContextRefreshedEvent> {  
  19.    
  20.     private Logger logger = LogManager.getLogger();  
  21.       
  22.     @Override  
  23.     public void setApplicationContext(ApplicationContext ctx) throws BeansException {  
  24.         logger.info("1 => StartupListener.setApplicationContext");  
  25.     }  
  26.    
  27.     @Override  
  28.     public void setServletContext(ServletContext context) {  
  29.         logger.info("2 => StartupListener.setServletContext");  
  30.     }  
  31.    
  32.     @Override  
  33.     public void afterPropertiesSet() throws Exception {  
  34.         logger.info("3 => StartupListener.afterPropertiesSet");  
  35.     }  
  36.    
  37.     @Override  
  38.     public void onApplicationEvent(ContextRefreshedEvent evt) {  
  39.         logger.info("4.1 => MyApplicationListener.onApplicationEvent");  
  40.         if (evt.getApplicationContext().getParent() == null) {  
  41.             logger.info("4.2 => MyApplicationListener.onApplicationEvent");  
  42.         }  
  43.     }  
  44. }  

服务启动时,输出的顺序如下:

Text代码  
  1. 22:54:44.433 [localhost-startStop-1] INFO  com.bijian.study.controller.StartupListener - 1 => StartupListener.setApplicationContext  
  2. 22:54:44.435 [localhost-startStop-1] INFO  com.bijian.study.controller.StartupListener - 2 => StartupListener.setServletContext  
  3. 22:54:44.435 [localhost-startStop-1] INFO  com.bijian.study.controller.StartupListener - 3 => StartupListener.afterPropertiesSet  
  4. 22:54:44.931 [localhost-startStop-1] INFO  com.bijian.study.controller.StartupListener - 4.1 => MyApplicationListener.onApplicationEvent  
  5. 22:54:44.931 [localhost-startStop-1] INFO  com.bijian.study.controller.StartupListener - 4.2 => MyApplicationListener.onApplicationEvent  

        注意:onApplicationEvent方法会触发多次,初始化这种事情,越早越好,建议在setApplicationContext方法中处理,完整示例见附件。

        此外还有一种方法:写个BEAN,将要执行的操作写在构造函数里,再将这个类配置到XML里,比如配置到SPRING-MVC.XML里  <bean class="com.test.xx"> 自己的类。不过不推荐使用这种方法。



 

再看看Spring-boot 启动时执行加载资源

实现CommandLineRunner接口(可以设置启动顺序)

@Order(value=2)
@Component
public class CommandLineRunnerListenerImpl implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
       // 执行操作
    }
}

  • 可以通过指定@Order的值来控制启动的顺序,值越小表示越先执行
实现ApplicationListener接口
@Component
public class CommandLineRunnerListenerImpl implements ApplicationListener {

    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        // 执行操作
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值