Spring框架之接口实现覆盖(接口功能扩展)

  在日常开发中,存在着这种一种场景,框架对接口A提供了一个种默认的实现AImpl,随着需求的变更,现今AImpl不能满足了功能需要,这时,我们该怎么办? 当然是修改AImpl的实现代码了,但是,如果它是第三方依赖呢? 或者说,我们自己写了的某个功能模块,AImpl是我们为此模块提供的一种默认实现,用户可以使用它,也可以按需求进行覆盖(或者说是扩展),该怎么办?

  对此,spring为我们提供了@Conditional注解,使用它可以很好的解决此类问题。

  下面,举个例子。 有个RandomGenerator接口,接口里面有个generator()方法生成随机字符串,有两个实现类StringRandomGenerator和NumberRandomGenerator, 其中StringRandomGenerator是默认实现。也就是说,在我们不配置NumberRandomGenerator时,程序使用StringRandomGenerator生成随机字符串,在我们有配置NumberRandomGenerator时,程序使用NumberRandomGenerator生成随机字符串。

/**
 * 生成随机字符串的顶层接口
 */
public interface RandomGenerator {
    Object generator();
}
import org.apache.commons.lang.RandomStringUtils;

public class StringRandomGenerator implements RandomGenerator {
    @Override
    public Object generator() {
        char[] chars = {‘a‘,‘b‘,‘c‘,‘d‘,‘e‘,‘f‘,‘g‘};
        String random = RandomStringUtils.random(5, chars);
        return "StringRandomGenerator:"+random;
    }
}
/**
 * 将NumberRandomGenerator 注册成spring bean时,StringRandomGenerator 失效
 * 相当于是NumberRandomGenerator中的generator方法覆盖了 StringRandomGenerator 中的generator方法
 */
@Component
public class NumberRandomGenerator implements RandomGenerator {
    @Override
    public Object generator() {
        String random = RandomStringUtils.random(5, true, true);
        return "NumberRandomGenerator:" + random;
    }
}
/**
 * 配置类
 */
@SpringBootConfiguration
public class RandomGeneratorConfig {

    /**
     *  @ConditionalOnMissingBean(value = RandomGenerator.class)
     *  该注解的意思是: 如果Ioc容器中没有 RandomGenerator 类型的 bean时
     *  就将StringRandomGenerator注册到Ioc容器中
     */
    @Bean
    @ConditionalOnMissingBean(value = RandomGenerator.class)
    public RandomGenerator stringRandomGenerator() {
        return new StringRandomGenerator();
    }
}

最后写个controller来测试一把

@RestController
public class RandomController {
    @Autowired
    private RandomGenerator randomGenerator;

    @GetMapping("/random")
    public Object random() {
        return randomGenerator.generator();
    }
}

在将NumberRandomGenerator 注册到Ioc容器的情况下,测试结果如下:

接下来,我们将NumberRandomGenerator类上中@Component注解干掉,再测试

完美!

原文地址:https://www.cnblogs.com/z-qinfeng/p/11785553.html

时间: 2024-10-27 12:15:06

Spring框架之接口实现覆盖(接口功能扩展)的相关文章

Spring 框架的架包分析、功能作用、优点,及jar架包简介

Spring 框架的架包详解    Spring的作用     Spring的优势 由于刚搭建完一个MVC框架,决定分享一下我搭建过程中学习到的一些东西.我觉得不管你是个初级程序员还是高级程序员抑或是软件架构师,在学习和了解一个框架的时候,首先都应该知道的是这个框架的原理和与其有关jar的作用.关系.这篇文章总结一下spring框架的相关知识. 一.spirng的简介(高手可以跳过) Spring是一个开源框架,它由Rod Johnson创建.它是为了解决企业应用开发的复杂性而创建的.Sprin

Spring框架4大原则和主要功能

Spring框架4大原则: 使用POJO进行轻量级和最小侵入式开发 POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称. 2.      通过控制反转IoC.依赖注入DI和基于接口编程实现降低耦合度 3.      通过AOP(面向切面)和 默认惯例 进行声明式编程 4.      使用AOP和模板编程减少模式化代码. Spring框架的主要功能          基于Java Beans的配置管

Spring框架下使用AOP实现日志功能

1 首先定义一个注解类: 新建一个接口并在interface前面添加@ public @interface LogAnnotation{ }

Spring框架之学习总结

Spring 框架 是一个分层架构,由 7 个定义良好的模块组成. Spring模块构建在核心容器之上,核心容器定义了创建.配置和管理 bean 的方式, 组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现. 核心容器:核心容器提供 Spring 框架的基本功能.核心容器的主要组件是 BeanFactory,它是工厂模式的实现.BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开. Spring MV

Spring框架事务支持模型的优势

全局事务 全局事务支持对多个事务性资源的操作,通常是关系型数据库和消息队列.应用服务器通过JTA管理全局性事务,API非常烦琐.UserTransaction通常需要从JNDI获取,意味着需要与JNDI绑定在一起,且JTA一般只在应用服务器可用,降低了应用代码的可重用性. 本地事务 本地事务面向具体的资源,例如与JDBC连接关联的事务.本地事务易于使用,但不能跨多个事务性资源.使用JDBC管理事务的代码不能在全局JTA事务中运行,因此不能确保跨多个资源的正确性.且本地事务侵入了编程模型. Spr

Spring框架和MVC原理

Spring框架和MVC原理 目录 Spring框架 SpringMVC工作原理 参考资料 回到顶部 Spring框架 Spring当前框架有20个jar包,大致可以分为6大模块: Core Container AOP and Instrumentation Messaging Data Access/Integration Web Test Spring框架提供了非常丰富的功能,因此整个架构也很庞大. 在我们实际的应用开发中,并不一定要使用所有的功能,而是可以根据需要选择合适的Spring模块

Spring框架介绍

Spring框架介绍---本文内容主要来源:http://www.cnblogs.com/jingmoxukong/p/4506493.html Spring当前框架有20个jar包,大致可以分为6大模块: Core Container AOP and Instrumentation Messaging Data Access/Integration Web Test Spring框架提供了非常丰富的功能,因此整个架构也很庞大. 在我们实际的应用开发中,并不一定要使用所有的功能,而是可以根据需要

设计模式在 Spring 框架中的良好应用

在开始正文之前,请你先思考几个问题: 你项目中有使用哪些 GOF 设计模式 说一说 GOF 23 种设计模式的设计理念 说说 Spring 框架中如何实现设计模式 假设我是面试官问起了你这些面试题,你该如何回答呢,请先思考一分钟. 好的,我们开始进入正题.设计模式实践里面提供了许多经久不衰的解决方案和最佳方案.这里,GOF 设计模式主要分为三大类:创建模式.结构模式和行为模式.创建模式对于创建对象实例非常有用.结构模式通过处理类或对象的组合来作用于企业级应用的设计结构,从而降低了应用的复杂性,提

spring框架学习(五)注解

spring框架学习(五)注解 注解Annotation,是一种类似注释的机制,在代码中添加注解可以在之后某时间使用这些信息.跟注释不同的是,注释是给我们看的,java虚拟机不会编译,注解也是不编译的,但是我们可以通过反射机制去读取注解中的信息.注解使用关键字@interface,继承java.lang.annotition.Annotition spring框架为我们提供了注解功能. 使用注解编程,主要是为了替代xml文件,使开发更加快速.但是,xml文件的使用就是解决修改程序修改源代码,现在