Spring 和SpringBoot数据的初始化方式总结

上面一篇文章提到了使用spring声明周期相关东西将测试数据进行初始化,然后今天查了一下相关资料,springboot提供了两个接口

CommandLineRunner,ApplicationRunner 这两个接口都是用于初始化,可以对优先级进行配置,在springboot项目启动的时候执行。项目中代码如下:
package com.gysoft.springdatajpa.spring;

import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * @Description   我们可以通过Order注解或者使用Order接口来指定调用顺序,@Order()中的值越小,优先级越高
 * @Author DJZ-WWS
 * @Date 2019/6/14 8:33
 */
@Component
@Order(1)
public class ApplicationCommandLind  implements CommandLineRunner {
    @Override
    public void run(String... strings) throws Exception {
        System.out.println("CommandLineRunner 被执行");
    }
}

ApplicationRunner

package com.gysoft.springdatajpa.spring;

import com.gysoft.springdatajpa.forall.dao.CustomerRepository;
import com.gysoft.springdatajpa.forall.pojo.Customer;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;


/**
 * @Description springboot项目启动 的时候他也会启动
 * @Author DJZ-WWS
 * @Date 2019/6/14 8:31
 */
@Component
public class ApplicationInit   implements ApplicationRunner {
private   Logger logger= Logger.getLogger(ApplicationInit.class);
    @Autowired
    private CustomerRepository repository;
    @Override
    public void run(ApplicationArguments applicationArguments) throws Exception {
        logger.info("开始准备数据,执行的操作如下:" +
                "repository.save(new Customer(\"Jack\", \"Bauer\"));\n" +
                "        repository.save(new Customer(\"Chloe\", \"O'Brian\"));\n" +
                "        repository.save(new Customer(\"Kim\", \"Bauer\"));\n" +
                "        repository.save(new Customer(\"David\", \"Palmer\"));\n" +
                "        repository.save(new Customer(\"Michelle\", \"Dessler\"));\n" +
                "        repository.save(new Customer(\"Bauer\", \"Dessler\"));" );
        repository.save(new Customer("Jack", "Bauer"));
        repository.save(new Customer("Chloe", "O'Brian"));
        repository.save(new Customer("Kim", "Bauer"));
        repository.save(new Customer("David", "Palmer"));
        repository.save(new Customer("Michelle", "Dessler"));
        repository.save(new Customer("Bauer", "Dessler"));
        logger.info("初始化数据成功");
    }
}

这样就不用每次启动服务以后再去访问接口去创建测试数据。

测试的结果如下:

Spring 和SpringBoot数据的初始化方式总结_第1张图片

除了springboot初始化的方式,spring也提供了多种实现初始化的方式。

方式1、实现ApplicationListener接口

package com.gysoft.springdatajpa.spring;

import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

/**
 * @Description
 * @Author DJZ-WWS
 * @Date 2019/6/14 13:37
 */

@Component
public class InitData   implements ApplicationListener {

    @Override
    public void onApplicationEvent(ApplicationEvent applicationEvent) {

        System.out.println("数据初始化了!!!,初始化的方式"+"实现ApplicationListener 接口");
    }
}

方式2、实现InitializingBean 接口

package com.gysoft.springdatajpa.spring;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

/**
 * @Description
 * @Author DJZ-WWS
 * @Date 2019/6/14 13:41
 */
@Component
public class InitDataBean  implements InitializingBean {

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("数据初始化了,初始化的方式"+"实现InitializingBean接口");
    }
}

方式3、使用注解@PostConstruct

package com.gysoft.springdatajpa.spring;

import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;

/**
 * @Description
 * @Author DJZ-WWS
 * @Date 2019/6/14 13:48
 */

@Component
public class InitDataAnnotation {

@PostConstruct
public   void  init(){
    System.out.println("使用注解方式实现数据的初始化。。。。。。。。。。。。。。。");
}

}

上面的测试 结果如下:

Spring 和SpringBoot数据的初始化方式总结_第2张图片

Spring 和SpringBoot数据的初始化方式总结_第3张图片

使用ApplicationListen会存在一个多次初始化的问题,系统会存在两个容器,一个是root application context,另一个就是我们自己的 // projectName-servlet context(作为rootapplication context的子容器),通过下面的方式解决初始化重复出现的问题。

package com.gysoft.springdatajpa.spring;

import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;

/**
 * @Description
 * @Author DJZ-WWS
 * @Date 2019/6/14 13:37
 */

@Component
public class InitData   implements ApplicationListener {


    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        //这个判断是为了解决ApplicationListener这个接口的初始化方式被执行多次的问题,
        // 在web项目里面,系统会存在两个容器,一个是root application context,另一个就是我们自己的
        // projectName-servlet context(作为rootapplication context的子容器)
        if(event.getApplicationContext().getParent()==null){
            System.out.println("数据初始化了!!!,初始化的方式"+"实现ApplicationListener 接口");
        }

    }
}

这样ApplicationListen只会初始化一次。

你可能感兴趣的:(Spring 和SpringBoot数据的初始化方式总结)