一、定义
在业务场景中,有时需要我们在容器启动过程中加载资源,完成数据的初始化或者配置,需要在调用前加载进spring容器过程中去,有以下一些方法来实现
1.定义静态常量,随着类的生命周期加载而提前加载。一般使用较多,这里不做说明
2.实现InitializingBean接口;重写afterPropertiesSet()方法
3.实现CommandLineRunner接口(Spring Boot中使用);容器启动之后,加载实现类的逻辑资源,已达到完成资源初始化的任务
4.@PostConstruct;在具体Bean的实例化过程中执行
二、实现InitializingBean接口
重写afterPropertiesSet()方法,来完成资源的初始化
1.InitializingBean接口
InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候都会执行该方法。
2.使用方法
1)编写一个类引用InitializingBean接口,重写其中的afterPropertiesSet方法,在其中写自己的方法
使用注解@Component或者自己在spring配置文件中装配bean来注入spring容器
可以看到在项目启动过程中就已经执行了TestComponent类中重写的afterPropertiesSet方法
三、Spring boot中实现CommandLineRunner接口
1.Java 文件中配置实现CommandLineRunner接口,重写run方法
@Component
@Slf4j
public class ExampleCommandLineRunner implements CommandLineRunner {
@Autowired
private JedisClusterClient jedisClusterClient;
@Autowired
private UserMapper userMapper;
@Override
public void run(String... args) throws Exception {
User user=userMapper.selectByPrimaryKey(1);
jedisClusterClient.set("test:user",user.toString());
log.info("测试CommandLineRunner初始化加载接口:加载一个user_id=1的用户=[{}]",user,toString());
}
}
2.执行结果
在启动spring过程中加载进来
3.@Order排序
可以使用注解@Order注解,如果想要对加载资源的顺序进行排序
4.结果如下所示:
可以看到:ExampleCommandLineRunner类中的run方法在ExampleCommandLineRunner2的run方法之后执行,因为定义的@Order(value)顺序原因,value越小,优先级越高,注意最小是1,不能低于这个,否则会报错
四、@PostConstruct注解
用于方法上,@PostConstruct注解的方法,会在构造方法之后执行。加载顺序为:Constructor > @Autowired > @PostConstruct > 静态方法,但要注意以下使用方法
特点:
- 只有一个非静态方法能使用此注解
- 被注解的方法不得有任何参数
- 被注解的方法返回值必须为void
- 被注解方法不得抛出已检查异常
- 此方法只会被执行一次
@Component
@Slf4j
public class ExamplePostConstruct {
@Autowired
private JedisClusterClient jedisClusterClient;
@Autowired
private UserMapper userMapper;
@PostConstruct
public void loadUser(){
User user=userMapper.selectByPrimaryKey(3);
jedisClusterClient.set("test:user_id=3",user.toString());
log.info("测试PostConstruct初始化加载接口:加载一个user_id=3的用户=[{}]",user,toString());
}
}
结果展示: