`
wiselyman
  • 浏览: 2094063 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
博客专栏
Group-logo
点睛Spring4.1
浏览量:82332
74ae1471-94c5-3ae2-b227-779326b57435
点睛Spring MVC4...
浏览量:130806
社区版块
存档分类
最新评论

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修改成了LinuxDemoSelectedBeanPostProcessor的postProcessBeforeInitialization中将num从123修改成了456
os确实被修改成了Linux
num确实被修改成了123

新书推荐《JavaEE开发的颠覆者: Spring Boot实战》,涵盖Spring 4.x、Spring MVC 4.x、Spring Boot企业开发实战。

 

京东地址:http://item.jd.com/11894632.html

当当地址:http://product.dangdang.com/23926195.html

亚马逊地址:http://www.amazon.cn/图书/dp/B01D5ZBFUK/ref=zg_bsnr_663834051_6 

淘宝地址:https://item.taobao.com/item.htm?id=528426235744&ns=1&abbucket=8#detail

 

 

 

或自己在京东、淘宝、亚马逊、当当、互动出版社搜索自选。

 


1
0
分享到:
评论
2 楼 wiselyman 2015-06-16  
FondaWu 写道
写的很好,赞一个
但也发现个小问题:
7.2.2.3例子中public Object postProcessAfterInitialization函数实现写错了吧
按上下文理解,应该是:
((DemoSelectedService) bean).setNum(456);
System.out.println("在DemoSelectedBeanPostProcessor的"+
  "postProcessBeforeInitialization中将num从123修改成了456" );
楼主粗心了



确实粗心了,已修改!
1 楼 FondaWu 2015-06-16  
写的很好,赞一个
但也发现个小问题:
7.2.2.3例子中public Object postProcessAfterInitialization函数实现写错了吧
按上下文理解,应该是:
((DemoSelectedService) bean).setNum(456);
System.out.println("在DemoSelectedBeanPostProcessor的"+
  "postProcessBeforeInitialization中将num从123修改成了456" );
楼主粗心了

相关推荐

    官方原版源码 spring-5.2.8.RELEASE.zip

    《Spring框架5.2.8.RELEASE源码详解》 Spring框架是Java开发中的核心组件,它以其模块化、灵活性和强大的功能深受开发者喜爱。5.2.8.RELEASE是Spring框架的一个稳定版本,提供了诸多改进和新特性,旨在提升性能、...

    spring-framework-5.2.0.RELEASE-master.zip

    AOP的核心概念包括切面(Aspect)、通知(Advice)、连接点(Join Point)、切入点(Pointcut)和目标对象(Target Object)。在源码中,`org.springframework.aop`和`org.springframework.aop.framework`包下的类,...

    spring-framework-4-reference

    Spring 4.x版本在原有的基础上新增了一些功能,并对现有功能进行了增强,本节将介绍Spring Framework 4.x中的一些新特性和改进点。 Spring Framework总览部分,主要介绍了Spring框架的核心概念,比如依赖注入(DI)...

    spring-framework-4.3.6 API

    1. 容器扩展:Spring 提供了 BeanPostProcessor 和 BeanFactoryPostProcessor 接口,允许用户自定义扩展点,实现更精细的控制。 2. Annotation-based Configuration:除了 XML 配置外,4.3.6 版本更加强调注解驱动的...

    spring-framework-3.2.13.RELEASE 源码

    最后,Spring的容器提供了多种扩展点,如BeanPostProcessor、BeanFactoryPostProcessor等,这使得开发者可以在容器初始化阶段自定义逻辑。在3.2.13.RELEASE中,我们可以探索这些扩展点的实现,以及如何利用它们增强...

    spring--day02笔记.doc

    BeanPostProcessor是Spring框架提供的一个接口,允许开发者在Bean实例化和销毁阶段执行自定义的逻辑。BeanPostProcessor可以用于实现AOP机制,例如日志记录、安全检查等。 Spring核心API Spring框架提供了一些...

    spring-framework-2.5.6

    4. **IoC容器扩展点**:如BeanPostProcessor,了解如何扩展Spring以满足特定需求。 三、文档详解 Spring 2.5.6的官方文档是开发者的重要参考资料,它详细介绍了框架的各个组件和使用方法。通过阅读文档,可以掌握...

    com-spring-ioc-demo:源码主要是学习Spring IOC的原理,以及对Bean的注册及控制,主要运用以下类对Spring进行扩展学习:BeanPostProcessor,BeanFactoryAware,BeanNameAware,ApplicationContextAware,FactoryBean,BeanDefinitionRegistryPostProcessor,BeanFactoryPostProcessor,BeanPostProcessor,ResourceLoaderA

    com-spring-ioc-demo:源码主要是学习Spring IOC的原理,以及对Bean的注册及控制,主要运用以下类对Spring进行扩展学习:BeanPostProcessor,BeanFactoryAware,BeanNameAware,ApplicationContextAware,FactoryBean...

    spring-beans-3.0.2.RELEASE.jar.zip

    SpringBeans-3.0.2.RELEASE.jar还包含了一些关键接口,如BeanPostProcessor允许自定义Bean实例化后的处理逻辑,InitializingBean和DisposableBean分别用于标识初始化和销毁方法。同时,该版本的Spring支持AOP(面向...

    Java自定义注解与spring BeanPostProcessor详解

    Java自定义注解和Spring的BeanPostProcessor是Java企业级开发中的两个重要概念,它们在构建灵活、可扩展的应用程序中发挥着关键作用。本文将深入探讨这两个话题,并结合源码分析,帮助开发者更好地理解和应用。 ...

    Spring BeanPostProcessor接口使用详解

    Spring BeanPostProcessor接口使用详解 Spring BeanPostProcessor接口是Spring框架中的一种后处理器接口,允许开发者在Bean初始化前后进行自定义处理。该接口提供了两个供开发者自定义的方法:...

    Spring Reference - Core Technologies.pdf

    Spring框架允许开发者扩展容器行为,这包括自定义BeanPostProcessor、BeanFactoryPostProcessor等。 在Spring框架的学习和应用中,开发者需要深刻理解这些核心知识点,只有这样,才能充分利用Spring提供的强大功能...

    Spring 内置 BeanPostProcessor类图.zip

    在Spring框架中,BeanPostProcessor(BPP)是一个至关重要的接口,它允许用户自定义处理在Spring IoC容器中管理的bean的初始化前后过程。这个接口提供了两个核心的方法:`postProcessBeforeInitialization()` 和 `...

    spring-beans

    此外,Spring提供了多种扩展点,如 BeanPostProcessor 和 InstantiationAwareBeanPostProcessor,允许自定义处理Bean的创建和初始化过程。 在Spring框架中,"spring-beans"模块是所有其他模块的基石,它提供的IoC...

    spring-beans源码

    《深入剖析Spring Beans源码》 Spring框架是Java开发中不可或缺的部分,其核心组件之一就是`spring-beans`模块。...在实际开发中,理解并掌握这些知识点将使我们能够更好地调试和优化Spring应用,解决各种复杂问题。

    spring-framework-2.5.4源码.rar

    3. **AOP**:Spring的AOP模块支持面向切面编程,使得我们可以编写横切关注点,如日志、事务管理等。`org.springframework.aop`包包含了AOP的相关实现,如`AspectJ`的集成,`Pointcut`定义切点,`Advisor`定义通知,...

    Spring-Reference_zh_CN(Spring中文参考手册)

    7.2. Spring中的切入点API 7.2.1. 概念 7.2.2. 切入点实施 7.2.3. AspectJ切入点表达式 7.2.4. 便利的切入点实现 7.2.4.1. 静态切入点 7.2.4.2. 动态切入点 7.2.5. 切入点的基类 7.2.6. 自定义切入点 7.3. Spring的...

    spring-framework-4.3.17 源码包

    《深入剖析Spring Framework 4.3.17源码》 Spring Framework是Java开发领域中的一个里程碑,它为构建高质量的、组件化的、模块化的应用提供了强大的支持。本篇文章将聚焦于Spring Framework 4.3.17版本的源码,帮助...

    spring-analysis

    ### Spring Analysis:深入理解Spring框架的核心机制 #### 一、Spring框架概述 Spring框架是一个开源的Java平台,它提供了一套全面的编程和支持模型来帮助开发者构建应用。Spring框架的核心特性包括依赖注入...

    spring-custom-master.7z

    这需要我们掌握AspectJ的元数据解析和Spring的`BeanDefinition`,以及`BeanPostProcessor`和`InstantiationAwareBeanPostProcessor`接口,这些都是Spring处理注解的核心组件。 其次,项目中可能涉及自定义注解的...

Global site tag (gtag.js) - Google Analytics