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

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

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

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

·true:对象被装配

·false:对象不被装配

 @FunctionalInterface
public interface Condition {
boolean matches(ConditionContext var1, AnnotatedTypeMetadata var2);
}

Condition源代码

demo代码

(1)代码结构

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

 package com.demo.boot.bootconditionconfig.condition;

 import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata; public class GBKCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
String encoding = System.getProperty("file.encoding");
return "gbk".equals(encoding.toLowerCase());
}
}

GBKCondition.java

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

 package com.demo.boot.bootconditionconfig.condition;

 import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata; public class UTF8Condition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
String encoding = System.getProperty("file.encoding");
return "utf-8".equals(encoding.toLowerCase());
}
}

UTF8Condition.java

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

 package com.demo.boot.bootconditionconfig.config;

 import com.demo.boot.bootconditionconfig.condition.GBKCondition;
import com.demo.boot.bootconditionconfig.condition.UTF8Condition;
import com.demo.boot.bootconditionconfig.converter.EncodingConverter;
import com.demo.boot.bootconditionconfig.converter.GBKEncodingConverter;
import com.demo.boot.bootconditionconfig.converter.UTF8EncodingConverter;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional; @SpringBootConfiguration
//@Conditional({UTF8Condition.class,GBKCondition.class})//@Conditional同时也可以注解类,返回true时,类的注解方法都被装配,多个condition之间是“与”逻辑
public class EncodingConverterConfig {
@Bean
@Conditional(UTF8Condition.class)
public EncodingConverter createUTF8EncodingConverter() {
return new UTF8EncodingConverter();
} @Bean
@Conditional(GBKCondition.class)
public EncodingConverter createGBKEncodingConverter() {
return new GBKEncodingConverter();
}
}

EncodingConverterConfig.java

(5)应用程序入口

 package com.demo.boot.bootconditionconfig;

 import com.demo.boot.bootconditionconfig.converter.EncodingConverter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext; import java.util.Map; @SpringBootApplication
public class BootConditionConfigApplication { public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(BootConditionConfigApplication.class, args); Map<String, EncodingConverter> beansOfType = context.getBeansOfType(EncodingConverter.class);
System.out.println(beansOfType);
//获取系统编码格式变量
System.out.println(System.getProperty("file.encoding")); context.close();
} }

BootConditionConfigApplication.java

(6)打印结果

{createUTF8EncodingConverter=com.demo.boot.bootconditionconfig.converter.UTF8EncodingConverter@3e2fc448}
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. python的一些方法

    1.如何循环获得下标,使用 enumerate ints = ['a','b','c','d','e','f'] for idx, val in enumerate(ints): print idx, ...

  2. etcd节点扩容至两个节点

    本篇已经安装了单个etcd,然后进行扩容etcd节点至2个,安装单节点请参照:https://www.cnblogs.com/effortsing/p/10295261.html 实验架构 test1 ...

  3. 精通CSS:高级Web标准解决方案(第二版) 初读笔记

    2.1 常用的选择器 1. 类型选择器  p { color: black; } 2. 后代选择器  blockquote p { padding-left: 2em; } 3. ID选择器  #in ...

  4. 依赖注入——angular

    在Angular中创建一个对象时,需要依赖另一个对象,这是代码层的一种依赖关系,当这种依赖被声明后,Angular通过injector注入器将所依赖的对象进行注入操作. 一.依赖注入的原理 看下面的示 ...

  5. WebLogic下Argument(s) "type" can't be null.

    启动项目出现Argument(s) "type" can't be null.异常.异常如下: java.lang.IllegalArgumentException: Argume ...

  6. Java中遍历容器List、Map、Set的方法总结

    List List<String> list = new ArrayList<>(); list.add("张三"); list.add("李四& ...

  7. 二叉平衡树AVL的插入与删除(java实现)

    二叉平衡树 全图基础解释参考链接:http://btechsmartclass.com/data_structures/avl-trees.html 二叉平衡树:https://www.cnblogs ...

  8. c++ release和debug语句分离

    #ifdef _DEBUG a=1; #else a=2; #endif

  9. c语言1作业07

    这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-4/homework/9932 我在这个课程的目 ...

  10. java中的多态关系的运用

    1.多态发生的三个必备条件 继承.重写.父类引用指向子类对象 2.注意 当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误:如果有,再去调用子类的同名方法. 方法的重写,也就是 ...