zoukankan      html  css  js  c++  java
  • Spring Bean的生命周期

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

     

     

  • 相关阅读:
    无刷新跨域上传图片
    php框架-yii
    nginx-url重写
    linux下挂载移动硬盘ntfs格式
    页面有什么隐藏bug:字体,图片
    Oracle、MySql、SQLServer数据分页查询
    转载:Qt之界面实现技巧
    QT常用资料
    MySQL判断字段值来确定是否插入新记录
    WindowsAPI开发常用资料
  • 原文地址:https://www.cnblogs.com/javabigdata/p/5656446.html
Copyright © 2011-2022 走看看