• 07点睛Spring4.1-BeanPostProcessor


    7.1 BeanPostProcessor

    • spring通过BeanPostProcessor接口可以对所有bean或者指定的某些bean的初始化前后对bean的检查或者修改提供支持;
    • 使用postProcessBeforeInitializationpostProcessAfterInitialization对bean进行操作;
    • postProcessBeforeInitializationpostProcessAfterInitialization返回值是bean;

    7.2 示例

    7.2.1 处理全部bean

    7.2.1.1 新建两个测试用的bean

    package com.wisely.beanpostprocessor;
    
    import org.springframework.stereotype.Service;
    
    @Service
    public class DemoNormal1Service {
    
    }
    
    package com.wisely.beanpostprocessor;
    
    import org.springframework.stereotype.Service;
    
    @Service
    public class DemoNormal2Service {
    
    }
    

    7.2.1.2 编写处理所有bean的BeanPostProcessor

    package com.wisely.beanpostprocessor;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.config.BeanPostProcessor;
    import org.springframework.stereotype.Component;
    
    @Component
    public class DemoAllBeanPostProcessor implements BeanPostProcessor{
    
        public Object postProcessBeforeInitialization(Object bean, String beanName)
                throws BeansException {
            System.out.println("在 DemoAllBeanPostProcessor的"
            +postProcessBeforeInitialization方法里处理bean: " + beanName
            +" bean的类型为:"+bean.getClass());
            return bean;
        }
    
        public Object postProcessAfterInitialization(Object bean, String beanName)
                throws BeansException {
            System.out.println("在 DemoAllBeanPostProcessor的"+
            postProcessAfterInitialization方法里处理bean: " + beanName
            +" bean的类型为:"+bean.getClass());
            return bean;
        }
    
    }
    

    7.2.1.3 测试

    package com.wisely.beanpostprocessor;
    
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    
    public class Main {
    
        public static void main(String[] args) {
            AnnotationConfigApplicationContext context =  
                     new AnnotationConfigApplicationContext("com.wisely.beanpostprocessor");
            context.close();
    
        }
    
    }

    输出结果为:

    DemoAllBeanPostProcessor的postProcessBeforeInitialization方法里处理bean:
    demoNormal1Service bean的类型为:class com.wisely.beanpostprocessor.DemoNormal1Service
    在 DemoAllBeanPostProcessor的postProcessAfterInitialization方法里处理bean:
    demoNormal1Service bean的类型为:class com.wisely.beanpostprocessor.DemoNormal1Service
    在 DemoAllBeanPostProcessor的postProcessBeforeInitialization方法里处理bean:
    demoNormal2Service bean的类型为:class com.wisely.beanpostprocessor.DemoNormal2Service
    在 DemoAllBeanPostProcessor的postProcessAfterInitialization方法里处理bean:
    demoNormal2Service bean的类型为:class com.wisely.beanpostprocessor.DemoNormal2Service

    7.2.2 处理指定的bean

    7.2.2.2 新建指定处理的bean

    已经给os和num属性赋值,将在BeanPostProcessor的实现类对类的属性进行修改

    package com.wisely.beanpostprocessor;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Service;
    
    @Service
    public class DemoSelectedService {
        @Value("#{systemProperties['os.name']}")
        private String os;
        @Value("123")
        private Long num;
    
        public String getOs() {
            return os;
        }
    
        public void setOs(String os) {
            this.os = os;
        }
    
        public Long getNum() {
            return num;
        }
    
        public void setNum(Long num) {
            this.num = num;
        }
    
    
    }

    7.2.2.3 编写指定bean的BeanPostProcessor

    packagecom.wisely.beanpostprocessor;
    
    importorg.springframework.beans.BeansException;
    importorg.springframework.beans.factory.config.BeanPostProcessor;
    importorg.springframework.stereotype.Component;
    @Component
    
    public class DemoSelectedBeanPostProcessor implements BeanPostProcessor {
    
        public Object postProcessBeforeInitialization(Objectbean, StringbeanName)
                throwsBeansException {
            if(bean instanceof DemoSelectedService){
                ((DemoSelectedService) bean).setOs("Linux");
                System.out.println("在DemoSelectedBeanPostProcessor的"+"postProcessBeforeInitialization中将os从windows修改成了Linux" );
            }
            return bean;
        }
    
        public Object postProcessAfterInitialization(Objectbean, StringbeanName)
                throwsBeansException {
            if(bean instanceof DemoSelectedService){
                ((DemoSelectedService) bean).setNum(456);
                System.out.println("在DemoSelectedBeanPostProcessor的"+"postProcessBeforeInitialization中将num从123修改成了456" );
            }
            return bean;
        }
    
    }
    

    7.2.2.4 测试

    package com.wisely.beanpostprocessor;
    
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    
    public class Main {
    
        public static void main(String[] args) {
            AnnotationConfigApplicationContext context =
                     new  AnnotationConfigApplicationContext("com.wisely.beanpostprocessor");
            DemoSelectedService dss = context.getBean(DemoSelectedService.class);
            System.out.println("os确实被修改成了"+dss.getOs());
            System.out.println("num确实被修改成了"+dss.getNum());
            context.close();
    
        }
    
    }
    
    

    输出结果

    DemoSelectedBeanPostProcessor的postProcessBeforeInitialization中将os从windows修改成了Linux
    在DemoSelectedBeanPostProcessor的postProcessBeforeInitialization中将num从123修改成了456
    os确实被修改成了Linux
    num确实被修改成了123
  • 相关阅读:
    db 问题案例
    hystrix 服务监控
    题目004.删除排序数组中的重复项
    线上问题:redis 内存使用率 95%,排查bigkey
    题目003.寻找数组的中心索引
    enum 优雅代码
    java编程工具包 com.alibaba.fastjson
    mysql 问题记录
    题目002 统计N以内的素数
    题目002 反转链表
  • 原文地址:https://www.cnblogs.com/Jeely/p/11949858.html
Copyright © 2020-2023  润新知