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)