手写一个Spring Boot Starter

嗨~你们好,我是阿壮,一个后端程序员,今天和你们分享Spring Boot的自动装配原理,并手写一个Starter加深对Spring Boot的理解。java

众所周知,Spring Boot为了简化开发,省去了Spring中不少的XML文件。为了理解Spring Boot中自动装配的原理,今天咱们基于这个机制本身动手实现一个Starter组件。程序员

项目结构

步骤

  1. 新建一个名为:redis-spring-boot-starter的Maven项目
  2. 添加Maven依赖redis

    <dependencies>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter</artifactId>
         </dependency>
         <dependency>
             <groupId>org.redisson</groupId>
             <artifactId>redisson</artifactId>
             <version>3.11.1</version>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-configuration-processor</artifactId>
             <optional>true</optional>
         </dependency>
     </dependencies>
     <dependencyManagement>
         <dependencies>
             <dependency>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-dependencies</artifactId>
                 <version>2.3.2.RELEASE</version>
                 <type>pom</type>
                 <scope>import</scope>
             </dependency>
         </dependencies>
     </dependencyManagement>
  3. 定义属性,实如今applications.properties中的Redis的链接参数。spring

    @ConfigurationProperties(prefix = "gp.redisson")
    public class RedissonProperties {
     private String host = "localhost";
     private String password;
     private int port = 6379;
     private int timeout;
     private boolean ssl;
    
     public String getHost() {
         return host;
     }
    
     public void setHost(String host) {
         this.host = host;
     }
    
     public String getPassword() {
         return password;
     }
    
     public void setPassword(String password) {
         this.password = password;
     }
    
     public int getPort() {
         return port;
     }
    
     public void setPort(int port) {
         this.port = port;
     }
    
     public int getTimeout() {
         return timeout;
     }
    
     public void setTimeout(int timeout) {
         this.timeout = timeout;
     }
    
     public boolean isSsl() {
         return ssl;
     }
    
     public void setSsl(boolean ssl) {
         this.ssl = ssl;
     }
    }
  4. 定义须要自动装配的配置类后端

    @Configuration
    @ConditionalOnClass(Redisson.class)
    @EnableConfigurationProperties(RedissonProperties.class)
    public class RedissonAutoConfiguration {
     @Bean
     RedissonClient redissonClient(RedissonProperties redissonProperties) {
         Config config = new Config();
         String prefix = "redis://";
         if (redissonProperties.isSsl()) {
             prefix = "rediss://";
         }
         SingleServerConfig singleServerConfig = config.useSingleServer()
                 .setAddress(prefix + redissonProperties.getHost() + ":" + redissonProperties.getPort())
                 .setConnectTimeout(redissonProperties.getTimeout());
         if (!StringUtils.hasText(redissonProperties.getPassword())) {
             singleServerConfig.setPassword(redissonProperties.getPassword());
         }
         return Redisson.create(config);
     }
    }
  5. resource文件夹下新建META-INF/spring.fatories文件,使Spring Boot程序能够扫描文件完成自动装配微信

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.jonssonyan.config.RedissonAutoConfiguration
  6. 打包成jar包
  7. 在其余项目引入当先依赖app

    <dependency>
             <groupId>com.jonssonyan</groupId>
             <artifactId>redis-spring-boot-starter</artifactId>
             <version>1.0-SNAPSHOT</version>
         </dependency>
  8. properties中配置host等RedisProperties中定义的属性

总结

经过一个简单的例子,让咱们加深理解Spring Boot的自动装配原理,让咱们对Spring Boot有个更深的理解。spring-boot

我是阿壮,关注微信公众号:科技猫,获取第一时间更新,我么下期间this