SpringBoot的自动配置
1、根据条件来装配bean,SpringBoot的自动配置,根据条件进行自动配置。
首先创建一个接口,如下所示:
package com.bie.encoding; /** * * @Description TODO * @author biehl * @Date 2018年12月31日 上午10:57:07 * */ public interface EncodingConvert { }
然后创建两个实现类,这个只是举例说明了其功能,举得字符编码的栗子:
package com.bie.encoding; /** * * @Description TODO * @author biehl * @Date 2018年12月31日 上午10:56:46 * */ public class GBKEncodingConvert implements EncodingConvert{ }
package com.bie.encoding; /** * * @Description TODO * @author biehl * @Date 2018年12月31日 上午10:56:58 * */ public class UTF8EncodingConvert implements EncodingConvert{ }
将GBK和UTF8的类进行装配:
实现了Condition接口的类也添加了,自己可以进行对比操作。
基于条件的自动装配,一般配合Condition接口一起使用,只有接口的实现类返回true,才装配,否则不装配。它可以用在方法上面,则直怼方法起作用,还可以用在类上面,则对该类下面的所有方法起作用。
@Conditional的参数值是一个数组,所以可以传递多个值进去,这样只有当所有都返回true的时候才会执行。否则不执行。
1 package com.bie.encoding; 2 3 import org.springframework.boot.SpringBootConfiguration; 4 import org.springframework.context.annotation.Bean; 5 import org.springframework.context.annotation.Conditional; 6 7 /** 8 * 9 * @Description TODO 10 * @author biehl 11 * @Date 2018年12月31日 上午11:05:22 12 * 13 */ 14 @SpringBootConfiguration //@SpringBootConfiguration和@Configuration作用和效果一样的 15 public class EncodingConvertConfiguration { 16 17 /** 18 * 装配 19 * @return 20 */ 21 @Bean 22 @Conditional(UTF8Condition.class) 23 public EncodingConvert createUTF8EncodingConvert() { 24 return new UTF8EncodingConvert(); 25 } 26 27 /** 28 * 装配 29 * @return 30 */ 31 @Bean 32 @Conditional(GBKCondition.class) 33 public EncodingConvert createGBKEncodingConvert() { 34 return new GBKEncodingConvert(); 35 } 36 37 }
然后可以写一个主类,不自动装配看看效果如何,然后装配了效果如何:
1 package com.bie; 2 3 import org.springframework.boot.SpringApplication; 4 import org.springframework.boot.autoconfigure.SpringBootApplication; 5 import org.springframework.context.ConfigurableApplicationContext; 6 7 import com.bie.encoding.EncodingConvert; 8 9 /** 10 * 11 * @Description TODO 12 * @author biehl 13 * @Date 2018年12月31日 上午11:08:47 14 * 15 */ 16 @SpringBootApplication 17 public class EncodingConvertApplication { 18 19 public static void main(String[] args) { 20 ConfigurableApplicationContext context = SpringApplication.run(EncodingConvertApplication.class, args); 21 //未装配的现象,将gbk和utf8都打印输出 22 //装配的现象是,只输出了utf8的 23 String encoding = System.getProperty("file.encoding"); 24 System.out.println("encoding : " + encoding); 25 System.out.println(context.getBeansOfType(EncodingConvert.class)); 26 27 28 29 //关闭 30 context.close(); 31 } 32 33 34 35 36 }
下面将实现Condition接口的实现类,来实现SpringBoot的自动装配:
package com.bie.encoding; import org.springframework.context.annotation.Condition; import org.springframework.context.annotation.ConditionContext; import org.springframework.core.type.AnnotatedTypeMetadata; /** * * @Description TODO * @author biehl * @Date 2018年12月31日 上午11:16:09 * 1、true表示装配,false表示不装配。 */ public class UTF8Condition implements Condition{ @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { String encoding = System.getProperty("file.encoding"); if(encoding != null) { return "utf-8".equals(encoding.toLowerCase()); } //true表示装配,false表示不装配。 return false; } }
package com.bie.encoding; import org.springframework.context.annotation.Condition; import org.springframework.context.annotation.ConditionContext; import org.springframework.core.type.AnnotatedTypeMetadata; /** * * @Description TODO * @author biehl * @Date 2018年12月31日 上午11:13:13 * 1、true表示装配,false表示不装配。 */ public class GBKCondition implements Condition{ /** * */ public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { String encoding = System.getProperty("file.encoding"); if(encoding != null) { return "gbk".equals(encoding.toLowerCase()); } //true表示装配,false表示不装配。 return false; } }
运行效果如下所示:
SpringBoot的自动装配的类可以查看源码,位置如下所示:
待续......