在日常开发中,存在着这种一种场景,框架对接口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注解干掉,再测试

完美!

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

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

    Spring 框架的架包详解    Spring的作用     Spring的优势  由于刚搭建完一个MVC框架,决定分享一下我搭建过程中学习到的一些东西.我觉得不管你是个初级程序员还是高级程序员抑或 ...

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

    Spring框架4大原则: 使用POJO进行轻量级和最小侵入式开发 POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJ ...

  3. springMvc接口开发--对访问的restful api接口进行拦截实现功能扩展

    1.视频参加Spring Security开发安全的REST服务\PART1\PART1 3-7 使用切片拦截REST服务三通it学院-www.santongit.com-.mp4 讲的比较的经典,后 ...

  4. Spring框架之什么是IOC的功能?

    1. 什么是IOC的功能? * IoC -- Inverse of Control,控制反转,将对象的创建权反转给Spring!! * 使用IOC可以解决的程序耦合性高的问题!!  

  5. Spring框架学习 - 配置

    [资料] ★★☆ Spring 中提供一些Aware相关接口,像是BeanFactoryAware. ApplicationContextAware.ResourceLoaderAware.Servl ...

  6. Spring框架和MVC原理

    Spring框架和MVC原理 目录 Spring框架 SpringMVC工作原理 参考资料 回到顶部 Spring框架 Spring当前框架有20个jar包,大致可以分为6大模块: Core Cont ...

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

    全局事务 全局事务支持对多个事务性资源的操作,通常是关系型数据库和消息队列.应用服务器通过JTA管理全局性事务,API非常烦琐.UserTransaction通常需要从JNDI获取,意味着需要与JND ...

  8. 漫谈 GOF 设计模式在 Spring 框架中的实现

    原文地址:梁桂钊的博客 博客地址:http://blog.720ui.com 欢迎关注公众号:「服务端思维」.一群同频者,一起成长,一起精进,打破认知的局限性. 漫谈 GOF 设计模式在 Spring ...

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

    在开始正文之前,请你先思考几个问题: 你项目中有使用哪些 GOF 设计模式 说一说 GOF 23 种设计模式的设计理念 说说 Spring 框架中如何实现设计模式 假设我是面试官问起了你这些面试题,你 ...

随机推荐

  1. VS2017中英文切换

    离线安装完成, --fix 检查下是否完整 安装时没有勾选的项, 可以下次再补安装 安装时出现缺少*.vsix 如:microsoft.visualstudio.webtoolsextensions. ...

  2. 软件-Jenkins:Jenkins 百科

    ylbtech-软件-Jenkins:Jenkins 百科 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续 ...

  3. 【MEAN Web开发】CentOS 7 安装MongoDB 3.2.3

    偶然得了一本书,AmosQ.Haviv 所著 <MEAN Web开发>.起初并不知道这啥东西,看了下目录发现正好有讲MongoDB而已.当时的项目正好需要做MongoDB的内容,之后这书就 ...

  4. Oracle-数据表对象

    表一般指的是一个关系表,也可以生成对象表以及临时表.齐总,对象表是通过用户定义的数据类型生成的,临时表用于存储专用于某个事务或会话的临时数据 字符类型: 定长:char (1-2000字节) 变长:v ...

  5. Nginx 在各种语言框架下的配置 - 以 codeigniter 为例

    对于各种语言常用的框架,Nginx 在官方的 Wiki 页面的 入门 部分提供了示例配置文件.具体可以参考这个页面的 Pre-canned Configurations 部分,这里列出了各种框架. 直 ...

  6. 16/7/27-PHP环境配置(php5.5.3.7+mysql5.7.12+Apache2.4)

    非常感谢http://www.cnblogs.com/jicheng1014/archive/2012/01/26/2329531.html 配置php环境问题 php.ini 路径 "\& ...

  7. 文件上传: FileItem类、ServletFileUpload 类、DiskFileItemFactory类

    文件上传: ServletFileUpload负责处理上传的文件数据,并将表单中每个输入项封装成一个FileItem对象中, 在使用ServletFileUpload对象解析请求时需要根据DiskFi ...

  8. Git013--多人协作

    Git--多人协作 本文来自于:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/ ...

  9. c#Cache的用法

    public class Cache { /// <summary> /// 获取数据缓存 /// </summary> /// <param name="ca ...

  10. spring security简单教程以及实现完全前后端分离

    spring security是spring家族的一个安全框架,入门简单.对比shiro,它自带登录页面,自动完成登录操作.权限过滤时支持http方法过滤. 在新手入门使用时,只需要简单的配置,即可实 ...