对于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
@Configurable
public 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();
}
}
二、自定义初始化方法
自定义初始化方法大致可分为三种实现
XML 配置:<bean init-method=”init” ... />
Java 注解:@Bean(initMethod=”init”)
Java API:AbstractBeanDefinition#setInitMethodName(String)
这里简单以Java 注解方法实现为案例
Java 注解自定义实现
三、实现 initializingBean 接口的afterPropertiesSet()方法
归纳
上面三种方式案例分别介绍了PostConstruct、initializingBean以及自定义Bean初始化的方法;从执行结果可以看出,他们的执行顺序是有一定的要求的。PostConstruct在前,initializingBean 在后,最后才是我们自定义的方法
源码地址:https://gitee.com/iByteCoding/thinking-in-spring