0
点赞
收藏
分享

微信扫一扫

SpringBoot中资源初始化加载的几种方式

烟中雯城 2021-09-25 阅读 66

一、问题

在平时的业务模块开发过程中,难免会需要做一些全局的任务、缓存、线程等等的初始化工作,那么如何解决这个问题呢?方法有多种,但具体又要怎么选择呢?

二、资源初始化

1.既然要做资源的初始化,那么就需要了解一下springboot启动过程(这里大体说下启动过程,详细:https://www.cnblogs.com/dennyzhangdd/p/8028950.html


按照前面的分析,Spring-boot容器启动流程总体可划分为2部分:

执行注解:扫描指定范围下的bean、载入自动配置类对应的bean加载到IOC容器。
man方法中具体SpringAppliocation.run(),全流程贯穿SpringApplicationEvent(经典的spring事件驱动模型),有6个子类:
  • ApplicationFailedEvent.class
  • ApplicationPreparedEvent.class
  • ApplicationReadyEvent.class
  • ApplicationStartedEvent.class
  • ApplicationStartingEvent.class
  • SpringApplicationEvent.class
2、CommandLineRunner和ApplicationRunner
@Component
@Order(1)
public class MyCommandLineRunner implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        System.out.println("...init resources by implements CommandLineRunner");
    }
}

@Component
@Order(2)
public class MyApplicationRunner implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments applicationArguments) throws Exception {
        System.out.println("...init resources by implements ApplicationRunner");
    }
}
3、@PostConstruct
@Component
public Class AAA {    
    @Autowired    
    private BBB b;   

    public AAA() {        
        System.out.println("此时b还未被注入: b = " + b);    
    }    
    @PostConstruct    
    private void init() {        
        System.out.println("此时b已经被注入: b = " + b);    
    }
}
4、InitializingBean
public class InitSequenceBean implements InitializingBean {   
    
    public InitSequenceBean() {   
       System.out.println("InitSequenceBean: constructor");   
    }   
      
    @PostConstruct  
    public void postConstruct() {   
       System.out.println("InitSequenceBean: postConstruct");   
    }   
      
    public void initMethod() {   
       System.out.println("InitSequenceBean: init-method");   
    }   
      
    @Override  
    public void afterPropertiesSet() throws Exception {   
       System.out.println("InitSequenceBean: afterPropertiesSet");   
    }   
}
5、ApplicationListener
@Component
public class DataSourceInitListener implements ApplicationListener<ContextRefreshedEvent> {//ContextRefreshedEvent为启动事件
 
    private static final Logger LOGGER = LoggerFactory.getLogger(DataSourceInitListener.class);
 
    @Autowired
    private SystemConfigService systemConfigService;
    @Autowired
    private ItemService itemService;
    @Autowired
    private SystemResultService systemResultService;
 
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        if(event.getApplicationContext().getParent() == null) {//判断是否执行过,执行过则不再执行
            LOGGER.info("初始化systemConfig数据");
            systemConfigService.initConfig();
            LOGGER.info("初始化返回消息数据");
            systemResultService.initResult();
            LOGGER.info("系统初始化结束...........");
        }
    }
 
}

全文引用自https://www.cnblogs.com/cnndevelop/p/12064645.html

举报

相关推荐

0 条评论