上面一篇文章提到了使用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("初始化数据成功");
}
}
这样就不用每次启动服务以后再去访问接口去创建测试数据。
测试的结果如下:
除了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("使用注解方式实现数据的初始化。。。。。。。。。。。。。。。");
}
}
上面的测试 结果如下:
使用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只会初始化一次。