SpringBoot启动加载之CommandLineRunner接口和@PostConstruct注解的区别

本文介绍了在SpringBoot项目中初始化数据的两种方式:@PostConstruct和CommandLineRunner。@PostConstruct在类加载时执行,适合初始化当前类的数据;CommandLineRunner则在服务启动后执行,适用于全局数据初始化,且支持多个实现类的执行顺序控制。理解两者区别对于优化项目启动性能至关重要。

      在项目中,经常有这样的需求,我们需要在项目启动完立即初始化一些数据(比如缓存等),以便后面调用使用。

1、CommandLineRunner

@Component
public class InitRunner implements CommandLineRunner{

	@Override
	public void run(String... args) throws Exception {
		System.out.println("项目启动后立即执行。。。。。");
	}
}

在这里插入图片描述

1、CommandLineRunner会在服务启动之后被立即执行。
2、CommandLineRunner可以有多个实现类,且多个直接可以用@Order注解确定执行顺序。

 2、 @PostConstruct

@Component
public class Init {

	@PostConstruct
	private void init(){
		System.out.println("PostConstruct注解初始化数据");
	}
}

 在项目还没有启动成功的时候,@PostConstruct已经执行完了,因为@PostConstruct是在Init类注入完成后立马执行的,它并不依赖于项目的启动。

一:@PostConstruct

不是spring提供的而是Java自己的注解。

Java中该注解的说明:@PostConstruct该注解被用来修饰一个非静态的void()方法。
被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct注释用于需要依赖注入完成后才能执行任何初始化的方法上。 在类投入使用之前,必须调用此方法。

在类加载的时候,为当前类初始化一些数据,那么可以使用@PostConstruct注解。

【Servlet中增加了两个影响Servlet生命周期的注解,@PostConstruct和@PreDestroy,这两个注解被用来修饰一个非静态的返回值为void的方法。】

在使用spring框架时,在一个类内,如果有构造器(Constructor ),有@PostConstruct,还有@Autowired,他们的先后执行顺序为Constructor >> @Autowired >> @PostConstruct。

因为一个有声明注解的类文件(必须有声明,这样在项目初始化时候才会注入),在项目启动后,会对对象进行依赖注入,而初始化的动作会依赖于对象,所以假象上看,也类似于项目启动就会执行的操作,因此,我们也可以通过这样的形式,对数据进行初始化。

二:CommandLineRunner

spring boot可以通过CommandLineRunner接口实现启动加载功能,实现CommandLineRunner接口,然后重写run方法,在run方法内编写需要加载的内容。

我们可以写多个类继承CommandLineRunner接口,这些类之间,可以通过@Order(value=1)实现执行的先后顺序。【CommandLineRunner可以有多个,且多个直接可以用@Order(value=1)注解进行排序。】

CommandLineRunner会在服务启动之后被立即执行。

三:比较

@PostConstruct 要比实现CommandLineRunner的类加载的要早:CommandLineRunner 是在项目启动完之后加载。

@PostConstruct更针对性于当前类文件,而CommandLineRunner更服务于整个项目。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值