SpringBoot框架--条件装配
Posted lfhappy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot框架--条件装配相关的知识,希望对你有一定的参考价值。
场景:需要根据系统的编码格式有选择装配类。
分析:最直接的实现方式,定义各种编码格式对应的处理类,可以通过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
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
(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
(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
(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
(6)打印结果
createUTF8EncodingConverter=co[email protected]3e2fc448
UTF-8
至此,实现了根据项目编码格式,有选择装配需要对象实例
以上是关于SpringBoot框架--条件装配的主要内容,如果未能解决你的问题,请参考以下文章
《SpringBoot系列十三》:图文精讲@Conditional条件装配实现原理
程序员必备技能之SpringBoot的自动装配原理,很详细,建议收藏!!!