Bean的生命周期以及方法的增强
首先,说一下为什么使用Spring,也就是Spring的优点。
优点
- 降低了组件之间的耦合性,实现了软件各层之间的解耦(IoC)
- 以使用容易提供的众多服务,如事务管理,消息服务,日志记录(AOP)
- 容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能
对于AOP,在普通的Bean创建中是如何体现的呢?接下来下分析一下他的生命周期吧。
bean的生命周期
-
实例化
Spring对bean进行实例化。 -
填充属性
Spring将值和bean的引用注入到bean对应的属性中。 -
调用BeanNameAware的setBeanName()
如果bean实现了BeanNameAware接口,Spring将bean的ID传递个setBeanName()。 -
调用BeanFactoryAware的setBeanFactory()
如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory(),将BeanFactory容器实例注入。 -
调用ApplicationContextAware的setApplicationContext()
如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext(),将bean所在的上下文引用传进来 -
调用BeanPostProcessor的预初始化方法(初始化Bean之前执行)
如果bean实现了BeanPostProcessor接口,Spring将调用他们的postPrecessBeforeInitialization(Object bean, String beanName)
。 -
调用InitializingBean的afterPropertiesSet()(属性设置后执行)
如果Bean实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()。 -
调用自定义初始化方法
自己配置的指定的初始化方法。 -
调用BeanPostProcessor的初始化后方法(初始化Bean之后执行)
如果bean实现了BeanPostProcessor接口,Spring将调用他们的postPrecessAfterInitialization(Object bean, String beanName)
。 -
使用Bean
执行业务方法,自定义 -
容器关闭
-
调用DisposableBean的destroy()
如果Bean实现了DisposableBean接口,Spring将调用他的销毁destroy()方法。 -
调用自定义的销毁方法
自己配置的指定的初始化方法。
当类对象调用自身的方法时,会依次执行上述步骤。其中BeanPostProcessor这个接口很重要,他可以在我们的类生成的时候产生代理,并且对他内部的方法进行增强,并且在不修改源代码的情况下。
增强一个类的某个方法
public Object postPrecessAfterInitialization(Object bean, String beanName){
//判断,如果是对应的beanName的话进行增强操作,否则不进行
if("beanName".equals(beanName)){
//使用JDK动态代理
Object proxy = Proxy.newProxyInstance(bean.getClass.getClassLoader(),bean.getClass.getInterfaces(),new InvocationHandler(){
@Override
public Object invoke(Object proxy, Method method, Object[] args) throw Throwable{
if("save".equals(method.getName())){
//todo 权限校验
method.invoke(bean, args);
}
//如果不是,进行直接返回
return method.invoke(bean, args);
}
});
//返回代理对象
return proxy;
}else{
return bean;
}
}
这一种思想会延续在AOP,在类的生成、实例化的过程当中对我们有原有的类进行增强。