开启掘金成长之旅!这是我参与「掘金日新计划 · 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
无论是XML 配置 还是 @Bean(initMethod=”init”)注解,其实都到API这个字段来
我们来打个断点试验一下
然后再设置个condition,拦截 initMethodName = initPerson
我们鼠标悬置再断点的这个小红点上右键就可以出现这个界面了,然后输入我们的拦截条件,然后点Done,
再走下去
可以证明 无论是XML 配置 还是 @Bean(initMethod=”init”)注解,其实都到API这个字段来
other
那这3种方式如果同时存在执行顺序的怎么样的呢? 我们来试试
end
溜了