自定义starter
1、starter启动原理
- starter-pom引入 autoconfigurer 包
 

然后,引入starter — xxxAutoConfiguration — 容器中放入组件 —- 绑定xxxProperties —- 配置项
自定义starter
首先需要准备好两个项目
空工程:
hello-spring-boot-starter(启动器)
空SpringBoot工程
hello-spring-boot-starter-autoconfigure(自动配置包)
其中自动配置包里面有:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
   | 
  import org.springframework.boot.context.properties.ConfigurationProperties;
  @ConfigurationProperties("hello") public class HelloProperties {
      private String prefix;     private String suffix;
      public String getPrefix() {         return prefix;     }
      public void setPrefix(String prefix) {         this.prefix = prefix;     }
      public String getSuffix() {         return suffix;     }
      public void setSuffix(String suffix) {         this.suffix = suffix;     } }
 
  | 
 
1 2 3 4 5 6 7 8 9 10 11 12
   | 
 
  public class HelloService {
      @Autowired     HelloProperties helloProperties;
      public String sayHello(String userName){         return helloProperties.getPrefix() + ":"+userName+"》"+helloProperties.getSuffix();     } }
 
  | 
 
这里没有加入组件,没有任何注解
然后再写一个自动配置的类:
1 2 3 4 5 6 7 8 9 10 11 12 13
   | @Configuration @EnableConfigurationProperties(HelloProperties.class)  //默认HelloProperties放在容器中 //@ConditionalOnMissingBean(HelloProperties.class) public class HelloServiceAutoConfiguration{
      @ConditionalOnMissingBean(HelloService.class)     @Bean     public HelloService helloService(){         HelloService helloService = new HelloService();         return helloService;     }
  }
   | 
 
@ConditionalOnMissingBean(HelloProperties.class)是当容器中没有HelloProperties.class这个类的时候,这个类才会生效,起到防止覆盖的作用。
@EnableConfigurationProperties(HelloProperties.class)的作用是自动配置我们的hello组件
这个配置主要的作用就是将其保存入我们的组件
使用启动器
之后便是使用启动器,先配置xml,然后使用maven的clean和install进打入我们的本地仓库当中
1 2 3 4 5 6 7
   | <dependencies>     <dependency>         <groupId>com.my</groupId>         <artifactId>hello-spring-boot-starter-autoconfigure</artifactId>         <version>0.0.1-SNAPSHOT</version>     </dependency> </dependencies>
   | 
 
测试
然后再创建一个测试的springboot组件:
引入依赖
1 2 3 4 5
   | <dependency>     <groupId>com.my</groupId>     <artifactId>hello-spring-boot-starter</artifactId>     <version>1.0-SNAPSHOT</version> </dependency>
   | 
 
就会引入这个自定义。但是发现不能像spring引入其他依赖一样,被自动注入生效
然后,在autoconfigure包中配置引用 META-INF/spring.factories 
1 2 3
   | # Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.atguigu.hello.auto.HelloServiceAutoConfiguration
   | 
 
然后再重新打包clean 和install
结果
我们在新项目中写一个controller:
1 2 3 4 5 6 7 8 9 10 11 12 13
   | @RestController public class HelloController {
      @Autowired     HelloService helloService;
      @GetMapping("/hello")     public String sayHello(){
          String s = helloService.sayHello("张三");         return s;     } }
   | 
 
发现自动注入成功了,
但是我们的helloservice是有前后缀的,如果需要使用,则需要在配置文件当中写入:
1 2
   | hello.prefix=my hello.suffix=88888
   | 
 
接着再继续测试,发现输出结果正好是:
.
.
.
.