在项目整合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会自己去调用它。