zoukankan      html  css  js  c++  java
  • 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的属性,

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

  • 相关阅读:
    Oracle->oracle单实例Shell脚本[20180122]
    oracle 11g grid软件安装[20180121]
    MySQL-5.7.20主从复制测试[20180110]
    Sonarqube中文插件-Linux[20180105]
    Sonar安装-Linux[20171227]
    (Linux 日常命令)[20171225]
    ThreadLocal的实现机制
    LruCache源码分析
    命令提示符怎么以管理员方式打开
    Eslint 从入门到放弃 http://blog.csdn.net/fay462298322/article/details/74931092
  • 原文地址:https://www.cnblogs.com/trekxu/p/9090982.html
Copyright © 2011-2022 走看看