一、源码解释

参看 BeanFactory 注释
image.png

二、基本过程

1、从xml配置的Bean,@Bean注解,或者Java代码BeanDefinitionBuilder中读取Bean的定义,实例化Bean对象;
2、为bean的属性设置值和对其他bean引用(调用set方法)
3、调用bean的初始化方法(需要进行配置初始化方法 xml文件中配置 init-method)
4、bean可以使用了(对象获取到了)
5、当容器关闭的时候,调用bean的销毁方法(需要进行配置销毁的方法 xml中配置 destroy-method)
测试生命周期
init-method:初始化方法; 对应注解:@PostConstruct(优先级在set之前)
destroy-method:销毁方法;对应注解:@PreDestroy

  1. <bean id="orders" class="com.supking.bean.Orders" init-method="initMethod" destroy-method="destroyMethod">
  2. <property name="name" value="phone"></property>
  3. </bean>
  1. public class Orders {
  2. public Orders() {
  3. System.out.println("第一步....执行了无法参数的构造,创建了bean实例");
  4. }
  5. private String name;
  6. public void setName(String name) {
  7. this.name = name;
  8. System.out.println("第二步。。。。调用set方法设置属性的值。。。。。");
  9. }
  10. // 创建初始化方法
  11. public void initMethod(){
  12. System.out.println("第三步。。。执行初始化方法。。。。");
  13. }
  14. public void destroyMethod(){
  15. System.out.println("第五步。。。。执行销毁方法");
  16. }
  17. }
  1. public static void main(String[] args) {
  2. ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
  3. Orders orders = context.getBean("orders", Orders.class);
  4. System.out.println("第四步。。。获取到创建bean实例对象");
  5. // 手动让bean销毁
  6. ((ClassPathXmlApplicationContext)context).close();
  7. }
  8. // 输出结果如下
  9. 第一步....执行了无法参数的构造,创建了bean实例
  10. 第二步。。。。调用set方法设置属性的值。。。。。
  11. 第三步。。。执行初始化方法。。。。
  12. 第四步。。。获取到创建bean实例对象
  13. 第五步。。。。执行销毁方法

三、完整过程

1、xml 方式

基于第二种方法,如果加上了bean的后置处理器,即实现接口BeanPostProcessor,可以有七个步骤
1、从xml配置的Bean,@Bean注解,或者Java代码BeanDefinitionBuilder中读取Bean的定义,实例化Bean对象;
2、为bean的属性设置值和对其他bean引用(调用set方法)
3、把bean的实例传递给bean的后置处理器(postProcessBeforeInitialization)
4、调用bean的初始化方法(需要进行配置初始化方法)initializeBean的的invokeAwareMethods
5、把bean的实例传递给bean的后置处理器(postProcessAfterInitialization)
6、bean可以使用了(对象获取到了)
7、当容器关闭的时候,调用bean的销毁方法(需要进行配置销毁的方法)

添加后置处理器

创建类,实现接口BeanPostProcessor,创建后置处理器

  1. public class MyBeanPost implements BeanPostProcessor {
  2. @Override
  3. public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
  4. System.out.println("在初始化之前执行的方法");
  5. return bean;
  6. }
  7. @Override
  8. public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
  9. System.out.println("在初始化之后执行的方法");
  10. return bean;
  11. }
  12. }
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans
  5. http://www.springframework.org/schema/beans/spring-beans.xsd">
  6. <bean id="orders" class="com.supking.bean.Orders" init-method="initMethod" destroy-method="destroyMethod">
  7. <property name="name" value="phone"></property>
  8. </bean>
  9. <!-- 后置处理器,会给容器中的所有bean添加,所以在此时这个的时候,记得将上面不需要的bean(user,dog)注释掉-->
  10. <bean id="myBeanPost" class="com.supking.bean.MyBeanPost"></bean>
  11. </beans>
  1. public static void main(String[] args) {
  2. ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
  3. Orders orders = context.getBean("orders", Orders.class);
  4. System.out.println("第四步。。。获取到创建bean实例对象");
  5. // 手动让bean销毁
  6. ((ClassPathXmlApplicationContext)context).close();
  7. }
  8. // 输出结果
  9. 第一步....执行了无法参数的构造,创建了bean实例
  10. 第二步。。。。调用set方法设置属性的值。。。。。
  11. 在初始化之前执行的方法
  12. 第三步。。。执行初始化方法。。。。
  13. 在初始化之后执行的方法
  14. 第四步。。。获取到创建bean实例对象
  15. 第五步。。。。执行销毁方法

2、注解方式

  1. @Configuration
  2. @ComponentScan(basePackages = {"com.supkingx"})
  3. public class SpringConfig {
  4. }
  1. @Service
  2. public class UserService {
  3. private String name;
  4. public UserService() {
  5. System.out.println("第一步,无参构造");
  6. }
  7. public void setName(String name) {
  8. System.out.println("第三步,调用set方法设置值");
  9. this.name = name;
  10. }
  11. public void add() {
  12. System.out.println("UserService add.....");
  13. }
  14. @PostConstruct
  15. public void init(){
  16. System.out.println("第二步,@PostConstruct 执行初始化方法");
  17. }
  18. @PreDestroy
  19. public void destroy(){
  20. System.out.println("第五步,@PreDestroy 执行销毁方法");
  21. }
  22. }
  1. @Service
  2. public class PostBean implements BeanPostProcessor {
  3. @Override
  4. public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
  5. System.out.println("初始化之前,postProcessBeforeInitialization");
  6. return bean;
  7. }
  8. @Override
  9. public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
  10. System.out.println("初始化之后,postProcessAfterInitialization");
  11. return bean;
  12. }
  13. }
  1. public static void main(String[] args) {
  2. ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
  3. UserService userService = context.getBean(UserService.class);
  4. userService.setName("king");
  5. System.out.println("第四步,获取到创建bean的实例");
  6. ((AnnotationConfigApplicationContext) context).close();
  7. }
  8. 结果:
  9. 初始化之前,postProcessBeforeInitialization
  10. 初始化之后,postProcessAfterInitialization
  11. 第一步,无参构造
  12. 初始化之前,postProcessBeforeInitialization
  13. 第二步,@PostConstruct 执行初始化方法
  14. 初始化之后,postProcessAfterInitialization
  15. 第三步,调用set方法设置值
  16. 第四步,获取到创建bean的实例
  17. 第五步,@PreDestroy 执行销毁方法