![6391a3546c2127e436708614aba36c87.png](https://img-blog.csdnimg.cn/img_convert/6391a3546c2127e436708614aba36c87.png)
对于Spring Bean 的初始化归纳了下,主要可以归纳一下三种方式
- @PostConstruct 标注方法
- 自定义初始化方法
- 实现 initializingBean 接口的afterPropertiesSet()方法
对JDK比较敏感的朋友应该知道@PostConstruct这种标注方法。是从JDK1.6开始引入的
@Documented@Retention (RUNTIME)@Target(METHOD)public @interface PostConstruct {}
案例
一、@PostConstruct 标注方法实现
public interface UserFactory { default User createUser() { return User.createUser(); }}
public class DefaultUserFactory implements UserFactory{ // 1. 基于 @PostConstruct 注解 @PostConstruct public void init() { System.out.println("@PostConstruct : UserFactory 初始化中..."); }}
简单进行容器创建->装置配置->启动应用上下文..依赖查找Bean
@Configurablepublic class BeanInitializationDemo { public static void main(String[] args) { // 创建 BeanFactory 容器 AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(); // 注册 Configuration Class(配置类) applicationContext.register(BeanInitializationDemo.class); // 启动 Spring 应用上下文 applicationContext.refresh(); // 非延迟初始化在 Spring 应用上下文启动完成后,被初始化 System.out.println("Spring 应用上下文已启动..."); // 依赖查找 UserFactory UserFactory userFactory = applicationContext.getBean(UserFactory.class); System.out.println(userFactory); System.out.println("Spring 应用上下文准备关闭..."); // 关闭 Spring 应用上下文 applicationContext.close(); System.out.println("Spring 应用上下文已关闭..."); } @Bean public UserFactory userFactory() { return new DefaultUserFactory(); }}
![63422457b64029dc6bac24c409597081.png](https://img-blog.csdnimg.cn/img_convert/63422457b64029dc6bac24c409597081.png)
二、自定义初始化方法
自定义初始化方法大致可分为三种实现
-
- XML 配置:
- Java 注解:@Bean(initMethod=”init”)
- Java API:AbstractBeanDefinition#setInitMethodName(String)
这里简单以Java 注解方法实现为案例
![d6f0daf84b138066f7fcb33a79e44e43.png](https://img-blog.csdnimg.cn/img_convert/d6f0daf84b138066f7fcb33a79e44e43.png)
Java 注解自定义实现
![e2390e81fabcbb0c596d1e9d0929774f.png](https://img-blog.csdnimg.cn/img_convert/e2390e81fabcbb0c596d1e9d0929774f.png)
![1fc47a49237e7d812a0eafe4e8fa1f66.png](https://img-blog.csdnimg.cn/img_convert/1fc47a49237e7d812a0eafe4e8fa1f66.png)
三、实现 initializingBean 接口的afterPropertiesSet()方法
![993a221704b13c70687526c9e1df81f4.png](https://img-blog.csdnimg.cn/img_convert/993a221704b13c70687526c9e1df81f4.png)
![91e944dd59c581a95a6710495d2d8cf7.png](https://img-blog.csdnimg.cn/img_convert/91e944dd59c581a95a6710495d2d8cf7.png)
归纳
上面三种方式案例分别介绍了PostConstruct、initializingBean以及自定义Bean初始化的方法;从执行结果可以看出,他们的执行顺序是有一定的要求的。PostConstruct在前,initializingBean 在后,最后才是我们自定义的方法
![7b3a7028939ec08f73c616baa8df8a53.png](https://img-blog.csdnimg.cn/img_convert/7b3a7028939ec08f73c616baa8df8a53.png)
![6455ab32c2b2c8a236d9558f87995d88.png](https://img-blog.csdnimg.cn/img_convert/6455ab32c2b2c8a236d9558f87995d88.png)
分享、点赞、在看,给个三连击呗!