• 012 BeanPostProcessor


    一 . 概述

      在前面我们说过spring为我们提供了各种初始化时的回调方式,对于我们来说最为重要的就是BeanPostProcessor这个接口.


     二 .BeanPostProcessor

    public interface BeanPostProcessor {
       
        Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
       
        Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
    
    }

    上面的方法会在初始化过程的前面执行.

    我们看下参数,一个是Bean对象,另外一个就是Bean的名字.


    三 .演示  

    public class User {
        private String name;
        public void setName(String name) {
            System.out.println("设值注入...");
            this.name = name;
        }
        public String getName() {
            return name;
        }
        public void init() {
            System.out.println("init 执行了 ...");
        }
    
        public User() {
            System.out.println("构造函数执行了...");
        }
    
        public void destroy() {
            System.out.println("销毁方法执行了...");
        }
    
    }

    BeanPostProcessor:

    public class UserBeanPostProcessor implements BeanPostProcessor {
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            if (bean instanceof User) {
                System.out.println("bean post before");
            }
            return bean;
        }
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            if (bean instanceof User) {
                System.out.println("bean post after");
            }
            return bean;
        }
    
    }

    配置文件: 

        <bean id="user" class="com.trek.init.User" init-method="init" destroy-method="destroy">
            <property name="name" value="trek"></property>
        </bean>
        <bean class="com.trek.init.UserBeanPostProcessor"></bean>

    测试代码: 

        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
            User user = (User) context.getBean("user");
            System.out.println(user);
            context.close();

    运行结果: 

    构造函数执行了...
    设值注入...
    bean post before
    init 执行了 ...
    bean post after
    com.trek.init.User@2a2d45ba
    五月 25, 2018 10:49:24 下午 org.springframework.context.support.ClassPathXmlApplicationContext doClose
    信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@5d099f62: startup date [Fri May 25 22:49:24 CST 2018]; root of context hierarchy
    销毁方法执行了...

    我们发现了执行顺序的问题:

      [1]构造函数

      [2]设值注入

      [3]beanpostbefore

      [4]init

      [5]BeanPostAfter

      [6]销毁方法


     四 .作用

      BeanPostProcessor的最大作用就是帮助我们拦截Bean创建的过程,我们可以在这个过程之中修改Bean的属性,

      设置生成一个代理对象,这也很多第三方框架做的事情.

  • 相关阅读:
    正确率、召回率和 F 值
    柯西序列 转自http://blog.sina.com.cn/coopld
    web用户非正常退出的问题
    uploadify上传的文件
    10270 : 青蛙的游戏
    10117 : 数独游戏
    10101 : 正面交锋
    10049 : 凯的菱形
    DARE YOU CLICK ME???(你敢点我吗???)
    高精度专辑(1码题库)
  • 原文地址:https://www.cnblogs.com/trekxu/p/9090982.html
Copyright © 2020-2023  润新知