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的自动装配的类可以查看源码,位置如下所示:
待续......