spring boot自动配置实现

自从用了spring boot,都忘记spring mvc中的xml配置是个什么东西了,再也回不去。为啥spring boot这么好用呢, 约定大于配置的设计初衷, 让我们只知道维护好application.properties(或application.yml)文件就可以了,我们在配置文件里可以设置数据源参数,可以设置服务端口,可以设置redis的地址等等。我们经常会看一些包含starter名字的jar包,如spring-boot-starter-data-redis,引入这些jar包,我们就可以简单快速配置了。那么我们自己开发了一个接口服务给别人调用,我们是不是可以把它封装成一个starter jar包呢?让别人在application.properties定义,实现自动配置呢?答案是允许的,下面跟我一起写一个自动配置jar包。(本文的目的不是讲解自动配置的原理,大家可以自行网上搜索原理)。

  1. 环境信息

    开发工具:idea

    maven版本号:3.5.4

  2. jar包封装

    创建一个springboot项目

    填写坐标信息

    springboot版本2.0.4

    其他默认,创建完成后,目录如下

    接下来创建我们的测试服务类TestService

     1 package com.tanghuachun.teststarter;
     2
     3 public class TestService {
     4
     5     private String ip;
     6     private int port;
     7
     8     public TestService(String ip, int port){
     9         this.ip = ip;
    10         this.port = port;
    11     }
    12
    13     public void printConfInfo(){
    14         System.out.println("骚年,你配置的IP为:" + ip + ",端口为:" + port);
    15     }
    16 }

    我们设想,别人使用我们这个接口的时候,将Ip和Port通过application.properties注入,接下来我们创建属性配置实体类TestServiceProperties

     1 package com.tanghuachun.teststarter;
     2
     3 import org.springframework.boot.context.properties.ConfigurationProperties;
     4
     5 @ConfigurationProperties(prefix = "test-config")//取配置文件前缀为test-config配置
     6 public class TestServiceProperties {
     7     private String host;
     8     private int port;
     9
    10     public String getHost() {
    11         return host;
    12     }
    13
    14     public void setHost(String host) {
    15         this.host = host;
    16     }
    17
    18     public int getPort() {
    19         return port;
    20     }
    21
    22     public void setPort(int port) {
    23         this.port = port;
    24     }
    25 }

    我们发现在这个类写好后提示有错误

    在pom文件加上依赖包,问题解决

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>

    新建一个自动配置类TestServiceAutoConfiguration

     1 package com.tanghuachun.teststarter;
     2
     3 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
     4 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
     5 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
     6 import org.springframework.boot.context.properties.EnableConfigurationProperties;
     7 import org.springframework.context.annotation.Bean;
     8 import org.springframework.context.annotation.Configuration;
     9
    10 @Configuration
    11 @ConditionalOnClass(TestService.class)// 存在TestService这个类才装配当前类
    12 @ConditionalOnProperty(name = "test-config.enabled", havingValue = "true", matchIfMissing = true)//配置文件存在这个test-config.enabled=true才启动,允许不存在该配置
    13 @EnableConfigurationProperties(TestServiceProperties.class)
    14 public class TestServiceAutoConfiguration {
    15     @Bean
    16     @ConditionalOnMissingBean   // 没有TestService这个类才进行装配
    17     public TestService testService(TestServiceProperties testServiceProperties) {
    18         return new TestService(testServiceProperties.getHost(), testServiceProperties.getPort());
    19     }
    20 }

    相关注解含义在注释中已经说明,到这里,代码已经写好了,我们希望以注解的方式给用户使用,自定义一个注解@EnableTestService

     1 package com.tanghuachun.teststarter;
     2 import org.springframework.context.annotation.Import;
     3 import java.lang.annotation.*;
     4
     5 @Inherited
     6 @Documented
     7 @Target(ElementType.TYPE)
     8 @Retention(RetentionPolicy.RUNTIME)
     9 @Import(TestServiceAutoConfiguration.class)
    10 //相当于使用定义spring.factories完成Bean的自动装配
    11 public @interface EnableTestService {
    12 //@Import(TestServiceAutoConfiguration.class) 需要在调用者的Main 类加上该注解就能等效于spring.factories 文件配置
    13 }

    然后注释掉pom文件中的maven插件,如下图

    然后maven打包,就会生成一个jar包,这个jar包我们就可以直接用了

    这里因为在本地环境测试,我们将编译好的jar安装到本地maven仓库,点击右边的install按钮(你也可以导入编译好的jar包一样的)

  3. jar包使用

    我们开始来测试我们封装好的jar,首先创建一个springboot项目(创建时一路默认,你的包名也可以和我一样,无所谓的)

    pom文件的依赖配置如下

    <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>com.tanghuachun</groupId>
                <artifactId>test-starter</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    </dependencies>

    在main入口类加上注解

    创建一个TestController类

     1 package com.tanghuachun.testmain;
     2
     3 import com.tanghuachun.teststarter.TestService;
     4 import org.springframework.beans.factory.annotation.Autowired;
     5 import org.springframework.web.bind.annotation.GetMapping;
     6 import org.springframework.web.bind.annotation.RestController;
     7
     8 @RestController
     9 public class TestController {
    10     @Autowired
    11     private TestService testService;
    12
    13     @GetMapping(value = "/test")
    14     public String test(){
    15         testService.printConfInfo();
    16         return "OK";
    17     }
    18 }

    接下来在application.properties中配置参数

    启动该项目,在地址栏输入 http://localhost:8080/test 回车,看控制台打印的信息恰好是我们需要的

    到这里我们就完成了一个自动配置的封装。

    骚年们可以研究一下starter中注解@ConditionalOnProperty对使用的影响。

    今天的故事讲完了。

原文地址:https://www.cnblogs.com/tanghuachun/p/9591538.html

时间: 2024-11-09 11:20:22

spring boot自动配置实现的相关文章

Spring Boot自动配置原理(转)

第3章 Spring Boot自动配置原理 3.1 SpringBoot的核心组件模块 首先,我们来简单统计一下SpringBoot核心工程的源码java文件数量: 我们cd到spring-boot-autoconfigure工程根目录下.执行 $ tree | grep -c .java$ 模块 java文件数 spring-boot 551 spring-boot-actuator 423 spring-boot-autoconfigure 783 spring-boot-devtools

4、Spring Boot 自动配置原理

1.4 Spring Boot 自动配置原理 简介 spring boot自动配置功能可以根据不同情况来决定spring配置应该用哪个,不应该用哪个,举个例子: Spring的JdbcTemplate是不是在Classpath里面?如果是,并且DataSource也存在,就自动配置一个JdbcTemplate的Bean Thymeleaf是不是在Classpath里面?如果是,则自动配置Thymeleaf的模板解析器.视图解析器.模板引擎 那个这个是怎么实现的呢?原因就在于它利用了Spring的

Springboot 系列(三)Spring Boot 自动配置

注意:本 Spring Boot 系列文章基于 Spring Boot 版本 v2.1.1.RELEASE 进行学习分析,版本不同可能会有细微差别. 前言 关于配置文件可以配置的内容,在 Spring Boot 官方网站已经提供了完整了配置示例和解释. 可以这么说,Spring Boot 的一大精髓就是自动配置,为开发省去了大量的配置时间,可以更快的融入业务逻辑的开发,那么自动配置是怎么实现的呢? 1. @SpringBootApplication 跟着 Spring Boot 的启动类的注解

Spring Boot 自动配置之@Conditional的使用

Spring Boot自动配置的"魔法"是如何实现的? 转自-https://sylvanassun.github.io/2018/01/08/2018-01-08-spring_boot_auto_configure/ Spring Boot是Spring旗下众多的子项目之一,其理念是约定优于配置,它通过实现了自动配置(大多数用户平时习惯设置的配置作为默认配置)的功能来为用户快速构建出标准化的应用.Spring Boot的特点可以概述为如下几点: 内置了嵌入式的Tomcat.Jett

Spring Boot自动配置类

http://docs.spring.io/spring-boot/docs/current/api/overview-summary.html http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#auto-configuration-classes 前提 1.一般来说,xxxAware接口,都提供了一个setXxx的方法,以便于其实现类将Xxx注入自身的xxx字段中,从而进行操作. 例如 Applicatio

Spring Boot自动配置实例

spring boot之所以能够自动配置bean,是通过基于条件来配置Bean的能力实现的. 常用的条件注解如下 @ConditionalOnBean:当容器里存在指定的Bean的条件下 @ConditionalOnClass:当前类路径下存在指定的类的条件下 @ConditionalOnExpression:基于SpEL表达式作为判断条件 @ConditionalOnJava:基于JVM版本作为判断条件 @ConditionalOnJndi:在JNDI存在的条件下查找指定的位置 @Condit

Spring Boot自动配置源码解析(基于Spring Boot 2.0.2.RELEASE)

在Spring Boot官方介绍中,首一段话是这样的(如下图).我们可以大概了解到其所表达的含义:我们可以利用Spring Boot写很少的配置来创建一个非常方便的基于Spring整合第三方类库的单体企业级应用.相信使用过Spring Boot的人都知道,她在这方面从前到后的一系列整合.本篇文字将带你进入具体的实现细节. 首先我们写一段Spring Boot应用启动类的代码如下: 1 package com.springTest; 2 3 import org.springframework.b

spring boot 自动配置原理

1).spring boot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfiguration 2).通过@EnableAutoConfiguration中AutoConfigurationImportSelector给容器中导入了一系列的组件通过List<String> configurations = getCandidateConfigurations(annotationMetadata,attributes);获取候选的配置,下一步通过SpringFactor

Spring Boot自动配置总结

Spring Boot项目启动的时候加载主配置类,并开启了自动配置功能.(Spring Boot的自动配置功能是Spring Boot的一大重要且突出的特性) 那么我们需要了解下它: 如何加载主配置类? 通过@SpringBootApplication的注解来找到并加载主配置类. 如何开启自动配置功能? 点进@SpringBootApplication的源码后可以发现这样一段代码,说明@SpringBootApplication注解由多个注解组成. 其中,自动配置功能主要就是依靠@EnableA