`
thisisvoa
  • 浏览: 63644 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

spring中基于BeanPostProcessor动态替换指定的bean

 
阅读更多

现在每个系统开发集成的开发框架和公用组件都太多了,而且每个组件都是用自己的配置,比如我们现在使用的一个单点登陆系统就是采用spring来配置管理的。其核心bean定义文件被打包在jar包中,当我们想替换其中的某一个bean定义时,又不太好直接修改bean定义文件,那样会导致框架维护混乱。这里,我们就可以使用spring中的bean前后处理器来进行动态替换,先说明场景哈。

有一个jar包,包含了一个xml文件,定义了自身的一系列bean。另外一个项目使用了这个jar包,但又想替换其中的一个bean,原来默认的bean是用配置文件来读取信息,但现在想改成数据库的模式。常规的方法是:

1、将xml文件拿出来,修改bean定以后再放到jar包内替换以前的;

2、直接将xml文件拿出来,删除jar包中的,并将新的xml文件放在项目的classpath中

这两个方法虽然可以解决问题,但不利于jar包本身的维护,如果升级了,那项目的改动就比较麻烦。这里,我们其实完全可以采用spring的BeanPostProcessor来动态替换。

假设jar包中定义的xml文件中一个包含的bean定义如下:

  1. <bean id="aa" class="cc.mzone.config.DefaultConfigImpl">
  2. ...
  3. </bean>

其中DefaultConfigImpl这个bean就是我们要替换的对象,我们可以写如下的类:

  1. public class MyConfigImpl extends DefaultConfigImpl implements BeanPostProcessor {
  2. @Override
  3. public Object postProcessAfterInitialization(Object bean, String beanName)
  4. throws BeansException {
  5. return bean;
  6. }
  7. @Override
  8. public Object postProcessBeforeInitialization(Object bean, String beanName)
  9. throws BeansException {
  10. if (beanName.equals("defaultcfg")) {
  11. // do something
  12. return this;
  13. }
  14. return bean;
  15. }
  16. }

注意我们继承了原始的DefaultConfigImpl,当然你也可以不继承,单独再写一个也可以。同时实现了spring中的BeanPostProcessor,这个类是spring容器级别的处理器,可以在bean初始化前后做一些时间(这里的初始化不是指类的初始化,而是相对bean的属性设置而言的)。可以看到我们在postProcessBeforeInitialization这个方法中对bean名称为defaultcfg的bean进行特殊处理,这里我们是直接返回当前bean作为替换实例,从而也就实现了动态替换指定bean的效果,同时也不破坏原始的组件架构,可谓一举两得。

分享到:
评论

相关推荐

    SpringBoot 获取spring bean方式.rar

    在Spring Boot应用中,管理Bean是核心特性之一。Spring框架为我们提供了多种获取Bean的方法,这些方法可以帮助开发者在不同场景下灵活地使用Bean。本篇将详细介绍Spring Boot中获取Bean的几种常见方式。 首先,让...

    Spring源码学习四:BeanDefinition装载前奏曲1

    在深入Spring源码的学习过程中,我们主要关注BeanDefinition的装载过程。BeanDefinition是Spring框架的核心概念,它包含了关于Bean的所有元数据,如类名、属性、依赖关系等。在Spring初始化时,会读取XML配置文件,...

    Spring2.5详细注解.doc

    Spring 2.5 版本引入了基于注释(Annotation)的配置,提供了完全基于注释配置 Bean、装配 Bean 的功能,以替换原来基于 XML 的配置。这种新的配置方式可以充分利用 Java 的反射机制获取类结构信息,减少配置的工作...

    Spring Reference - Core Technologies.pdf

    Spring IoC容器负责加载配置信息并创建bean实例,这些bean是Spring应用中构成应用主干的各个组件。Spring提供了多种容器实现,最常用的两种是BeanFactory和ApplicationContext。 1.2 容器概述 Spring IoC容器的配置...

    为bean动态的增加新方法

    但这种方式通常用于修改bean的属性或者替换bean的行为,而不是添加新方法。 总的来说,Spring提供的动态方法增强能力使得开发者能够灵活地扩展应用程序的功能,而无需更改原始的bean实现。这大大提高了代码的可维护...

    Spring系列面试题129道(附答案解析)

    它通过读取配置文件或使用注解来创建和管理Bean实例,并将依赖关系自动注入到需要它们的Bean中。 17、什么是springbean? Spring bean是存储在Spring IoC容器中的Java对象,可以通过容器来配置和管理。 18、spring...

    spring3.1中文参考文档

    - 本章节进一步介绍了Spring 3.1版本中的新特性,包括但不限于对已有特性的优化和新增功能。 #### 第三部分:核心技术 ##### 第4章:IoC容器 **4.1 Spring IoC容器和bean的介绍** - 介绍了IoC容器的基本概念,...

    spring

    - **PropertyPlaceholderConfigurer** 和 **PropertyOverrideConfigurer**:用于在运行时动态替换Bean配置中的占位符。 ### 结论 Spring框架以其强大的功能和灵活性,成为Java企业级应用开发的首选框架之一。通过...

    spring-reference

    Spring框架允许开发者自定义Bean类,并通过BeanDefinition将其配置到容器中。 ##### 3.2.4 Bean 标识符 (id 和 name) Bean的标识符用于唯一标识一个Bean。Spring框架允许使用id或name属性来为Bean指定标识符。 ###...

    动态代理接口并注册到spring容器

    在本案例中,我们将探讨如何实现一个动态代理接口并将其注册到Spring容器,以便于通过@Autowired注解或其他方式在Spring应用中使用。 首先,我们需要定义一个接口,例如`MyService`,这个接口包含了我们需要代理的...

    spring学习笔记2

    1. **BeanPostProcessor**:这是Spring容器中Bean的后置处理器接口,它允许在Bean实例化之后执行自定义的操作。Spring自身已经实现了多个BeanPostProcessor,例如: - `ApplicationContextAwareProcessor`:用于...

    spring-reference.pdf

    3. **自动装配**:自动装配是Spring的一种特性,它可以在不指定任何依赖的情况下自动将Bean的实例注入到其他Bean中。 七、自定义Bean行为 1. **生命周期接口**:Spring提供了多个生命周期接口,如InitializingBean...

    spring-reference1.2.pdf

    在Spring框架中,一个“bean”通常是指一个Java对象,由Spring IoC容器管理。这些对象可以是任何类型的Java对象,只要它们被Spring IoC容器管理即可。 #### 3.2 BeanFactory 和 Bean 定义基础 - **BeanFactory**:...

    Spring 总结(1) 自用

    BeanPostProcessor允许在bean初始化前后进行自定义操作,而BeanFactoryPostProcessor则在bean加载但未实例化之前执行特殊处理,例如PropertyPlaceholderConfigurer可以用于处理属性文件中的占位符替换。 总的来说,...

    Spring源码学习八:常用的扩展接口详解1

    实现这个接口的类能够在Bean加载过程中获取到Spring应用上下文`ApplicationContext`,从而可以访问容器中的其他Bean和服务,如读取配置信息、发布事件等。 4. **BeanFactoryAware接口**: `BeanFactoryAware`接口...

    spring的有关学习知识总结

    11. **Bean后处理器**:通过实现`BeanPostProcessor`接口,可以在Bean实例化后对Bean进行自定义处理,如属性的修改。 12. **ApplicationContext后处理器**:`ApplicationListener`接口允许监听ApplicationContext...

    Spring Secrutity

    - 最后,在`BeanPostProcessor`的`postProcessAfterInitialization`方法中,将自定义的`SecurityMetadataSource`注入到`FilterSecurityInterceptor`中,实现替换原有的默认行为。 通过这种方式,不仅实现了动态从...

Global site tag (gtag.js) - Google Analytics