zoukankan      html  css  js  c++  java
  • springboot-22-自定义starter

    先说下springboot的运行原理

    springboot最主要的配置 是 @SpringBootApplication

     然后这里面 @EnableAutoCOnfiguration 最为重要, 继续往里跟

     

    可看到通过 @Import 导入了一个 EnableAutoConfigurationImportSelector 的类

    在这个类中, 通过SpringFactoriesLoader.loadFactoryNames方法来扫描所有包下的 spring.factories文件,,, 而在spring-boot-autoconfigure.jar下就有这个文件

    点进去几个注解可发现, 都有这么几个注解: 

    @ConditionalOnBean:              容器中有指定的Bean时
    @ConditionalOnMissingBean:   没有
    
    @ConditionalOnClass:              类路径下游指定的类时 
    @ConditionalOnMissingClass:   没有
    
    @ConditionalOnExpression:      基于spel表达式判断
    @ConditionalOnJava:                基于JVM版本判断
    @ConditionalOnJndi:                 基于JNDI存在的条件下查找指定位置
    @ConditionalOnProperty:          指定的属性是否有指定的值
    @ConditionalOnResource:         类路径是否有指定的值
    @ConditionalOnSingleCadidate: 指定的bean在容器中只有一个, 或者有多个但是指定首选的bean
    
    @ConditionalOnWebApplication: 是Web项目的时候
    @ConditionalOnNotWebApplication: 不是Web项目的时候

     实例分析: 

    找到 HttpEncodingAutoConfiguration 并点击进去: 

    配置类: 
    @Configuration
    @EnableConfigurationProperties(HttpEncodingProperties.class)    // 开启属性注入声明, @Autowired注入
    @ConditionalOnWebApplication
    @ConditionalOnClass(CharacterEncodingFilter.class)      // 在类路径下
    // 配置文件中有这个配置才会生效 @ConditionalOnProperty(prefix
    = "spring.http.encoding", value = "enabled", matchIfMissing = true) public class HttpEncodingAutoConfiguration {   
      // 注入properties
    private final HttpEncodingProperties properties; public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) { this.properties = properties; }
      // 设置 @Bean @ConditionalOnMissingBean(CharacterEncodingFilter.
    class) public CharacterEncodingFilter characterEncodingFilter() { CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter(); filter.setEncoding(this.properties.getCharset().name()); filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST)); filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE)); return filter; } }

     上面需要一个HttpEncodingProperties, 这儿再看一下

    其他属性未列出, 只看需要的: 

    @ConfigurationProperties(prefix = "spring.http.encoding")
    public class HttpEncodingProperties {
    
        public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
        public Charset getCharset() {
            return this.charset;
        }
    
        public void setCharset(Charset charset) {
            this.charset = charset;
        }
    }

    其实是一个用来读取yml配置的安全属性注入的类, 没有配置就默认使用UTF8;

    实战

    新建一个maven项目: 

    pom.xml

    <!-- springboot的自动配置, 自定义starter -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-autoconfigure</artifactId>
            </dependency>

    属性注入类: 

    package com.wenbronk.core.autoconfig;
    
    import org.springframework.boot.context.properties.ConfigurationProperties;
    
    /**
     * 自定义starter的配置类
     * Created by wenbronk on 2017/5/18.
     */
    @ConfigurationProperties(prefix = "hello")
    public class HelloProperties {
    
        public static final String MSG = "world";
    
        private String msg = MSG;
    
        public void setMsg(String msg) {
            this.msg = msg;
        }
    
        public String getMSG() {
            return MSG;
        }
    }

    实例类: 

    package com.wenbronk.core.autoconfig;
    
    /**
     * 执行类
     * 根据这个类是否存在, 来创建这个类的Bean
     * Created by wenbronk on 2017/5/18.
     */
    public class HelloService {
    
        private String msg;
    
        public String sayHello() {
            return "hello" + msg;
        }
    
        public String getMsg() {
            return msg;
        }
    
        public void setMsg(String msg) {
            this.msg = msg;
        }
    
    }

    自动配置类: 

    package com.wenbronk.core.autoconfig;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
    import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
    import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     *
     * 自动配置类
     * Created by wenbronk on 2017/5/18.
     */
    @Configuration
    @EnableConfigurationProperties(HelloProperties.class)       // 声明开启属性注入, 通过 @Autowired注入
    @ConditionalOnClass(HelloService.class)
    @ConditionalOnProperty(prefix = "hello", value = "enabled", matchIfMissing = true)
    public class AutoConfigHello {
    
        @Autowired
        private HelloProperties helloProperties;
    
        @Bean
        @ConditionalOnMissingBean(HelloService.class)
        public HelloService helloService() {
            HelloService helloService = new HelloService();
            helloService.setMsg(helloProperties.getMSG());
            return helloService;
        }
    
    }

    如果想要配置生效, 需要在resources/META-INF/spring.propertes

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=
    com.wenbronk.core.autoconfig.AutoConfigHello
    

    此时将自己的项目打包, 然后发布在私服上, 就可以在其他项目中通过引入依赖 进行自动开启了

    原创地址: http://www.cnblogs.com/wenbronk/p/6873627.html, 转载请注明出处, 谢谢

  • 相关阅读:
    Google Protocol Buffer 的使用和原理(转)
    在python开发工具PyCharm中搭建QtPy环境(详细)
    Docker容器的操作
    Docker镜像操作
    最新版本Docker的安装和使用
    linux CentOS如何安装KVM
    在Linux CentOS下如何安装tar.gz和RPM软件包
    Linux忘记root密码后如何在grub界面中以单用户模式进入系统并重置密码的方法
    Django中的Project和App的区别
    Python处理PDF和Word文档常用的方法(二)
  • 原文地址:https://www.cnblogs.com/wenbronk/p/6873627.html
Copyright © 2011-2022 走看看