springboot自定义注解没有生效_(第五讲)自定义Spring Boot Starter

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

1. 主要内容

  • 1.实现自定义的spring boot starter
  • 2.验证自定义的spring boot starter是否生效
  • 3.验证自动配置是否生效
本讲所涉及的源码已经上传到Github仓库,你可以通过下面的链接获取全部的源码: https://github.com/ramostear/Spring_Boot_2.X_Tutorial/tree/master/spring-boot-starter-site

2. 实现自定义的spring boot starter

现在,我们来实现这一一个功能,当SiteInformation类在classpath下的时候,系统自动配置SiteInformation类的Bean,并且SiteInformation类中的属性可以在application.properties文件中进行配置。

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

12541e6563bb6c400449191c84e35266.png

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

4fcb5e921e95efb9a776b2a387ff38dc.png

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

3263c207edb1cec4649da6980b09cbce.png
添加spring-boot-autoconfigure依赖的目的是让自定义的starter具有自动配置的能力

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

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

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

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

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

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

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

25bdf27c4a254e2de59acddec4a2bc8a.png
若有多个自动配置项,请用“,”进行分割,此处的“”是为了换行后任然能够读取到属性。

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

19013eccea8ed3c7ed96b4c521b147c1.png

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

c5bf1095447a93d74f7ce9a13afc2075.png
提示,请使用maven自带的插件对项目进行打包和安装,切勿使用spring-boot-maven-plugin进行打包安装,否则打包后的jar无法使用,请将下面的代码从你的pom文件中剔除:
  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-maven-plugin</artifactId>
  6. </plugin>
  7. </plugins>
  8. </build>

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

3. 创建Web工程

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

5ff84d4016c449b476a6bec002e5e329.png

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

0904f463d0beec89cf39860cd04836c3.png

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

7abebe39d4f18e8ab2b57220a30c65ec.png

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

546f41250596fd9b05a5a6f44323ed61.png

4. 验证自定义Starter

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

b5f9bd54fcd4282111e51ab333c2b3cf.png

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

  1. site.name = 谭朝红的技术分享博客
  2. site.domain = www.ramostear.com
  3. site.keywords = blog
  4. site.description = 谭朝红的技术分享博客
  5. site.copyright = Copyright 2019-Ramostear
  6. logging.level.org.springframework = debug
配置logging.level.org.springframework= debug属性的作用是能够在控制台日志中查看自定义的starter是否生效。

5. 运行并测试

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

  1. ============================
  2. CONDITIONS EVALUATION REPORT
  3. ============================
  4. Positive matches:
  5. -----------------
  6. ...
  7. SiteInformationAutoConfiguration matched:
  8. - @ConditionalOnWebApplication (required) found 'session' scope (OnWebApplicationCondition)
  9. SiteInformationAutoConfiguration#provider matched:
  10. - @ConditionalOnMissingBean (types: com.ramostear.spring.boot.starter.site.SiteInformationProvider; SearchStrategy: all) did not find any beans (OnBeanCondition)
  11. ...

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

ae909a481d0ba36bc1b26331ad3ac7a2.png

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

  1. {
  2. "name": "谭朝红的技术分享博客",
  3. "domain": "www.ramostear.com",
  4. "copyright": "Copyright 2019-Ramostear",
  5. "keywords": "blog",
  6. "description": "谭朝红的技术分享博客"
  7. }

6. 总结

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

作者:谭朝红

原文:(第五讲)自定义Spring Boot Starter

来源:谭朝红的技术分享博客

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的Spring Boot自定义Starter的示例,该Starter实现了一个自定义的HelloWorld功能: 1. 创建Maven项目 首先,我们需要创建一个Maven项目作为我们自定义Starter的项目。在项目的pom.xml中添加Spring Boot的依赖,以及其他需要集成的依赖。 2. 编写自动配置类 在src/main/java目录下创建一个名为HelloWorldAutoConfiguration的类,该类用于自动配置HelloWorld功能: ```java @Configuration @ConditionalOnClass(HelloWorldService.class) @EnableConfigurationProperties(HelloWorldProperties.class) public class HelloWorldAutoConfiguration { @Autowired private HelloWorldProperties properties; @Bean @ConditionalOnMissingBean public HelloWorldService helloWorldService() { HelloWorldService service = new HelloWorldService(); service.setMsg(properties.getMsg()); return service; } @ConfigurationProperties(prefix = "hello.world") public static class HelloWorldProperties { private String msg = "Hello, world!"; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } } } ``` 上述代码中,@Configuration注解表示该类是一个配置类,@ConditionalOnClass注解表示只有当HelloWorldService类存在时才进行配置,@EnableConfigurationProperties注解表示将HelloWorldProperties类注入到Spring容器中。在helloWorldService方法中,我们通过读取HelloWorldProperties中的配置来创建一个HelloWorldService实例。 3. 编写Starter类 在src/main/java目录下创建一个名为HelloWorldStarter的类,该类用于将自动配置类注入到Spring容器中: ```java @Configuration @EnableConfigurationProperties(HelloWorldProperties.class) @Import(HelloWorldAutoConfiguration.class) public class HelloWorldStarter { } ``` 上述代码中,@Configuration注解表示该类是一个配置类,@EnableConfigurationProperties注解表示将HelloWorldProperties类注入到Spring容器中,@Import注解表示将HelloWorldAutoConfiguration类注入到Spring容器中。 4. 打包和发布Starter 在命令行中运行以下命令,将自定义Starter打包成jar包: ``` mvn clean package ``` 然后将jar包发布到Maven仓库中。 5. 在项目中使用自定义Starter 在其他Spring Boot项目中的pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>com.example</groupId> <artifactId>hello-world-starter</artifactId> <version>1.0.0</version> </dependency> ``` 在项目中使用以下代码来测试自定义Starter是否生效: ```java @RestController public class TestController { @Autowired private HelloWorldService helloWorldService; @GetMapping("/hello") public String hello() { return helloWorldService.sayHello(); } } ``` 上述代码中,我们通过@Autowired注解注入了HelloWorldService实例,并在hello方法中调用了sayHello方法来测试自定义Starter是否生效。 以上就是Spring Boot自定义Starter的一个简单示例,通过自定义Starter,我们可以将自己的功能快速集成到Spring Boot中,提高开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值