SpringBoot 启动时让方法自动执行的几种实现方式
参考网址:
https://mp.weixin.qq.com/s/tXm4GqUPyhkFHJeAMKmiqw
- 1.实现ServletContextAware接口并重写其setServletContext方法
- 2.实现ServletContextListener接口
- 3.将要执行的方法所在的类交个spring容器扫描(@Component),并且在要执行的方法上添加@PostConstruct注解或者静态代码块执行
- 4.实现ApplicationRunner接口
1.实现ServletContextAware接口并重写其setServletContext方法
package com.shaoming.myclass;
import org.springframework.stereotype.Component;
import org.springframework.web.context.ServletContextAware;
import javax.servlet.ServletContext;
/**
* @author shaoming
* @Date: 2021/3/3 17:55
* @Description:
*/
@Component
public class TestStarted implements ServletContextAware {
/**
* 在填充普通bean属性之后但在初始化之前调用
* 类似于initializingbean的afterpropertiesset或自定义init方法的回调
*
*/
@Override
public void setServletContext(ServletContext servletContext) {
System.out.println("setServletContext方法");
}
}
注意:该方法会在填充完普通Bean的属性,但是还没有进行Bean的初始化之前执行
2.实现ServletContextListener接口
package com.shaoming.myclass;
import org.springframework.stereotype.Component;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/**
* @author shaoming
* @Date: 2021/3/3 20:21
* @Description:
*/
@Component
public class MyServletContextListener implements ServletContextListener {
/**
* 在填充普通bean属性之后但在初始化之前调用
* 类似于initializingbean的afterpropertiesset或自定义init方法的回调
*
*/
@Override
public void contextInitialized(ServletContextEvent sce) {
//ServletContext servletContext = sce.getServletContext();
System.out.println("执行contextInitialized方法");
}
}
3.将要执行的方法所在的类交个spring容器扫描(@Component),并且在要执行的方法上添加@PostConstruct注解或者静态代码块执行
package com.shaoming.myclass;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
/**
* @author shaoming
* @Date: 2021/3/3 20:27
* @Description:
*/
@Component
public class Test2 {
//静态代码块会在依赖注入后自动执行,并优先执行
static {
System.out.println("---static--");
}
/**
* @Postcontruct’在依赖注入完成后自动调用
*/
@PostConstruct
public static void haha() {
System.out.println("@Postcontruct’在依赖注入完成后自动调用");
}
}
4.实现ApplicationRunner接口
package com.shaoming.myclass;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
/**
* @author shaoming
* @Date: 2021/3/3 20:28
* @Description:
*/
@Component
public class MyApplicationRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("ApplicationRunner的run方法");
}
}
测试方法执行的顺序
控制台打印
执行contextInitialized方法
---static--
@Postcontruct’在依赖注入完成后自动调用
setServletContext方法
ApplicationRunner的run方法