Spring容器中已经存在的Bean替换示例

目录
  • 一、背景
  • 二、需求
  • 三、实现思路
  • 四、实现步骤
    • 1、模拟第三方jar包实现并加入Spring容器中
    • 2、自己提供一个实现
    • 3、替换掉jar包默认的实现
    • 4、进行测试

一、背景

我们在开发的过程中,经常会引入别人写的jar包实现某些功能。而别人的jar包一般都自动注入Spring容器中,假设别人都是通过@Bean@Component注入的,并且没有加入@ConditionalXXX等注解,导致自己无法替换掉别人的实现,假设这个时候我就是想替换掉,那么该如何实现呢?

二、需求

由上图可知,我们的需求为:

使用我们自己定义的 BananaProductService替换掉框架自带的AppleProductService并加入到Spring容器中,同时保证全局只有一个ProductService的实现。

三、实现思路

我们在系统中根据 @Bean或通过 @Component 定义的Bean对象在Spring中都会转换成一个个的BeanDefinition对象,如果我们在Spring创建这些对象加入到Spring容器之前,将不想要的BeanDefinition对象删除,而加入我们自己想要的BeanDefinition对象是不是就可以实现了?而Spring提供的BeanDefinitionRegistryPostProcessor接口正好可以帮助我们实现这个功能。

BeanDefinitionRegistryPostProcessor 是在系统加载完所有的BeanDefinition对象来进行回调。

四、实现步骤

1、模拟第三方jar包实现并加入Spring容器中

2、自己提供一个实现

3、替换掉jar包默认的实现

4、进行测试

代码地址

https://gitee.com/huan1993/spring-cloud-parent/tree/master/springboot/springboot-override-exists-bean

以上就是Spring容器中已经存在的Bean替换示例的详细内容,更多关于Spring Bean容器替换的资料请关注我们其它相关文章!

(0)

相关推荐

  • 创建动态代理对象bean,并动态注入到spring容器中的操作

    使用过Mybatis的同学,应该都知道,我们只需要编写mybatis对应的接口和mapper XML文件即可,并不需要手动编写mapper接口的实现.这里mybatis就用到了JDK动态代理,并且将生成的接口代理对象动态注入到Spring容器中. 这里涉及到几个问题.也许有同学会有疑问,我们直接编写好类,加入@Component等注解不是可以注入了吗?或者在配置类(@Configuration)中直接声明该Bean类型不也可以注入吗? 但具体到mybatis,这里我们用的是接口.由于spring

  • Spring容器的创建过程之如何注册BeanPostProcessor详解

    注册BeanPostProcessor refresh()调用registerBeanPostProcessors(beanFactory)方法,注册Bean的后置处理器,后置处理器是用来拦截bean创建过程的. 不同接口类型的BeanPostProcessor,即继承了BeanPostProcessor接口的子接口,在Bean创建前后的执行时机是不一样的 BeanPostProcessor DestructionAwareBeanPostProcessor InstantiationAware

  • Java Spring-IOC容器与Bean管理之基于注解的方式案例详解

    Spring-IOC容器-Bean管理-基于注解方式 什么是注解? (1)注解是代码特殊标记,格式:@注解名称(属性名称=属性值, 属性名称=属性值-) (2)使用注解,注解作用在类上面,方法上面,属性上面 (3)使用注解目的:简化 xml 配置 Spring 针对 Bean 管理中创建对象提供注解 下面四个注解功能是一样的,都可以用来创建 bean 实例 (1)@Component (2)@Service (3)@Controller (4)@Repository 基于注解方式实现对象创建 ①

  • Spring-IOC容器-Bean管理-基于XML方式超详解

    目录 Spring-IOC容器-Bean管理-基于XML方式 Spring框架概述 IOC概念和原理 IOC 操作 Bean 管理(set方式注入&&使用有参构造进行注入) IOC 操作 Bean 管理(xml注入其他类型属性) IOC 操作 Bean 管理(xml注入集合属性) IOC 操作 Bean 管理(FactoryBean) IOC 操作 Bean 管理(bean 作用域) IOC 操作 Bean 管理(bean 生命周期) IOC 操作 Bean 管理(XML自动装配) IOC

  • Spring容器中添加bean的5种方式

    目录 @Configuration + @Bean @Componet + @ComponentScan @Import注解导入 @Import直接导入类 @Import + ImportSelector @Import + ImportBeanDefinitionRegistrar @Import + DeferredImportSelector 使用FactoryBean接口 使用 BeanDefinitionRegistryPostProcessor 小结 我们知道平时在开发中使用Spri

  • Java 如何从spring容器中获取注入的bean对象

    1.使用场景 控制层调用业务层时,控制层需要拿到业务层在spring容器中注入的对象 2.代码实现 import org.apache.struts2.ServletActionContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.suppo

  • 使用spring容器在初始化Bean时前和后的操作

    目录 spring容器初始化Bean操作 @PostConstruct和@PreDestroy注解 在XML中定义init-method和destory-method方法 Bean实现InitializingBean和DisposableBean接口 Spring bean 初始化顺序 1.概述 2.InitializingBean vs init-method 3.@PostConstruct 4.小结一下吧 spring容器初始化Bean操作 在某些情况下,Spring容器在初始化Bean的

  • Spring容器中已经存在的Bean替换示例

    目录 一.背景 二.需求 三.实现思路 四.实现步骤 1.模拟第三方jar包实现并加入Spring容器中 2.自己提供一个实现 3.替换掉jar包默认的实现 4.进行测试 一.背景 我们在开发的过程中,经常会引入别人写的jar包实现某些功能.而别人的jar包一般都自动注入Spring容器中,假设别人都是通过@Bean或@Component注入的,并且没有加入@ConditionalXXX等注解,导致自己无法替换掉别人的实现,假设这个时候我就是想替换掉,那么该如何实现呢? 二.需求 由上图可知,我

  • 如何动态替换Spring容器中的Bean

    目录 动态替换Spring容器中的Bean 原因 方案 实现 Spring中bean替换问题 动态替换Spring容器中的Bean 原因 最近在编写单测时,发现使用 Mock 工具预定义 Service 中方法的行为特别难用,而且无法精细化的实现自定义的行为,因此想要在 Spring 容器运行过程中使用自定义 Mock 对象,该对象能够代替实际的 Bean 的给定方法. 方案 创建一个 Mock 注解,并且在 Spring 容器注册完所有的 Bean 之后,解析 classpath 下所有引入该

  • 浅谈spring容器中bean的初始化

    当我们在spring容器中添加一个bean时,如果没有指明它的scope属性,则默认是singleton,也就是单例的. 例如先声明一个bean: public class People { private String name; private String sex; public String getName() { return name; } public void setName(String name) { this.name = name; } public String get

  • JSP 获取spring容器中bean的两种方法总结

    JSP 获取spring容器中bean的方法总结 方案1(Web中使用): ApplicationContext ct = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletActionContext.getServletContext()); logService = (ISysLogService) ct.getBean("sysLogServiceImpl"); 说明:getRequiredWeb

  • SpringBoot普通类获取spring容器中bean的操作

    前言 在spring框架中,是无法在普通类中通过注解注入实例的,因为sping框架在启动的时候,就会将标明交给spring容器管理的类进行实例化,并梳理他们彼此的依赖关系,进行注入,没有交给spring容器管理的普通类,是不会进行注入的,即使你使用了注入的相关注解.这个时候,如果我们需要在普通类中获取spring容器中的实例,就需要一些特定的方法,这里将整理一下如何在springboot中实现这样的方法. 创建springboot工程demo 项目结构图示 项目结构说明 service包下为de

  • 理解 MyBatis 是如何在 Spring 容器中初始化的

    MyBatis 初始化过程就是生成一些必须的对象放到 Spring 容器中.问题是这个过程到底生成了哪些对象?当遇到 MyBatis 初始化失败时,如何正确的找到分析问题的切入点?本文将针对这些问题进行介绍. 本文基于 MyBatis 3 和 Spring,假设读者已经知道如何使用 Maven 和 MyBatis,以及了解 Spring 的容器机制. 一.Mybatis 三件套 我们知道 MyBatis 的主要功能是由 SqlSessionFactory 和 Mapper 两者提供的,初始化 M

  • 普通对象使用spring容器中的对象的实现方法

    引语: 工作中有时候需要在普通的对象中去调用spring管理的对象,但是在普通的java对象直接使用@Autowired或者@Resource的时候会发现被注入的对象是null,会报空指针.我们可以简单的理解为spring是一个公司,它管理的对象就是它的员工,而普通的java对象是其他公司的员工,如果其他公司要找spring公司的员工一起共事没有经过spring公司的同意肯定是不行的. 解决方式: 方法一:如果这个普通对象可以被spring管理的话,最好是直接交给spring管理,这样sprin

随机推荐