在项目整合Spring以后,对象就交给了Spring管理。这篇文章主要说一下Bean的生命周期
Bean的生命周期的11个步骤:
1.instantiate bean对象实例化
2.populate properties 封装属性
3.如果Bean实现BeanNameAware 执行 setBeanName
4.如果Bean实现BeanFactoryAware 或者 ApplicationContextAware 设置工厂 setBeanFactory 或者上下文对象 setApplicationContext
5.如果存在类实现 BeanPostProcessor(后处理Bean) ,执行postProcessBeforeInitialization
6.如果Bean实现InitializingBean 执行 afterPropertiesSet
7.调用<bean init-method="init"> 指定初始化方法 init
8.如果存在类实现 BeanPostProcessor(处理Bean) ,执行postProcessAfterInitialization
9.执行业务处理
10.如果Bean实现 DisposableBean 执行 destroy
11.调用<bean destroy-method="customerDestroy"> 指定销毁方法 customerDestroy
接下来我们写一个类实现 BeanPostProcessor 接口,并在初始化完成以后 根据要求进行权限检查,具体代码如下
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class MyBeanPostProcessor implements BeanPostProcessor{
/**
* bean:实例对象
* beanName:在配置文件中配置的类的标识.
*/
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
return bean;
}
public Object postProcessAfterInitialization(final Object bean, String beanName)
throws BeansException {
//这里只对部分类的部分方法进行增强,增强以后返回代理类 这样子调用增强的方法以后就会执行相关的增强代码
//XXXX指需要增强的bean的名字
if(beanName.equals("XXXX")){
Object proxy = Proxy.newProxyInstance(bean.getClass().getClassLoader(), bean.getClass().getInterfaces() , new InvocationHandler() {
// 调用目标方法的时候,调用invoke方法.
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//XXX指需要增强的方法
if("XXX".equals(method.getName())){
System.out.println("权限检查...");
Object result = method.invoke(bean, args);
return result;
}
return method.invoke(bean, args);
}
});
return proxy;
}
return bean;
}
}
最后记得在配置文件中配置该bean,可用不配置id或者name。Spring会自己去调用它。