java SpringBoot(十七)自定义starter

悠悠 2022-10-17 04:14 280阅读 0赞

为什么需要自定义starter:

项目中经常使用的功能可以包装成自定义的starter,方便调用以及使用。

SpringBoot是怎样定义starterd:

以test statrt为例:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzcxNTY3_size_16_color_FFFFFF_t_70![wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==][wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw]​

我们发现我们导入test stater包之后,Spring会引入两个依赖

一个是 org.springframework.boot:spring-boot-test

这个里边没什么东西,主要是告诉我们需要导入什么依赖

另一个是 org.springframework.boot:spring-boot-test-autoconfigure

这个里边有个很重要的spring.factories

这个里边的内容是告诉spring需要导入哪些配置

我们照此搭建我们的自定义stater

1、创建一个新的空项目

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzcxNTY3_size_16_color_FFFFFF_t_70 1![wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==][wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw]​

2、添加第一个普通模块

test-starter 这个模块主要是启动器模块,它会引入auto configure模块

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzcxNTY3_size_16_color_FFFFFF_t_70 2![wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==][wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw]​

2021060115282955.png

3、创建第二个Spring普通项目

命名为test-starter-autoconfigure 这个就是自动配置模块

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzcxNTY3_size_16_color_FFFFFF_t_70 3![wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==][wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw]​

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzcxNTY3_size_16_color_FFFFFF_t_70 4

4.、查看自动配置模块的pom文件 将它引入到starter中

(1)、查看pom

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzcxNTY3_size_16_color_FFFFFF_t_70 5![wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==][wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw]​

(2)、在starter中引入

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzcxNTY3_size_16_color_FFFFFF_t_70 6

这样我们使用starter 就会帮我们引入我们的autoconfigure

5、创建我们的server 用来返回前缀+名字

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzcxNTY3_size_16_color_FFFFFF_t_70 7

  1. package com.example.demo.server;
  2. import com.example.demo.bean.MyProperties;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. public class MyServer {
  5. @Autowired
  6. MyProperties myProperties;
  7. public String returnName(String userName){
  8. return myProperties.getPrefix() + userName;
  9. }
  10. }

6、创建 MyProperties 类,这里用来绑定配置

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzcxNTY3_size_16_color_FFFFFF_t_70 8

  1. package com.example.demo.bean;
  2. import org.springframework.boot.context.properties.ConfigurationProperties;
  3. @ConfigurationProperties("my.pro")
  4. public class MyProperties {
  5. private String prefix;
  6. public String getPrefix() {
  7. return prefix;
  8. }
  9. public void setPrefix(String prefix) {
  10. this.prefix = prefix;
  11. }
  12. }

这里的意思是与配置文件中的 my.pro 开头的配置进行绑定

7、创建Configuration类 注入sever

为什么不直接在server类中将server注入的原因就是我们要控制组件的注入。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzcxNTY3_size_16_color_FFFFFF_t_70 9

  1. package com.example.demo.auto;
  2. import com.example.demo.bean.MyProperties;
  3. import com.example.demo.server.MyServer;
  4. import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
  5. import org.springframework.boot.context.properties.EnableConfigurationProperties;
  6. import org.springframework.context.annotation.Bean;
  7. import org.springframework.context.annotation.Configuration;
  8. @Configuration
  9. @ConditionalOnMissingBean(MyServer.class)
  10. @EnableConfigurationProperties(MyProperties.class) //默认放到容器中
  11. public class MyAutoConfigure {
  12. @Bean
  13. public MyServer myServer(){
  14. MyServer myServer = new MyServer();
  15. return myServer;
  16. }
  17. }

容器中没有这个server我们才注入。

8、创建 META-INF 文件夹,放入factories文件

文件内容是告诉spring帮我们导入(扫描)哪个文件

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzcxNTY3_size_16_color_FFFFFF_t_70 10

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzcxNTY3_size_16_color_FFFFFF_t_70 11

  1. org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  2. com.example.demo.auto.MyAutoConfigure

9、打包

打包autoconfigure:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzcxNTY3_size_16_color_FFFFFF_t_70 12

打包starter:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzcxNTY3_size_16_color_FFFFFF_t_70 13

这样就安装到了mave仓库

10、使用

(1)、创建一个普通的spring项目,引入starter的pom中的相关配置 将starter引入

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzcxNTY3_size_16_color_FFFFFF_t_70 14

(2)、刷新 mavern,然后创建 controller使用

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzcxNTY3_size_16_color_FFFFFF_t_70 15

  1. package com.example.demo.controller;
  2. import com.example.demo.server.MyServer;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. @RestController
  7. public class TestController {
  8. @Autowired
  9. MyServer myServer;
  10. @GetMapping("/hello")
  11. public String getName(){
  12. return myServer.returnName("test");
  13. }
  14. }

(3)、修改配置文件、编写前缀

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzcxNTY3_size_16_color_FFFFFF_t_70 16

(4)、运行并查看结果

20210601154330902.png

[wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw]:

发表评论

表情:
评论列表 (有 0 条评论,280人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SpringBoot定义starter

    SpringBoot自定义starter 按照一般的模式, 我们创建一个启动器, 但是该启动器只用来做依赖导入 然后创建另外一个自动配置模块, 用来定义自动配置 启动