小鸡爪了解Spring Bean初始化记录

152 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情

Bean 初始化(Initialization)

版本

<spring.version>5.2.2.RELEASE</spring.version>

准备

@Configuration
public class BeanInitDemo {

    public static void main(String[] args) {
        //创建 BeanFactory 容器
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
        //注册 Configuration Class(配置类)
        applicationContext.register(BeanInitDemo.class);
        //启动 Spring 应用上下文
        applicationContext.refresh();
        //依赖查找 Person
        Person person = applicationContext.getBean(Person.class);
        //关闭 Spring 应用上下文
        applicationContext.close();
    }

    @Bean
    public Person person(){
        return new Person();
    }
}

one

@PostConstruct 标注方法

public class Person {
    private String name;
    private Integer age;

    @PostConstruct
    public void init(){
        System.out.println("@PostConstruct标注方法初始化");
    }

    //省略setter、getter
}

two

实现 InitializingBean 接口的 afterPropertiesSet() 方法

public class Person implements InitializingBean
{
    private String name;
    private Integer age;

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("实现 InitializingBean 接口的 afterPropertiesSet() 方法");
    }

    //省略setter、getter
}

three

自定义初始化方法:

  • XML 配置:<bean init-method=”init” ... />
  • Java 注解:@Bean(initMethod=”init”)
  • Java API:AbstractBeanDefinition#setInitMethodName(String)
public class Person implements InitializingBean
{
    private String name;
    private Integer age;

    public void initPerson(){
        System.out.println("自定义初始化方法:Java 注解:@Bean(initMethod=”init”)");
    }

    //省略setter、getter
}
@Bean(initMethod = "initPerson")
public Person person(){
    return new Person();
}

我们再来看看API:AbstractBeanDefinition

image.png

无论是XML 配置 还是 @Bean(initMethod=”init”)注解,其实都到API这个字段来

我们来打个断点试验一下

image.png

然后再设置个condition,拦截 initMethodName = initPerson

image.png

我们鼠标悬置再断点的这个小红点上右键就可以出现这个界面了,然后输入我们的拦截条件,然后点Done,

image.png

再走下去

image.png

可以证明 无论是XML 配置 还是 @Bean(initMethod=”init”)注解,其实都到API这个字段来

other

那这3种方式如果同时存在执行顺序的怎么样的呢? 我们来试试

image.png

end

溜了