场景:需要根据系统的编码格式有选择装配类。

分析:最直接的实现方式,定义各种编码格式对应的处理类,可以通过System.getProperty("file.encoding")获得项目的编码格式,从而通过条件语句if...else..等方式做相应的业务处理,然后实际中一个项目往往只用到一种编码格式,如果把所有的编码处理类都装配到spring容器中,那么造成了浪费资源。有没有一种更好的方式可以根据需要只装配对象。

答案肯定是有的,SpringBoot框架为我们提供了@Conditional注解

原理:@Conditional实现的原理就是该注解的值就是一个继承了Condition的类的集合,而Condition中有个matches方法。当该方法返回

·true:对象被装配

·false:对象不被装配

  1. @FunctionalInterface
  2. public interface Condition {
  3. boolean matches(ConditionContext var1, AnnotatedTypeMetadata var2);
  4. }

Condition源代码

demo代码

(1)代码结构

(2)GBKCondition.java类实现Condition的matches方法

  1. package com.demo.boot.bootconditionconfig.condition;
  2.  
  3. import org.springframework.context.annotation.Condition;
  4. import org.springframework.context.annotation.ConditionContext;
  5. import org.springframework.core.type.AnnotatedTypeMetadata;
  6.  
  7. public class GBKCondition implements Condition {
  8. @Override
  9. public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
  10. String encoding = System.getProperty("file.encoding");
  11. return "gbk".equals(encoding.toLowerCase());
  12. }
  13. }

GBKCondition.java

(3)UTF8Condition.java类实现Condition的matches方法

  1. package com.demo.boot.bootconditionconfig.condition;
  2.  
  3. import org.springframework.context.annotation.Condition;
  4. import org.springframework.context.annotation.ConditionContext;
  5. import org.springframework.core.type.AnnotatedTypeMetadata;
  6.  
  7. public class UTF8Condition implements Condition {
  8. @Override
  9. public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
  10. String encoding = System.getProperty("file.encoding");
  11. return "utf-8".equals(encoding.toLowerCase());
  12. }
  13. }

UTF8Condition.java

(4)EncodingConverterConfig.java配置类,将GBKCondition类和UTF8Condition类交给SpringBoot容器管理

  1. package com.demo.boot.bootconditionconfig.config;
  2.  
  3. import com.demo.boot.bootconditionconfig.condition.GBKCondition;
  4. import com.demo.boot.bootconditionconfig.condition.UTF8Condition;
  5. import com.demo.boot.bootconditionconfig.converter.EncodingConverter;
  6. import com.demo.boot.bootconditionconfig.converter.GBKEncodingConverter;
  7. import com.demo.boot.bootconditionconfig.converter.UTF8EncodingConverter;
  8. import org.springframework.boot.SpringBootConfiguration;
  9. import org.springframework.context.annotation.Bean;
  10. import org.springframework.context.annotation.Conditional;
  11.  
  12. @SpringBootConfiguration
  13. //@Conditional({UTF8Condition.class,GBKCondition.class})//@Conditional同时也可以注解类,返回true时,类的注解方法都被装配,多个condition之间是“与”逻辑
  14. public class EncodingConverterConfig {
  15. @Bean
  16. @Conditional(UTF8Condition.class)
  17. public EncodingConverter createUTF8EncodingConverter() {
  18. return new UTF8EncodingConverter();
  19. }
  20.  
  21. @Bean
  22. @Conditional(GBKCondition.class)
  23. public EncodingConverter createGBKEncodingConverter() {
  24. return new GBKEncodingConverter();
  25. }
  26. }

EncodingConverterConfig.java

(5)应用程序入口

  1. package com.demo.boot.bootconditionconfig;
  2.  
  3. import com.demo.boot.bootconditionconfig.converter.EncodingConverter;
  4. import org.springframework.boot.SpringApplication;
  5. import org.springframework.boot.autoconfigure.SpringBootApplication;
  6. import org.springframework.context.ConfigurableApplicationContext;
  7.  
  8. import java.util.Map;
  9.  
  10. @SpringBootApplication
  11. public class BootConditionConfigApplication {
  12.  
  13. public static void main(String[] args) {
  14. ConfigurableApplicationContext context = SpringApplication.run(BootConditionConfigApplication.class, args);
  15.  
  16. Map<String, EncodingConverter> beansOfType = context.getBeansOfType(EncodingConverter.class);
  17. System.out.println(beansOfType);
  18. //获取系统编码格式变量
  19. System.out.println(System.getProperty("file.encoding"));
  20.  
  21. context.close();
  22. }
  23.  
  24. }

BootConditionConfigApplication.java

(6)打印结果

  1. {createUTF8EncodingConverter=com.demo.boot.bootconditionconfig.converter.UTF8EncodingConverter@3e2fc448}
  2. UTF-8

至此,实现了根据项目编码格式,有选择装配需要对象实例

SpringBoot框架(3)--条件装配的更多相关文章

  1. SpringBoot框架(4)-- 类装配及Bean装配监听器

    1.普通方式装配类对象   (1)添加带有@Bean注解的方法  User.java(带@Component注解) package com.demo.boot.bootenable.beanDemo1 ...

  2. springBoot按条件装配:Condition

    编码格式转换器接口 package com.boot.condition.bootconditionconfig.converter; /** * 编码格式转换器接口 */ public interf ...

  3. 导图梳理springboot手动、自动装配,让springboot不再难懂

    什么是springboot 在学springboot之前,你必须有spring.spring mvc基础,springboot的诞生其实就是用来简化新Spring应用的初始搭建以及开发过程,该框架使用 ...

  4. SpringBoot学习之自动装配

    在前面使用SSM集成时,我们可以使用注解实现无配置化注入,但是这种依赖被进行“人工干预了的”,换句话就是说我们手动进行装配,那么此时还没有达到SpringBoot这种自动装配的效果,那么究竟Sprin ...

  5. Spring Framework 条件装配 之 @Conditional

    Spring Framework 条件装配 之 @Conditional 前言 了解SpringBoot的小伙伴对Conditional注解一定不会陌生,在SpringBoot项目中,Conditio ...

  6. Spring-Cloud之Spring-Boot框架-1

    一.Spring Boot 是由 Pivotal 团队开发的 Spring 框架,采用了生产就绪的观点 ,旨在简化配置,致力于快速开发. Spring Boot 框架提供了自动装配和起步依赖,使开发人 ...

  7. Springboot框架

    本片文章主要分享一下,Springboot框架为什么那么受欢迎以及如何搭建一个Springboot框架. 我们先了解一下Springboot是个什么东西,它是干什么用的.我是刚开始接触,查了很多资料, ...

  8. Spring框架(3)---IOC装配Bean(注解方式)

    IOC装配Bean(注解方式) 上面一遍文章讲了通过xml来装配Bean,那么这篇来讲注解方式来讲装配Bean对象 注解方式需要在原先的基础上重新配置环境: (1)Component标签举例 1:导入 ...

  9. Springboot 框架学习

    Springboot 框架学习 前言 Spring Boot是Spring 官方的顶级项目之一,她的其他小伙伴还有Spring Cloud.Spring Framework.Spring Data等等 ...

随机推荐

  1. Java学习之==>常用字符串方法

    1.定义字符串 // 定义, 为初始化 String str1; // 定义, 并初始化为null String str2 = null; // 定义, 并初始化为空串 String str3 = & ...

  2. 利用Python进行异常值分析实例代码

    利用Python进行异常值分析实例代码 异常值是指样本中的个别值,也称为离群点,其数值明显偏离其余的观测值.常用检测方法3σ原则和箱型图.其中,3σ原则只适用服从正态分布的数据.在3σ原则下,异常值被 ...

  3. MySQL 5.7.27 MGR 单主/多主+ ProxySQL

    1 MySQL 5.7.27 MGR 多主环境 基础信息如下: centos 6.5/vbox 实例名 A B C IP 10.15.7.29 10.15.7.28 10.15.7.27 实例端口号 ...

  4. Java SE 8 docs——Static Methods、Instance Methods、Abstract Methods、Concrete Methods和field

    一.Static Methods.Instance Methods.Abstract Methods.Concrete Methods ——Static Methods:静态方法 ——Instance ...

  5. XSS-反射型

    前情提要:html的dom对象:document 如document.cookie  / document.write() http://netsecurity.51cto.com/art/20131 ...

  6. css样式,媒体查询,垂直居中,js对象

    下面是一些截图,有关查询效率,css样式,媒体查询,垂直居中,js基本类型.  

  7. Spring Boot 2.0 多数据源编程

    多数据源配置 创建一个Spring配置类,定义两个DataSource用来读取application.properties中的不同配置.如下例子中,主数据源配置为spring.datasource.p ...

  8. deepin下安装Qt5&以及部分问题解决

    deepin安装Qt5 1 deepin商店里的Qt5版本太低,可以直接下载官方的Qt5安装包: 官方下载渠道:http://www.qt.io/download-open-source/ 离线镜像下 ...

  9. Book - 《Python编程:从入门到实践》

    Tag:看<Python编程:从入门到实践>学习笔记 数据类型相关: 字符串str 改变大小写(临时):title首字母大写,upper全大写,lower全小写 删除空白(临时):rstr ...

  10. Mysql数据库表结构设计准则

    一:动静分离 解释:最好做好静态表和动态表的分离.这里解释一下静态表和动态表的含义,静态表:存储着一些固定不变的资源,比如城市/地区名/国家(静态表一定要使用缓存).动态表:一些频繁修改的表 二:关于 ...