zoukankan      html  css  js  c++  java
  • SpringBoot高级-自动配置之自定义starter

    前言:前面已经介绍了自动配置的很多原理,现在我们着手自己定义一个starter。

    需求:自定义redis-starter,要求当导入redis坐标后,SpringBoot自动创建Jedis的Bean。正式开始之前,我们可以查看Mybatis的起步依赖是如果实现自动配置的。我这里就省略了,大家根据之前的分析文章,自己看源码即可。

    一、先创建一个SpringBoot工程redis-spring-boot-autoconfigure,该工程中添加jedis依赖,并且创建一个自动配置类RedisAutoConfigure,实现jedis实例(bean)注入到IOC容器中。

    /**
     * @description:自定义自动配置类:将Jedis注入到IOC容器中
     * @date: 2020/10/10 15:08
     * @author: winson
     */
    @Configuration
    @EnableConfigurationProperties(RedisProperties.class)
    public class RedisAutoConfigure {
    
        /**
         * 提供jedis的bean
         * @param redisProperties
         * @return
         */
        @Bean
        public Jedis jedis(RedisProperties redisProperties) {
            return new Jedis(redisProperties.getHost(), redisProperties.getPort());
        }
    
    }
    

    考虑到redis的有两个参数(host、port)必须是可以动态赋值的,所以我们自定义一个属性配置类RedisProperties,该属性配置类从配置文件获取属性值,并设置host、port属性的默认值,如下:

    /**
     * @description:自定义属性配置类
     * @date: 2020/10/10 15:11
     * @author: winson
     */
    @ConfigurationProperties(prefix = "redis")
    public class RedisProperties {
    
        private String host = "127.0.0.1";
    
        private int port = 6379;
    
        public String getHost() {
            return host;
        }
    
        public void setHost(String host) {
            this.host = host;
        }
    
        public int getPort() {
            return port;
        }
    
        public void setPort(int port) {
            this.port = port;
        }
    }
    

    @EnableConfigurationProperties注解的作用:由于自动配置类RedisAutoConfigure中,注册jedis的bean中参数需要使用到RedisProperties的bean,但无法获取到RedisProperties的bean,所以我们可以通过这个注解,手动的将该bean注入到IOC容器中。

    在resources目录下按照SpringBoot自动配置目录、文件名称的规则,如下图,新建一个自己的spring.factories文件

    spring.factories文件内容:就是将自定义的自动配置类声明为名称为org.springframework.boot.autoconfigure.EnableAutoConfiguration的值,“”的作用:换行,如果我们有多个自定义的自动配置类,这里可以用逗号分隔。

    # Auto Configure
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=
    com.winson.jedis.config.RedisAutoConfigure
    

    二、再创建一个SpringBoot工程redis-spring-boot-starter,引入redis-spring-boot-autoconfigure工程坐标。

    <!--引入自定义的redis的starter-->
    <dependency>
        <groupId>com.winson</groupId>
        <artifactId>redis-spring-boot-autoconfigure</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
    

    三、在测试类中引入自定义的starter,并修改引导类,做测试

            <!--引入自定义的起步依赖-->
            <dependency>
                <groupId>com.winson</groupId>
                <artifactId>redis-spring-boot-starter</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
    
    //引导类
    @SpringBootApplication
    public class SpringbootEnableApplication {
        public static void main(String[] args) {
            ConfigurableApplicationContext context = SpringApplication.run(SpringbootEnableApplication.class, args);
    
            Jedis jedis = context.getBean(Jedis.class);
            System.out.println(jedis);
        }
    }
    

    四、启动程序,测试结果,自定义stater成功。

    下面进行redis测试

    一、首先启动本机的redis服务

    二、根据测试,修改引导类,向redis中存储数据,并取值

    @SpringBootApplication
    public class SpringbootEnableApplication {
    
        public static void main(String[] args) {
            ConfigurableApplicationContext context = SpringApplication.run(SpringbootEnableApplication.class, args);
    
            Jedis jedis = context.getBean(Jedis.class);
            jedis.set("username", "dufu");
    
            String username = jedis.get("username");
            System.out.println("username=" + username);
        }
    }
    

    三、启动程序,测试结果,也成功。

    下面测试修改redis连接信息,测试结果

    一、测试类中添加redis的配置信息(根据属性配置类 RedisProperties 的设置进行定义),将port的连接端口,故意写错,如下:

    redis:
      host: 127.0.0.1
      port: 6666
    

    二、启动程序,测试结果:发现无法再连接到redis服务器了,说明我们设置的属性配置类RedisProperties 是生效的

    三、如果我们将连接信息修改正确,再启动,也是没有问题的

    最后,我们可以使用Condition将我们自定义的自动配置类完善一下,使用@ConditionalOnClass(Jedis.class)与@ConditionalOnMissingBean(name = "jedis"),具体的释义,我就不解释。

    /**
     * @description:自定义自动配置类:将Jedis注入到IOC容器中
     * @date: 2020/10/10 15:08
     * @author: winson
     */
    @Configuration
    @EnableConfigurationProperties(RedisProperties.class)
    @ConditionalOnClass(Jedis.class)
    public class RedisAutoConfigure {
        /**
         * 提供jedis的bean
         * @param redisProperties
         * @return
         */
        @Bean
        @ConditionalOnMissingBean(name = "jedis")
        public Jedis jedis(RedisProperties redisProperties) {
            return new Jedis(redisProperties.getHost(), redisProperties.getPort());
        }
    }
    

    小结:如此,我们并完成了自定义starter的示例

  • 相关阅读:
    自然语言交流系统 phxnet团队 创新实训 项目博客 (十一)
    install ubuntu on Android mobile phone
    Mac OS, Mac OSX 与Darwin
    About darwin OS
    自然语言交流系统 phxnet团队 创新实训 项目博客 (十)
    Linux下编译安装qemu和libvirt
    libvirt(virsh命令总结)
    深入浅出 kvm qemu libvirt
    自然语言交流系统 phxnet团队 创新实训 项目博客 (九)
    自然语言交流系统 phxnet团队 创新实训 项目博客 (八)
  • 原文地址:https://www.cnblogs.com/elnimo/p/13794218.html
Copyright © 2011-2022 走看看