Spring 容器中 Bean 的生命周期
1. init-method 和 destory-method 方法
Spring 初始化 bean 或销毁 bean 时,有时需要作一些处理工作,因此 spring 可以在创建和拆卸 bean 的时候调用 bean 的两个生命周期方法。
如:
bean id="xxx" class="xxx" init-method="init" destory-method="destory" />
-
当 bean 被载入到容器的时候调用 init,当 bean 从容器中删除的时候调用 destory(scope=singleton有效)。init 和 destory 的方法名可以自己命名
-
web 容器中会自动调用,但是 main 函数或测试用例需要手动调用
2. Spring 容器中 Bean 的生命周期(了解)
- instantiate bean 对象实例化
- populate properties 封装属性
- 如果 Bean 实现 BeanNameAware 执行 setBeanName
- 如果 Bean 实现 BeanFacotryAware 或者 ApplicationContextAware 设置工厂 setBeanFactory 或者上下文对象 setApplicationContext
- 如果存在类实现 BeanPostProcessor(后处理Bean),执行 postProcessBeforeInitialization
- 如果 Bean 实现 InitializingBean执行 afterPropertiesSet
- 调用
<bean init-method="init">
指定初始化方法 init ,如果存在类实现 BeanPostProcessor(处理 Bean),执行 postProcessAfterInitialization - 执行业务处理
- 如果 Bean 实现 DisposableBean ,执行 destroy
- 调用
bean destroy-method="customerDestroy">
指定销毁方法 customerDestroy
其中最重要的是:第五步和第七步。
在 ide 中实现上述过程,打印如下:
3. beanpostprocessor 的作用
beanpostprocessor 类可以在生成类的过程当中,对类产生代理,并可以对类中的方法进行增强。
如下面代码就是一个 beanpostprocessor 类,我们对 postProcessAfterInitialization 初始化后方法进行增强。增强 bean 中的 save 方法。
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
// System.out.println("第五步:初始化前的方法...");
return bean;
}
@Override
public Object postProcessAfterInitialization(final Object bean, String beanName) throws BeansException {
// System.out.println("第八步:初始化后方法...");
//使用代理,构造匿名函数
if ("userDao".equals(beanName)) {
Object proxy = Proxy.newProxyInstance(bean.getClass().getClassLoader(), bean.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if ("save".equals(method.getName())) {
System.out.println("权限校验==========");
// 传入属性
return method.invoke(bean, args);
}
return method.invoke(bean, args);
}
});
return proxy;
} else {
return bean;
}
}
}
输出如下:
网友评论