場(chǎng)景:需要根據(jù)系統(tǒng)的編碼格式有選擇裝配類(lèi)。
目前累計(jì)服務(wù)客戶(hù)上1000+,積累了豐富的產(chǎn)品開(kāi)發(fā)及服務(wù)經(jīng)驗(yàn)。以網(wǎng)站設(shè)計(jì)水平和技術(shù)實(shí)力,樹(shù)立企業(yè)形象,為客戶(hù)提供成都做網(wǎng)站、網(wǎng)站建設(shè)、網(wǎng)站策劃、網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)絡(luò)營(yíng)銷(xiāo)、VI設(shè)計(jì)、網(wǎng)站改版、漏洞修補(bǔ)等服務(wù)。成都創(chuàng)新互聯(lián)始終以務(wù)實(shí)、誠(chéng)信為根本,不斷創(chuàng)新和提高建站品質(zhì),通過(guò)對(duì)領(lǐng)先技術(shù)的掌握、對(duì)創(chuàng)意設(shè)計(jì)的研究、對(duì)客戶(hù)形象的視覺(jué)傳遞、對(duì)應(yīng)用系統(tǒng)的結(jié)合,為客戶(hù)提供更好的一站式互聯(lián)網(wǎng)解決方案,攜手廣大客戶(hù),共同發(fā)展進(jìn)步。分析:最直接的實(shí)現(xiàn)方式,定義各種編碼格式對(duì)應(yīng)的處理類(lèi),可以通過(guò)System.getProperty("file.encoding")獲得項(xiàng)目的編碼格式,從而通過(guò)條件語(yǔ)句if...else..等方式做相應(yīng)的業(yè)務(wù)處理,然后實(shí)際中一個(gè)項(xiàng)目往往只用到一種編碼格式,如果把所有的編碼處理類(lèi)都裝配到spring容器中,那么造成了浪費(fèi)資源。有沒(méi)有一種更好的方式可以根據(jù)需要只裝配對(duì)象。
答案肯定是有的,SpringBoot框架為我們提供了@Conditional注解
原理:@Conditional實(shí)現(xiàn)的原理就是該注解的值就是一個(gè)繼承了Condition的類(lèi)的集合,而Condition中有個(gè)matches方法。當(dāng)該方法返回
·true:對(duì)象被裝配
·false:對(duì)象不被裝配
1 @FunctionalInterface
2 public interface Condition {
3 boolean matches(ConditionContext var1, AnnotatedTypeMetadata var2);
4 }
Condition源代碼demo代碼
(1)代碼結(jié)構(gòu)
(2)GBKCondition.java類(lèi)實(shí)現(xiàn)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類(lèi)實(shí)現(xiàn)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配置類(lèi),將GBKCondition類(lèi)和UTF8Condition類(lèi)交給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同時(shí)也可以注解類(lèi),返回true時(shí),類(lèi)的注解方法都被裝配,多個(gè)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)應(yīng)用程序入口
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 beansOfType = context.getBeansOfType(EncodingConverter.class);
17 System.out.println(beansOfType);
18 //獲取系統(tǒng)編碼格式變量19 System.out.println(System.getProperty("file.encoding"));
20
21 context.close();
22 }
23
24 }
BootConditionConfigApplication.java(6)打印結(jié)果
{createUTF8EncodingConverter=com.demo.boot.bootconditionconfig.converter.UTF8EncodingConverter@3e2fc448}
UTF-8
至此,實(shí)現(xiàn)了根據(jù)項(xiàng)目編碼格式,有選擇裝配需要對(duì)象實(shí)例
如果該文章對(duì)你有所幫助,請(qǐng)點(diǎn)個(gè)贊支持下,謝謝!