3. Spring Boot中的应用程序事件
Spring框架在不同情况下触发不同事件。它还会在启动过程中触发许多事件。我们可以使用这些事件来执行代码,例如,在Spring Boot应用程序启动后,可以使用ApplicationReadyEvent执行代码。
如果我们不需要命令行参数,这是在应用程序启动后执行代码的最佳方法。
@Component public class RunAfterStartup{ @EventListener(ApplicationReadyEvent.class) public void runAfterStartup() { System.out.println("Yaaah, I am running........"); }
输出:
Yaaah, I am running........
春季靴子中最重要的事件是
- ApplicationContextInitializedEvent :在准备ApplicationContext并调用ApplicationContextInitializers之后但在加载bean定义之前触发
- ApplicationPreparedEvent :在加载bean定义后触发
- ApplicationStartedEvent :在刷新上下文之后但在调用命令行和应用程序运行程序之前触发
- ApplicationReadyEvent :在调用任何应用程序和命令行运行程序之后触发
- ApplicationFailedEvent :如果启动时发生异常则触发
可以创建多个ApplicationListeners。可以使用@Order批注或Ordered接口对其进行订购。
该顺序与其他相同类型的ApplicationListener共享,但不与ApplicationRunners或CommandLineRunners共享。
4.方法上的@Postconstruct注解
可以使用@PostConstruct批注标记方法。每当使用此注释标记方法时,将在依赖项注入后立即调用该方法。
@PostConstruct方法链接到特定的类,因此它仅应用于特定于类的代码。每个类只有一个带有postConstruct批注的方法。
@Component public class PostContructImpl { public PostContructImpl() { System.out.println("PostContructImpl Constructor called"); } @PostConstruct public void runAfterObjectCreated() { System.out.println("PostContruct method called"); } }
输出:
PostContructImpl Constructor called postContruct method called
需要注意的是,如果class标记为lazy,则意味着在请求时创建了class。之后,将执行标有@postConstruct批注的方法。
标有postConstruct批注的方法可以具有任何名称,但是不能具有任何参数。它必须是无效的,并且不能是静态的。
请注意,@postConstruct批注是Java EE模块的一部分,在Java 9中被标记为已弃用,在Java 11中已被删除。我们仍然可以通过将java.se.ee添加到应用程序中来使用它。
5. InitializingBean接口
InitializingBean解决方案的工作原理与postConstruct批注完全相似。不必使用注释,我们必须实现InitializingBean接口。然后,我们需要重写afterPropertiesSet()方法。
InitializingBean是org.springframework.beans.factory包的一部分。
@Component public class InitializingBeanImpl implements InitializingBean { public InitializingBeanImpl() { System.out.println("InitializingBeanImpl Constructor called"); } @Override public void afterPropertiesSet() throws Exception { System.out.println("InitializingBeanImpl afterPropertiesSet method called"); } }
您必须考虑如果同时使用@PostConstruct批注和InitializingBean会发生什么。那么在这种情况下,@PostConstruct方法将在InitializingBean的afterPropertiesSet()方法之前调用。
6. @bean批注的init属性
我们可以在@Bean批注中使用initMethod属性提供一种方法。bean初始化后将调用此方法。
initMethod中提供的方法必须为空,并且不能包含任何参数。此方法甚至可以是私有的。
public class BeanInitMethodImpl { public void runAfterObjectCreated() { System.out.println("yooooooooo......... someone called me"); } } @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @Bean(initMethod="runAfterObjectCreated") public BeanInitMethodImpl getFunnyBean() { return new BeanInitMethodImpl(); } }
输出:
yooooooooo......... someone called me
如果您具有同一类的InitializingBean实现和@Bean批注的initMethod属性,则将initMethod之前调用InitializingBean的afterPropertiesSet方法。
结合不同的方法:
最后,有时我们可能需要组合多个选项。然后,它们将按照以下顺序执行:
- 建设者
- 后构造方法
- afterPropertiesSet方法
- Bean初始化方法
- ApplicationStartedEvent
- ApplicationRunner或CommandLineRunner取决于顺序
- ApplicationReadyEvent
快速阅读
- 春季启动应用程序启动后,有多种方法可以运行代码
- 我们可以使用CommandLineRunner或ApplicationRunner接口
- 使用ApplicationRunner接口访问已解析的参数,而不是原始字符串数组
- Spring Boot事件在应用程序启动时执行代码
- 标有@PostConstruct批注的方法在对象初始化后执行
- 对象初始化之后调用InitializingBean接口的afterPropertiesSet()方法
- @Bean批注具有属性“ initMethod”以提供将在bean初始化后调用的方法
相关话题
- Spring Boot项目设置指南