SpringBoot框架(3)--条件装配
场景:需要根据系统的编码格式有选择装配类。
分析:最直接的实现方式,定义各种编码格式对应的处理类,可以通过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)--条件装配的更多相关文章
- SpringBoot框架(4)-- 类装配及Bean装配监听器
1.普通方式装配类对象 (1)添加带有@Bean注解的方法 User.java(带@Component注解) package com.demo.boot.bootenable.beanDemo1 ...
- springBoot按条件装配:Condition
编码格式转换器接口 package com.boot.condition.bootconditionconfig.converter; /** * 编码格式转换器接口 */ public interf ...
- 导图梳理springboot手动、自动装配,让springboot不再难懂
什么是springboot 在学springboot之前,你必须有spring.spring mvc基础,springboot的诞生其实就是用来简化新Spring应用的初始搭建以及开发过程,该框架使用 ...
- SpringBoot学习之自动装配
在前面使用SSM集成时,我们可以使用注解实现无配置化注入,但是这种依赖被进行“人工干预了的”,换句话就是说我们手动进行装配,那么此时还没有达到SpringBoot这种自动装配的效果,那么究竟Sprin ...
- Spring Framework 条件装配 之 @Conditional
Spring Framework 条件装配 之 @Conditional 前言 了解SpringBoot的小伙伴对Conditional注解一定不会陌生,在SpringBoot项目中,Conditio ...
- Spring-Cloud之Spring-Boot框架-1
一.Spring Boot 是由 Pivotal 团队开发的 Spring 框架,采用了生产就绪的观点 ,旨在简化配置,致力于快速开发. Spring Boot 框架提供了自动装配和起步依赖,使开发人 ...
- Springboot框架
本片文章主要分享一下,Springboot框架为什么那么受欢迎以及如何搭建一个Springboot框架. 我们先了解一下Springboot是个什么东西,它是干什么用的.我是刚开始接触,查了很多资料, ...
- Spring框架(3)---IOC装配Bean(注解方式)
IOC装配Bean(注解方式) 上面一遍文章讲了通过xml来装配Bean,那么这篇来讲注解方式来讲装配Bean对象 注解方式需要在原先的基础上重新配置环境: (1)Component标签举例 1:导入 ...
- Springboot 框架学习
Springboot 框架学习 前言 Spring Boot是Spring 官方的顶级项目之一,她的其他小伙伴还有Spring Cloud.Spring Framework.Spring Data等等 ...
随机推荐
- python实现矩阵乘法的方法
python实现矩阵乘法的方法 本文实例讲述了python实现矩阵乘法的方法.分享给大家供大家参考. 具体实现方法如下: def matrixMul(A, B): res = [[0] * l ...
- rhel安装ambari
RHEL/CentOS/Oracle Linux 6 On a server host that has Internet access, use a command line editor to p ...
- 原生js之addEventListener,removeEventListener
使用addEventListener添加事件 <!DOCTYPE html> <html lang="en"> <head> <meta ...
- #Java学习之路——基础阶段二(第十二篇)
我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...
- ps和top进程监控
一.名词解释 1.什么是进程(what is process)? 答:进程是程序运行的过程,伴有动态,生命和运行状态.(组成:1.已分配内存的地址空间 2.安全属性,包括所有权凭据和特权 3.程序 ...
- 【LeetCode】122、买卖股票的最佳时机 II
Best Time to Buy and Sell Stock II 题目等级:Easy 题目描述: Say you have an array for which the ith element i ...
- java中enum----枚举的学习(更新中)
package com.hdmaxfun; import java.util.Scanner; import com.icpc.Icpm; import java.util.HashMap; impo ...
- 关于add migration 报错的问题解决方案
The current CSharpHelper cannot scaffold literals of type 'Microsoft.EntityFrameworkCore.Metadata.In ...
- Sqlserver 2012附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法
环境: Win10系统 SQLSERver 2012 情况: 使用混合登陆方式,sa账户密码正确登陆后,附加.mdf文件出现此错误. 尝试解决方法一:使用管理员运行SQLSERver2012,sa账户 ...
- CentOS7Linux中服务器LVS负载均衡、高可用集群搭建(NAT、DR);
目录 集群 声明 集群概念 集群特性 Web服务器并发相应瓶颈 集群的分类 LB实现方法: LVS集群 负载调度器 服务器池 共享存储 LVS负载均衡的三种模式 负载均衡 集群 声明 文档不断更新中. ...