【引言】

在前面的博客中,了解了Spring Boot的自动装配是如何实现的,这只是一个基础,对于自动装配,更专业的使用是可以做到条件化自动装配。

【条件注解】

Spring Boot中,提供了以下条件化注解:

条件化注解 配置生效条件
@ConditionalOnClass Classpath里有指定的类
@ConditionalOnMissingClass Classpath里缺少指定的类
@ConditionalOnBean 配置了某个特定Bean
@ConditionalOnMissingBean 没有配置特定的Bean
@ConditionalOnProperty 指定的配置属性要有一个明确的值
@ConditionalOnResource Classpath里有指定的资源
@ConditionalOnWebApplication 这是一个Web应用程序
@ConditionalOnNotWebApplication 这不是一个Web应用程序
@ConditionalOnExpression 给定的SpEL表达式计算结果为true

【Class条件注解】

下面借助上篇博客中自定义starter的first-springboot-starter工程,看下Class条件注解的使用会出现什么样的结果呢?

在工程中,我们定义了一个默认的输出方法类DefaultFormatter,下面添加一个输出JSON格式的实现类,JsonFormatter。

1. 添加Jackson依赖到pom.xml

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.9</version><optional>true</optional>
</dependency>

2. 新增Json格式输出类

public class JsonFormatter implements Formatter {private final ObjectMapper objectMapper;public JsonFormatter(){this.objectMapper=new ObjectMapper();}@Overridepublic String format(Object object) {try {return objectMapper.writeValueAsString(object);}catch (JsonProcessingException e){throw new IllegalArgumentException(e);}}
}

3. 新增JsonFormatter Bean声明到FormatterAutoConfiguration

@Configuration
public class FormatterAutoConfiguration {@Beanpublic Formatter defaultFormatter(){return new DefaultFormatter();}/*** json格式输出* @return*/@Beanpublic Formatter jsonFormatter(){return new JsonFormatter();}
}

这样,在同一个Spring应用上下文中出现了两个Formatter Bean,即DefaultFormatter和JsonFormatter,为避免出现Formatter Bean唯一性冲突,我们便可以利用Class条件注解。

4. 两个Formatter Bean可使用互斥的Class条件注解@ConditionOnMissingClass和@ConditionOnClass,代码修改如下:

@Configuration
public class FormatterAutoConfiguration {@Bean@ConditionalOnMissingClass(value = "com.fasterxml.jackson.databind.ObjectMapper")public Formatter defaultFormatter(){return new DefaultFormatter();}/*** json格式输出* @return*/@Bean@ConditionalOnClass(name = "com.fasterxml.jackson.databind.ObjectMapper")public Formatter jsonFormatter(){return new JsonFormatter();}
}

5. 测试代码

public static void main(String[] args) {ConfigurableApplicationContext context = new SpringApplicationBuilder(TeststarterApplication.class).web(WebApplicationType.NONE).run(args);Map<String,Object> data = new HashMap<>();data.put("date","1025");Formatter formatter = context.getBean(Formatter.class);System.out.printf("%s.formatter.format(data) : %s\n",formatter.getClass().getSimpleName(),formatter.format(data));context.close();
}

上面的运行结果依然是DefaultFormatter:

原因是项目依赖中添加了Optional为true,所以Maven依赖并没有传递到该工程

在该项目中添加json依赖,即可发现结果是json格式化输出的。

通过以上示例,对于Class的条件注解的使用想必也是很清楚了。对于其他的一些条件注解,使用方式也都一样,想要达到什么样的结果,借助条件,也都是可以实现的。

【参考资料】

  1. 官网文档的“49.3 Condition Annotations”章节内容。
  2. Spring Boot编程思想(核心篇)

【Spring Boot】条件化自动装配相关推荐

  1. Spring Security 实战:Spring Boot 下的自动配置

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | 公众号「码农小胖哥」 1. 前言 我们在前几篇 ...

  2. Spring Boot 灵活实现自动配置背后的故事~用起来更香了

    最近一直忙着在做新应届生的员工技术培训和面试 ,培训的则是Spring Boot部分的内容,这部分也是面试常问的点,于是想到了各位读者大大,特地的把内容分享大家一份. 不知道大家第一次搭Spring ...

  3. Spring学习5之自动装配Bean01

    前言 之前我们都是手动装配Bean,但是Spring里面有一个自动装配的方法! 一.自动装配是什么? 自动装配是Spring满足bean依赖一种方式! Spring会在上下文中自动寻找,并自动给bea ...

  4. Struts2与Spring集成中的自动装配策略

    http://www.blogjava.net/jeffma/archive/2010/11/30/339414.html 自动装配即bean之间的依赖关系无需手动配置. 1.    与自动装配有关的 ...

  5. Spring之Bean的自动装配

    Spring从入门到精通–(4)Spring之Bean的自动装配 作者:进击攻城狮 个人主页:欢迎访问我的主页 首发时间:2022年8月5日星期五 订阅专栏:Spring入门到精通 个人信条:星光不问 ...

  6. Spring依赖注入与自动装配

    Spring依赖注入与自动装配 首先推荐狂神说的Spring讲义 1.Beans.xml作用 简而言之,我们通过在beans.xml中进行配置,将各种类交给spring来管理. 2.依赖注入 推荐狂神 ...

  7. spring boot rest接口自动生成文档(包含swagger)

    spring boot rest接口自动生成文档(包含swagger)      写接口免不了写接口文档,但是当文档与代码分开独立演进的时候,会发生很多不同步的问题.         接口描述与代码同 ...

  8. Spring Boot 接口参数自动加解密

    本文标题:Spring Boot 接口参数自动加解密 原始链接: https://www.shuibo.cn/102.html 许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链 ...

  9. Spring基于注解的自动装配

    Spring基于注解的自动装配 基于XML的自动装配是在配置文件的bean里设置autowire属性,有byType,byName的方式.而基于注解的自动装配同样是这样只不过我们直接在成员变量上直接标 ...

最新文章

  1. 爬虫之selenium爬取斗鱼网站
  2. 一些Jquery操作
  3. 云炬随笔20180607
  4. 晋级赛关键一场遇到服务器中途维护,第四届全球争霸赛-大区赛常见问题说明...
  5. Leetcode--200. 岛屿数量
  6. C#LeetCode刷题之#62-不同路径(Unique Paths)
  7. NOIp2014 提高组 Day1 T1 生活大爆炸版石头剪刀布
  8. #今日论文推荐# XAI+网络安全?布兰登大学等最新《可解释人工智能在网络安全应用》综述,33页pdf阐述其现状、挑战、开放问题和未来方向
  9. 从零到一实现一个CNI
  10. 如何正确规范使用论文脚注
  11. H3C防火墙安全域知识、远程登陆及web页面
  12. mysql mtq_mysql重点词汇 - osc_r3mtqivi的个人空间 - OSCHINA - 中文开源技术交流社区
  13. django -- url映射
  14. docker修改镜像
  15. sqlserver 2012实施与管理学习笔记(一):选型和部署之单机部署、故障转移群集与日志传送
  16. 卷积神经网络(CNN)经典模型分析(一)
  17. 你不能错过的高效率工具:第1期
  18. GSoC 从开始到中选
  19. Python+Vue计算机毕业设计教师绩效工资管理l1v8p(源码+程序+LW+部署)
  20. PHP个人逍遥商城系统源码 可商用版

热门文章

  1. 20200616-年中总结
  2. 象棋 UVA 1589
  3. 只身单车游山东(三)
  4. 华为OD机试 - 快递运输
  5. APP推广——六剑战天下
  6. 【HTML】计算机报价单
  7. 使用 Code::Blocks 搭建 LVGL 模拟器仿真环境
  8. ChatGPT专业应用:模拟求职面试
  9. 十进制小数转二进制小数方法
  10. vue3之setup的使用理解