Spring中初始化时执行相关操作

1 应用场景:

在业务中有些特定的需求在初始化的时候就需完成,即启动就执行某些固定的操作,例如数据库的建表,相关配置的更改,相关数据的指定获取等......,这类业务的场景还蛮多的,近期项目中业务就遇到了哈,简单总结一下各种实现方式,方便碰到相关的需求直接用啦!

2 具体实现

(1)静态代码块(java基础):

 静态代码块只要加载该类字节码文件必然会执行代码块中的逻辑,最最优先执行

(2)构造方法(java基础):

 类加载实例化便会执行构造方法中逻辑

(3) 实现ApplicationContextAware接口(Spring):

实现ApplicationContextAware接口,重写setApplicationContext()方法,在Spring容器初始化的时候便会调用该方法,可以利用这个进行相关代码的初始化,这个类可以获取Spring容器中的所有对象和信息

(4) @PostConstruct注解标注方法(javaee):

使用javaee提供的这个注解,在Servlet加载初始化的时候会执行,

(5) 实现InitializingBean接口:

 实现InitializingBean接口,重写afterPropertiesSet()方法,见名知意,就是在bean加载后执行,同下

(6) @Bean注解标注方法,填充初始化参数:

@Bean注解标注方法,填充初始化参数@Bean(initMethod = ""),将当前方法作为初始化方法,同上

(7) 实现ApplicationRunner接口:

实现ApplicationRunner接口重写run(ApplicationArguments args) 方法, Spring的容器初始化完成后会执行该方法,同下

(8) 实现CommandLineRunner接口:

实现CommandLineRunner接口重写 run(String... args) 方法,Spring的容器初始化完成后会执行该方法,同上

(9) SpringBoot的启动类方法中:

SpringBoot的启动类可以执行相关初始化操作(尝试即可)

(10)监控ApplicationEvent事件:

监控ApplicationEvent事件,在Spring容器启动后必然会触发该事件,但是该事件会被多次触发,某些只需要执行一次的操作,使用这个并不可取(看需求啦)

简单总结: 针对于整个服务只需要执行一次的某些操作,推荐使用7,8,9,针对于单个bean的,其余几点修修改改都可以啦

各种实现(9莫有写啦):

@Service
@Slf4j
public class InitServiceDemo implements
        InitializingBean,
        ApplicationContextAware,
        ApplicationRunner,
        CommandLineRunner {
    /**
     * 最最先执行,字节码加载立刻执行,最最优先
     */
    static {
        log.info("静态代码块初始化");
    }

    /**
     * 构造方法,只要加载bean后实例化时候立刻执行
     */
    public InitServiceDemo() {
        log.info("构造方法初始化");
    }

    @PostConstruct
    public void postConstruct() {
        log.info("postConstruct初始化");
    }

    /**
     * bean注入ioc容器时候会自动执行,同下
     */
    @Bean(initMethod = "")
    public void init() {
        log.info("bean init初始化");
    }

    /**
     * 当前bean进行初始化的时候会自动执行,同上
     * @throws Exception
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        log.info("InitializingBean初始化");
    }

    /**
     * 启动即执行
     * @param args
     * @throws Exception
     */
    @Override
    public void run(ApplicationArguments args) throws Exception {
        log.info("ApplicationRunner初始化");

    }

    /**
     * 启动即执行
     * @param args
     * @throws Exception
     */
    @Override
    public void run(String... args) throws Exception {
        log.info("CommandLineRunner初始化");
    }

    /**

     * Spring容器初始化的时候会自动填充上下文对象,这个方法会被调用,
     * 可以利用触发指定的方法执行相关的逻辑
     * @param applicationContext
     * @throws BeansException
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        log.info("ApplicationContextAware 初始化");
    }


    /**
     * 通过监听ApplicationEvent事件触发某个操作,这个方式虽然也能触发相关的操作,
     * 但是每次都会执行,对于某个只需要执行一次的操作并不可取,
     *
     * @param event 只要启动本事件一定会触发
     */
    @EventListener
    public void listeningInit(ApplicationEvent event) {
        log.info("监听ApplicationEvent 进行相关的初始化");
    }

}

 优先顺序(仅供参考):

Spring中初始化时执行相关操作_第1张图片

有莫有人喜欢熊出没滴,想去狗熊岭旅游,组个队啦

你可能感兴趣的:(Spring,spring,java,后端)