Spring生命周期_Spring容器中Bean的生命周期-(Spring笔记005)

Bean的生命周期的生命周期可分为11部分,比较有操作的几个部分
初始化方法前
初始化方法
初始化方法后

目标方法

销毁方法

初始化和销毁(和销毁方法的执行条件)

<bean id="" class="" init-method="初始化方法名称" destroy-method="销毁方法名称">

初始化方法和销毁方法在实现接口的“服务类”中

测试

测试类中方法:
public void demo(){
String xmlpath =“com.···.beans.xml”
ApplicationContext applicationContext= new ClassPathXmlApplicationContext(xmlpath);
BookSersvice bookSvice =(BookSvice)applicationContext.getBean(“BooksvicesID”);
bookSvice.addbook();
}

测试结果:初始化方法和目标方法执行了,但是销毁方法没有执行

原因是工厂/容器 必须close,且为单例,销毁方法才能执行

调用close方法application.close()报错,但是close方法接口中未定义close(),但实现类中提供了

方法一:反射:applicationContext.getClass().getMethod(“close”).invoke(applicationContext);
方法二:直接创建类对象,直接使用类对象而不用接口

ClssPathXmlApplicationContext applicationContext=new ClssPathXmlApplicationContext(xmlpath);

后处理Bean

BeanPostProcessor接口,此接口有两个方法,只要实现此接口,并将实现类提供给Spring容器( id="" class=“实现接口的类” ),Spring容器将自动按顺序执行
此 接 口 有 两 个 方 法 { O b j e c t    p o s t P r o c e s s A f t e r I n i t i z a t i o n ( O b j e c t    b e a n , S t r i n g    b e a n n a m e ) O b j e c t    p o s t P r o c e s s B e f o r e I n i t i z a t i o n ( O b j e c t    b e a n , S t r i n g    b e a n n a m e ) \mathrm{此接口有两个方法}\left\{\begin{array}{l}Object\;postProcessAfterInitization(Object\;bean,String\;beanname)\\Object\;postProcessBeforeInitization(Object\;bean,String\;beanname)\end{array}\right. 此接口有两个方法{ObjectpostProcessAfterInitization(Objectbean,Stringbeanname)ObjectpostProcessBeforeInitization(Objectbean,Stringbeanname)​
注1:方法中的参数beanname可用于判断-method.getName().equals(beanname)
注2:before方法中如果ruturn null则后续的方法都将不能执行,如果直接return bean 则没有增强但是能够继续执行
注3:返回代理对象的方法需要写到After方法中,但是因为代理对象只有接口中的方法,但是初始化方法和销毁方法都放到了实现BeanPostProcessor接口的类中,所以写在Before中不可行
After:return Proxy.newProxyInstance(MyBeanPostProcessor.class.getClassLoader(),bean.getClass.getInterface(),new InvocationHandler(){publin Object invoke()~~~})匿名内部类+final(修饰After)

上一篇:用@Component注解的类中@Autowired为null


下一篇:Spring中 ApplicationContext事件机制