zoukankan      html  css  js  c++  java
  • 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的自动装配的类可以查看源码,位置如下所示:

    待续......

  • 相关阅读:
    Spring--之旅
    体验 Windows 系统 CVM
    基于 CentOS 搭建 WordPress 个人博客
    Codeforces Round #316 (Div. 2)
    BZOJ 1048 [HAOI2007]分割矩阵
    BZOJ 1047 [HAOI2007]理想的正方形
    BZOJ 1045 [HAOI2008] 糖果传递
    BZOJ 1042 [HAOI2008]硬币购物
    BZOJ 1030 [JSOI2007]文本生成器
    BZOJ 第二波刷题开始喽
  • 原文地址:https://www.cnblogs.com/biehongli/p/10201674.html
Copyright © 2011-2022 走看看