初始化Spring Bean:Bean初始化有哪些方式?

时间:2022-07-28
本文章向大家介绍初始化Spring Bean:Bean初始化有哪些方式?,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

对于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