Bean的生命周期

总览

先来一张全局图

再来一个小demo

结构如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
@Component
public class User implements BeanNameAware , BeanFactoryAware, ApplicationContextAware, InitializingBean {

private String name;
//构造函数
public User() {
System.out.println("User的构造方法执行了");
}
//依赖注入
@Value("彭建飞")
public void setName(String name) {
System.out.println("setName方法执行了");
this.name = name;
}

@Override //BeanNameAware接口
public void setBeanName(String name) {
System.out.println("setBeanName方法执行了");
}

@Override //BeanFactoryAware接口
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("setBeanFactory方法执行了");
}

@Override //ApplicationContextAware接口
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("setApplicationContext方法执行了");
}

@PostConstruct //自定义增强,属于初始化方法
public void init(){
System.out.println("自定义init方法执行了");
}

@Override //InitializingBean,属于初始化方法
public void afterPropertiesSet() throws Exception {
System.out.println("afterPropertiesSet方法执行了");
}

@PreDestroy
public void destroy(){
System.out.println("destroy执行了");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if(beanName.equals("user")){
System.out.println("postProcessBeforeInitialization方法执行了->user对象初始化方法前开始增强...");
}
return bean;
}

@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if(beanName.equals("user")){
System.out.println("postProcessBeforeInitialization方法执行了->user对象初始化方法后开始增强...");
//cglib代理对象
Enhancer enhancer = new Enhancer();
//设置需要代理的类
enhancer.setSuperclass(bean.getClass());
//设置回调方法,增强方法
enhancer.setCallback(new InvocationHandler() {
@Override
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
System.out.println("执行增强方法");
return method.invoke(method,objects);
}
});
}
return bean;
}
}
1
2
3
4
@Component
@ComponentScan("com.guigu.beanlife/lifecycle")
public class SpringConfig {
}
1
2
3
4
5
6
7
public class BeanLifeTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
User user = ctx.getBean(User.class);
System.out.println(user);
}
}

输出

1
2
3
4
5
6
7
8
9
10
User的构造方法执行了
setName方法执行了
setBeanName方法执行了
setBeanFactory方法执行了
setApplicationContext方法执行了
postProcessBeforeInitialization方法执行了->user对象初始化方法前开始增强...
自定义init方法执行了
afterPropertiesSet方法执行了
postProcessBeforeInitialization方法执行了->user对象初始化方法后开始增强...
User的构造方法执行了

总结


Bean的生命周期
http://example.com/2023/10/05/Bean的生命周期/
Author
Posted on
October 5, 2023
Licensed under