美文网首页Spring Boot
SpringBoot自动化配置

SpringBoot自动化配置

作者: yellow_han | 来源:发表于2019-03-07 12:08 被阅读124次

    1、原理

    SpringBoot 自动配置主要通过 @EnableAutoConfiguration@Conditional@EnableConfigurationProperties 或者 @ConfigurationProperties 等几个注解来进行自动配置完成的。

    @EnableAutoConfiguration 开启自动配置,主要作用就是调用 Spring-Core 包里的 loadFactoryNames(),将 autoconfig 包里的已经写好的自动配置加载进来。

    @Conditional 条件注解,通过判断类路径下有没有相应配置的 jar 包来确定是否加载和自动配置这个类。

    @EnableConfigurationProperties 的作用就是,给自动配置提供具体的配置参数,只需要写在 application.properties 中,就可以通过映射写入配置类的 POJO 属性中。

    @SpringBootApplication =》@EnableAutoConfiguration =》@Import({AutoConfigurationImportSelector.class}) =》selectImports

    image.png
    image.png image.png image.png

    2、常用注解详解

    @ConditionalOnBean

    仅仅在当前上下文中存在某个对象时,才会实例化一个Bean

    @ConditionalOnClass

    某个class位于类路径上,才会实例化一个Bean),该注解的参数对应的类必须存在,否则不解析该注解修饰的配置类

    @ConditionalOnExpression

    当表达式为true的时候,才会实例化一个Bean

    @ConditionalOnMissingBean

    仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean,该注解表示,如果存在它修饰的类的bean,则不需要再创建这个bean,可以给该注解传入参数例如
    @ConditionOnMissingBean(name = "example"),这个表示如果name为“example”的bean存在,这该注解修饰的代码块不执行

    @ConditionalOnMissingClass

    某个class类路径上不存在的时候,才会实例化一个Bean

    @ConditionalOnNotWebApplication

    不是web应用时,才会执行

    3、实战

    1、自定义一个core模块,往其他使用core模块的模块自动配置Fastjson

    DefaultFastjsonConfig
    package com.gizhi.beam.core.config;
    import com.alibaba.fastjson.serializer.SerializeConfig;
    import com.alibaba.fastjson.serializer.SerializerFeature;
    import com.alibaba.fastjson.serializer.ToStringSerializer;
    import com.alibaba.fastjson.serializer.ValueFilter;
    import com.alibaba.fastjson.support.config.FastJsonConfig;
    import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.http.MediaType;
    import java.math.BigInteger;
    import java.nio.charset.Charset;
    import java.util.ArrayList;
    import java.util.List;
    
    @Configuration("defaultFastjsonConfig")
    @ConditionalOnClass(com.alibaba.fastjson.JSON.class)
    @ConditionalOnMissingBean(FastJsonHttpMessageConverter.class)
    @ConditionalOnWebApplication
    public class DefaultFastjsonConfig {
    
        @Bean
        public FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
            FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
            converter.setFastJsonConfig(fastjsonConfig());
            converter.setSupportedMediaTypes(getSupportedMediaType());
            return converter;
        }
    
        /**
         * fastjson的配置
         */
        public FastJsonConfig fastjsonConfig() {
            FastJsonConfig fastJsonConfig = new FastJsonConfig();
            fastJsonConfig.setSerializerFeatures(
                    SerializerFeature.PrettyFormat,
                    SerializerFeature.WriteMapNullValue,
                    SerializerFeature.WriteEnumUsingToString
            );
            fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
            ValueFilter valueFilter = new ValueFilter() {
                public Object process(Object o, String s, Object o1) {
                    if (null == o1) {
    
                        o1 = "";
                    }
                    return o1;
                }
            };
            fastJsonConfig.setCharset(Charset.forName("utf-8"));
            fastJsonConfig.setSerializeFilters(valueFilter);
    
            //解决Long转json精度丢失的问题
            SerializeConfig serializeConfig = SerializeConfig.globalInstance;
            serializeConfig.put(BigInteger.class, ToStringSerializer.instance);
            serializeConfig.put(Long.class, ToStringSerializer.instance);
            serializeConfig.put(Long.TYPE, ToStringSerializer.instance);
            fastJsonConfig.setSerializeConfig(serializeConfig);
            return fastJsonConfig;
        }
    
        /**
         * 支持的mediaType类型
         */
        public List<MediaType> getSupportedMediaType() {
            ArrayList<MediaType> mediaTypes = new ArrayList<>();
            mediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
            return mediaTypes;
        }
    
    }
    
    
    在resources里的META-INF里添加文件spring.factories,并写入以下内容
    # AutoConfiguration
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    com.gizhi.beam.core.config.DefaultFastjsonConfig,\
    
    这样在别的模块引用core模块时,将会自动装配DefaultFastjsonConfig

    2、在core模块里写入一份通用mybatis-plus配置,在其他模块应用core模块时即可使用此配置

    DefaultProperties
    package com.gizhi.beam.core.config;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.PropertySource;
    @Configuration
    @PropertySource("classpath:/default-config.properties")
    public class DefaultProperties {
    
    }
    
    
    在resources下新建一份default-config.properties
    mybatis-plus.mapper-locations=classpath*:com/gizhi/beam/**/mapping/*.xml
    mybatis-plus.typeAliasesPackage=com.gizhi.beam.*.entity
    mybatis-plus.global-config.db-config.id-type=id_worker
    mybatis-plus.global-config.db-config.field-strategy=not_empty
    mybatis-plus.global-config.db-config.column-underline=true
    mybatis-plus.global-config.db-config.logic-delete-value=1
    mybatis-plus.global-config.db-config.logic-not-delete-value=0
    mybatis-plus.global-config.db-config.db-type=mysql
    mybatis-plus.global-config.refresh=true
    mybatis-plus.configuration.map-underscore-to-camel-case=true
    mybatis-plus.configuration.cache-enabled=false
    mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
    
    在resources里的META-INF里添加文件spring.factories,并写入以下内容
    # AutoConfiguration
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    com.gizhi.beam.core.config.DefaultFastjsonConfig,\
    com.gizhi.beam.core.config.DefaultProperties
    
    这样在别的模块引用core模块时,将会自动装配DefaultProperties ,注入常用配置。

    3、关注我的公众号,互相学习。

    image.png

    相关文章

      网友评论

        本文标题:SpringBoot自动化配置

        本文链接:https://www.haomeiwen.com/subject/nrdhuqtx.html