SpringBoot框架(3)--条件装配

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

分析:最直接的实现方式,定义各种编码格式对应的处理类,可以通过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)打印结果

{createUTF8EncodingConverter=co[email protected]3e2fc448}
UTF-8

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

原文地址:https://www.cnblogs.com/lfhappy/p/11028474.html

时间: 2024-08-30 16:57:22

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

spring-boot框架下的websocket服务

这几天在做web端实时展示服务端日志文件新增内容的功能.要满足实时的需求,我选择的方案是在web端跟服务端建立一个websocket链接,由服务端通过tail -f 命令将文件新增内容发送给web端. 关于websocket的介绍,可以参考这篇博文:http://www.cnblogs.com/lizhenghn/p/5155933.html(链接仅用于学习交流,如有版权问题请及时告知).这里我主要想介绍的是在spring-boot框架下如何发布websocket服务. 一.在服务端发布webs

Springboot 框架学习

Springboot 框架学习 前言 Spring Boot是Spring 官方的顶级项目之一,她的其他小伙伴还有Spring Cloud.Spring Framework.Spring Data等等. 简介 Spring Boot可以轻松创建单独的,基于生产级的Spring应用程序,您需要做的可能"仅仅是去运行". 我们提供了Spring Platform对Spring 框架和第三方库进行处理,尽可能的降低使用的复杂度.大多数情况下Spring Boot应用只需要非常少的配置. Fe

SpringBoot框架的权限管理系统

springBoot框架的权限管理系统,支持操作权限和数据权限,后端采用springBoot,MyBatis,Shiro,前端使用adminLTE,Vue.js,bootstrap-table.tree-grid.layer,对前后端进行封装,可快速实现crud的操作,基于项目结构采用代码生成器可生成前端后台的部分代码,更加方便地进行二次开发,项目采用maven构建,方便扩展自定义模块. 项目介绍 一个轻量级的java快速开发平台,能快速开发项目并交付 具有以下特点: 友好的代码结构以及注释,便

Springboot框架了解与搭建(1)

在上一章,我讲解了React+node+express相应的框架搭建,一个项目只有一个前端框架够么,当然不够啦!!! 所以这节我们就来讲后台springboot框架的搭建和相关原理吧~~~版本(2.1.0) 1.搭建Springboot所需要的前提 ①JDK8 或 JDK9 ②Maven3.2+ 或 Gradle4.0+版本(我的随笔内用的都是Maven) 2. 到底什么是Springboot么,让我们来看下图 意思就是: Springboot是Spring框架的集成,相比Spring框架, 除

springBoot框架的搭建

1新建一个项目: 2.注意选择JDK1.8,和选择spring initializr加载springBoot相关jar包: 3.下一步next: 4.下一步next,选择Web和MyBatis然后next,finish就完成了一个SpringBoot框架的搭建了: 5.测试一下搭建的项目是不是可以启动运行,新建一个Hello类,写一个hello方法: 6.因为SpringBoot是默认加载数据源的所以加上@EnableAutoConfiguration(exclude = {DataSource

SpringBoot框架学习(一)

我没什么时间来认认真真写一个系列,只能把日常学到的东西总结巩固一下. 这篇内容: 1.自我理解的SpringBoot使用感悟. 2.一些注解的理解. 3.restful风格 4.微服务与SpringCloud 1.SpringBoot使用感悟 SpringBoot框架我才刚刚实现hello world!的程度,但是在学习该框架的过程中我对Spring框架以及注解技术有了更深层次的理解. Spring框架的控制反转.AOP在极大的减小了开发压力,实用配置文件设置依赖关系既实现了解耦,也提高了开发效

Spring Boot 2 实践记录之 条件装配

实验项目是想要使用多种数据库访问方式,比如 JPA 和 MyBatis. 项目的 Service 层业务逻辑相同,只是具体实现代码不同,自然是一组接口,两组实现类的架构比较合理. 不过这种模式却有一个问题,如果 Bean 是按实现类装配,则在切换数据库访问方式时,就需要大量的代码修改.如果按接口装配,则会出现歧义(同一接口有两个实现,无法自动装配). 虽然可以使用「首选Bean」或「限定」装配,但是与直接使用实现类装配一样,切换数据库访问地,仍然要大量修改源码. 经过实验,使用「条件装配」实现了

小程序后端项目【Springboot框架】部署到阿里云服务器【支持https访问】

前言: 我的后端项目是Java写的,用的Springboot框架.在部署服务器并配置https访问过程中,因为做了一些令人窒息的操作(事后发现),所以老是不能成功. 不成功具体点说就是:域名地址可以正常访问(http/https均可),而部署在服务器上的API仍然只能通过http访问,通过https访问会显示不安全连接! 通过提交工单,得到阿里云工作人员的帮助,他们给出了答案: 然后我想,我好像知道是咋回事了呢. 1. Springboot框架是内嵌有tomcat的!!我只是把项目打成Jar包放

安装爬虫 scrapy 框架前提条件

安装爬虫 scrapy 框架前提条件 (不然 会 报错) 1 pip install pypiwin32 原文地址:https://www.cnblogs.com/xmdykf/p/11374484.html