(第五讲)自定义Spring Boot Starter

第四讲中咱们已经了解了Spring Boot自动配置的基本原理,了解其原理以后,你会以为Spring Boot的自动配置能力其实也没有那么的神秘。在本讲中,咱们将尝试实现一个自定义的Spring Boot Starter,以巩固上一件中的内容。html

1. 主要内容

  • 1.实现自定义的spring boot starter
  • 2.验证自定义的spring boot starter是否生效
  • 3.验证自动配置是否生效

本讲所涉及的源码已经上传到Github仓库,你能够经过下面的连接获取所有的源码:java

github.com/ramostear/S…git

2. 实现自定义的spring boot starter

如今,咱们来实现这一一个功能,当SiteInformation类在classpath下的时候,系统自动配置SiteInformation类的Bean,而且SiteInformation类中的属性能够在application.properties文件中进行配置。github

首先,使用IntelliJ IDEA建立一个Maven工程,在当前Project上选择新建Module,在弹出面板中填写相关信息,以下图所示:web

点击下一步,选择module存放路径,以下图所示:spring

点击完成按钮,生成新的Module,而后修改module中的pom.xml,添加spring-boot-autoconfigure依赖,完整的配置代码以下所示:json

添加spring-boot-autoconfigure依赖的目的是让自定义的starter具备自动配置的能力markdown

而后,建立一个名为:com.ramostear.spring.boot.starter.site的包,并在包下建立SiteInformation.java文件,这个类提供了站点的一些基本属性,源码以下:session

@ConfigurationProperties(prefix = "site")注解的做用是当咱们须要覆盖站点信息时,在application.properties文件中须要使用“site”做为属性的前缀,如site.name = ramostear。若是不作任何配置,站点信息将使用默认值:unknownapp

接下来,建立一个SiteInformationProvider.java文件,用于返回站点信息,其源码以下所示:

SiteInformationProvider.java是自动配置的依据类,当引用此自定义Starter时,会依据SiteInformationProvider是否存在类建立这个类的Bean。

准备好上述两个类以后,须要建立一个自动配置类,如SiteInformationAutoConfiguration.java,其源码以下所示:

@ConditionalOnWebApplication注解表名此自动配置能够在Web应用中进行使用,@EnableConfigurationProperties(SiteInformation.class)注解指明提供自动配置的属性对象@ConditionalOnMissingBean(SiteInformationProvider.class)指明当容器中没有SiteInformationProvider这个类的Bean时,自动配置这个类的Bean

最后,须要将此配置类进行注册,Spring Boot才能完成自动配置工做。在resources资源文件夹下建立名为META-INF的文件夹,并添加名为spring.factories的文件,修改其内容为:

如有多个自动配置项,请用“,”进行分割,此处的“\”是为了换行后任然可以读取到属性。

完成上述的全部工做后,点击IDEA右侧Maven工具栏,选择当前项目,找到Plugins中的install选项并点击执行安装,以下图所示:

上述操做运行成功后,你能够在控制台看到以下所示的提示信息:

提示,请使用maven自带的插件对项目进行打包和安装,切勿使用spring-boot-maven-plugin进行打包安装,不然打包后的jar没法使用,请将下面的代码从你的pom文件中剔除:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
复制代码

至此,自定义的spring boot starter制做完成。接下来建立一个web工程,引入spring-boot-starter-site,测试此starter是否可以正常使用。

3. 建立Web工程

新建一个测试用的Module,并使用IDEA自带的Spring Initializr建立一个Web工程,以下图所示:

选择Module SDK的版本,选择下一步,填写Module相关信息,以下图所示:

而后点击下一步,将Web依赖添加到项目中,而后点击保存按钮,生成新的Module。以下如所示:

接下来,将spring-boot-starter-site依赖添加到测试用的Web工程中,pom.xml源码以下:

4. 验证自定义Starter

修改CustomStarterTestApplication.java中的源码,添加@RestController注解,并建立一个获取站点信息的方法,源码以下:

接下来在application.properties文件中添加以下的类容:

site.name = 谭朝红的技术分享博客
site.domain = www.ramostear.com
site.keywords = blog
site.description = 谭朝红的技术分享博客
site.copyright = Copyright 2019-Ramostear

logging.level.org.springframework = debug
复制代码

配置logging.level.org.springframework= debug属性的做用是可以在控制台日志中查看自定义的starter是否生效。

5. 运行并测试

点击运行CustomStarterTestApplication主类,并观察控制台输出,当自定义的starter生效后,你能够在控制台看到以下的信息:

============================
CONDITIONS EVALUATION REPORT
============================


Positive matches:
-----------------
...
   SiteInformationAutoConfiguration matched:
      - @ConditionalOnWebApplication (required) found 'session' scope (OnWebApplicationCondition)

   SiteInformationAutoConfiguration#provider matched:
      - @ConditionalOnMissingBean (types: com.ramostear.spring.boot.starter.site.SiteInformationProvider; SearchStrategy: all) did not find any beans (OnBeanCondition)
...
复制代码

最后,使用Postman工具请求http://localhost:8080/site/info 并观察返回的信息:

请求成功、并返回了站点的配置信息,详细信息以下所示:

{
  "name": "谭朝红的技术分享博客",
  "domain": "www.ramostear.com",
  "copyright": "Copyright 2019-Ramostear",
  "keywords": "blog",
  "description": "谭朝红的技术分享博客"
}
复制代码

6. 总结

本小节演示了如何建立一个自定义的Spring Boot Starter,并进行测试。进一步加深和强化了对Spring Boot自动配置原理的理解。本次分享类容到此结束,谢谢~~

做者:谭朝红 原文:www.ramostear.com/articles/cu…

相关文章
相关标签/搜索