bean的生命周期
流程
-
通过构造器创建bean实例(无参数构造)
-
为bean的属性设置值和其他bean引用(调用set方法)
-
后置处理器: postProcessBeforeInitialization(Object bean, String beanName)
-
调用bean的初始化方法(需要配置初始化的方法)
-
后置处理器: postProcessAfterInitialization(Object bean, String beanName)
-
获取到bean对象
-
当容器关闭后,调用bean的销毁的 方法(需要进行销毁方法的配置)
package com.Zhibin.spring5.bean; public class Orders { private String oName; public void setoName(String oName){ this.oName = oName; System.out.println("第二步 调用set方法设置属性的值"); } public Orders(){ System.out.println("第一步 调用无参构造 this is Orders"); } // 创建执行初始化的方法 public void initMethod(){ System.out.println("第三步 进行初始化"); } public void destroyMethod(){ System.out.println("第五步 关闭时容器时销毁方法"); } }
后置处理器的类
// 后置处理器编写方法 , 写一个类 实现 BeanPostProcessor接口 package com.Zhibin.spring5.bean; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.lang.Nullable; public class MyBeanPost implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("在初始化之前"); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("在初始化之后"); return bean; } }
对于bean的初始化 和 销毁的方法需要我们进行手动配置
在上面的类中配置了 initMethod 和 destoryMethod 这两个方法 , 分别在bean的对象配置中使用init-methond destory-method 这两个标签 配置相应的方法
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="orders" class="com.Zhibin.spring5.bean.Orders" init-method="initMethod" destroy-method="destroyMethod"><!-- 配置初始话方法 在bean里使用 init-method标签 --> <property name="oName" value="computer"></property> </bean> <!-- 在配置的时候会找到类里边的无参构造进行对象的创建 --> <!-- 配置后置处理器 --> <bean id="myBeanPost" class="com.Zhibin.spring5.bean.MyBeanPost"></bean> <!-- 将我们的后置处理器的类作为一个bean 添加到xml中,并且因为默认是一个单例对象,加载xml文件的时候就会去产生一个实例对象,而这是个实现了 BeanPostProcessor 接口的类,会被当做后置处理器处理,并且在这张xml中配置的所有的对象都会被添加这个后置处理器 --> </beans>
测试方法
@Test public void testBean(){ AbstractApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml");// 在这里我们要注意因为在ApplicationContext方法中是没有close方法的,所以在这里使用的时用的时接口实现类AbstractAppliaction Orders orders = context.getBean("orders", Orders.class); System.out.println("创建实例对象"); System.out.println(orders); context.close(); } /* 最终执行结果如下 为了简化我们只在相应的方法里进行打印 第一步 调用无参构造 this is Orders 第二步 调用set方法设置属性的值 在初始化之前 第三步 进行初始化 在初始化之后 创建实例对象 com.Zhibin.spring5.bean.Orders@13eb8acf 第五步 关闭时容器时销毁方法 */