官方Starter依赖梳理
 以官方的<artifactId>spring-boot-starter-test</artifactId>场景启动器为例,我们分析一下start场景启动器的pom依赖关系
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
点进<artifactId>spring-boot-starter-test</artifactId>
<?xml version="1.0" encoding="UTF-8"?><project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><!-- This module was also published with a richer model, Gradle metadata, --><!-- which should be used instead. Do not delete the following line which --><!-- is to indicate to Gradle or any Gradle module metadata file consumer --><!-- that they should prefer consuming it instead. --><!-- do_not_remove: published-with-gradle-metadata --><modelVersion>4.0.0</modelVersion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><version>2.4.0</version><name>spring-boot-starter-test</name><description>Starter for testing Spring Boot applications with libraries including JUnit Jupiter, Hamcrest and Mockito</description><url>https://spring.io/projects/spring-boot</url><organization><name>Pivotal Software, Inc.</name><url>https://spring.io</url></organization><licenses><license><name>Apache License, Version 2.0</name><url>https://www.apache.org/licenses/LICENSE-2.0</url></license></licenses><developers><developer><name>Pivotal</name><email>info@pivotal.io</email><organization>Pivotal Software, Inc.</organization><organizationUrl>https://www.spring.io</organizationUrl></developer></developers><scm><connection>scm:git:git://github.com/spring-projects/spring-boot.git</connection><developerConnection>scm:git:ssh://git@github.com/spring-projects/spring-boot.git</developerConnection><url>https://github.com/spring-projects/spring-boot</url></scm><issueManagement><system>GitHub</system><url>https://github.com/spring-projects/spring-boot/issues</url></issueManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>2.4.0</version><scope>compile</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-test</artifactId><version>2.4.0</version><scope>compile</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-test-autoconfigure</artifactId><version>2.4.0</version><scope>compile</scope></dependency><dependency><groupId>com.jayway.jsonpath</groupId><artifactId>json-path</artifactId><version>2.4.0</version><scope>compile</scope></dependency><dependency><groupId>jakarta.xml.bind</groupId><artifactId>jakarta.xml.bind-api</artifactId><version>2.3.3</version><scope>compile</scope></dependency><dependency><groupId>org.assertj</groupId><artifactId>assertj-core</artifactId><version>3.18.1</version><scope>compile</scope></dependency><dependency><groupId>org.hamcrest</groupId><artifactId>hamcrest</artifactId><version>2.2</version><scope>compile</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.7.0</version><scope>compile</scope></dependency><dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><version>3.6.0</version><scope>compile</scope></dependency><dependency><groupId>org.mockito</groupId><artifactId>mockito-junit-jupiter</artifactId><version>3.6.0</version><scope>compile</scope></dependency><dependency><groupId>org.skyscreamer</groupId><artifactId>jsonassert</artifactId><version>1.5.0</version><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.3.1</version><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.3.1</version><scope>compile</scope></dependency><dependency><groupId>org.xmlunit</groupId><artifactId>xmlunit-core</artifactId><version>2.7.0</version><scope>compile</scope><exclusions><exclusion><artifactId>jaxb-api</artifactId><groupId>javax.xml.bind</groupId></exclusion></exclusions></dependency></dependencies></project>---最重要的是它,spring-boot-starter<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>2.4.0</version><scope>compile</scope></dependency>最重要的是它,spring-boot-test-autoconfigure<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-test-autoconfigure</artifactId><version>2.4.0</version><scope>compile</scope></dependency>
路线1:接着点进<artifactId>spring-boot-starter</artifactId>
<?xml version="1.0" encoding="UTF-8"?><project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><!-- This module was also published with a richer model, Gradle metadata, --><!-- which should be used instead. Do not delete the following line which --><!-- is to indicate to Gradle or any Gradle module metadata file consumer --><!-- that they should prefer consuming it instead. --><!-- do_not_remove: published-with-gradle-metadata --><modelVersion>4.0.0</modelVersion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>2.4.0</version><name>spring-boot-starter</name><description>Core starter, including auto-configuration support, logging and YAML</description><url>https://spring.io/projects/spring-boot</url><organization><name>Pivotal Software, Inc.</name><url>https://spring.io</url></organization><licenses><license><name>Apache License, Version 2.0</name><url>https://www.apache.org/licenses/LICENSE-2.0</url></license></licenses><developers><developer><name>Pivotal</name><email>info@pivotal.io</email><organization>Pivotal Software, Inc.</organization><organizationUrl>https://www.spring.io</organizationUrl></developer></developers><scm><connection>scm:git:git://github.com/spring-projects/spring-boot.git</connection><developerConnection>scm:git:ssh://git@github.com/spring-projects/spring-boot.git</developerConnection><url>https://github.com/spring-projects/spring-boot</url></scm><issueManagement><system>GitHub</system><url>https://github.com/spring-projects/spring-boot/issues</url></issueManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot</artifactId><version>2.4.0</version><scope>compile</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId><version>2.4.0</version><scope>compile</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId><version>2.4.0</version><scope>compile</scope></dependency><dependency><groupId>jakarta.annotation</groupId><artifactId>jakarta.annotation-api</artifactId><version>1.3.5</version><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.3.1</version><scope>compile</scope></dependency><dependency><groupId>org.yaml</groupId><artifactId>snakeyaml</artifactId><version>1.27</version><scope>compile</scope></dependency></dependencies></project>---最终找到了我们熟悉的<artifactId>spring-boot-autoconfigure</artifactId><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId><version>2.4.0</version><scope>compile</scope></dependency>
路线2:或者我们点进<artifactId>spring-boot-test-autoconfigure</artifactId>
发现<artifactId>spring-boot-test-autoconfigure</artifactId>当中也有同样的<artifactId>spring-boot-autoconfigure</artifactId>
<?xml version="1.0" encoding="UTF-8"?><project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><!-- This module was also published with a richer model, Gradle metadata, --><!-- which should be used instead. Do not delete the following line which --><!-- is to indicate to Gradle or any Gradle module metadata file consumer --><!-- that they should prefer consuming it instead. --><!-- do_not_remove: published-with-gradle-metadata --><modelVersion>4.0.0</modelVersion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-test-autoconfigure</artifactId><version>2.4.0</version><name>spring-boot-test-autoconfigure</name><description>Spring Boot Test AutoConfigure</description><url>https://spring.io/projects/spring-boot</url><organization><name>Pivotal Software, Inc.</name><url>https://spring.io</url></organization><licenses><license><name>Apache License, Version 2.0</name><url>https://www.apache.org/licenses/LICENSE-2.0</url></license></licenses><developers><developer><name>Pivotal</name><email>info@pivotal.io</email><organization>Pivotal Software, Inc.</organization><organizationUrl>https://www.spring.io</organizationUrl></developer></developers><scm><connection>scm:git:git://github.com/spring-projects/spring-boot.git</connection><developerConnection>scm:git:ssh://git@github.com/spring-projects/spring-boot.git</developerConnection><url>https://github.com/spring-projects/spring-boot</url></scm><issueManagement><system>GitHub</system><url>https://github.com/spring-projects/spring-boot/issues</url></issueManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot</artifactId><version>2.4.0</version><scope>compile</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-test</artifactId><version>2.4.0</version><scope>compile</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId><version>2.4.0</version><scope>compile</scope></dependency></dependencies></project>---还是我们最终熟悉的<artifactId>spring-boot-autoconfigure</artifactId><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId><version>2.4.0</version><scope>compile</scope></dependency>

结论:官方自定义的starter-test,引入了如下两个关键依赖
spring-boot-starter spring-boot-test-autoconfigure 
这两个依赖殊途同归,最后生效的或者最终都依赖的是这个<artifactId>spring-boot-autoconfigure</artifactId>
场景启动器jar包分析【空jar包】


可以发现官方的任何一个场景启动器其实是一个空的内容,场景启动器的功能只是声明了有哪些依赖,把依赖给引进去
还是以<artifactId>spring-boot-starter-test</artifactId>为例
点进去:
<?xml version="1.0" encoding="UTF-8"?><project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><!-- This module was also published with a richer model, Gradle metadata, --><!-- which should be used instead. Do not delete the following line which --><!-- is to indicate to Gradle or any Gradle module metadata file consumer --><!-- that they should prefer consuming it instead. --><!-- do_not_remove: published-with-gradle-metadata --><modelVersion>4.0.0</modelVersion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><version>2.4.0</version><name>spring-boot-starter-test</name><description>Starter for testing Spring Boot applications with libraries including JUnit Jupiter, Hamcrest and Mockito</description><url>https://spring.io/projects/spring-boot</url><organization><name>Pivotal Software, Inc.</name><url>https://spring.io</url></organization><licenses><license><name>Apache License, Version 2.0</name><url>https://www.apache.org/licenses/LICENSE-2.0</url></license></licenses><developers><developer><name>Pivotal</name><email>info@pivotal.io</email><organization>Pivotal Software, Inc.</organization><organizationUrl>https://www.spring.io</organizationUrl></developer></developers><scm><connection>scm:git:git://github.com/spring-projects/spring-boot.git</connection><developerConnection>scm:git:ssh://git@github.com/spring-projects/spring-boot.git</developerConnection><url>https://github.com/spring-projects/spring-boot</url></scm><issueManagement><system>GitHub</system><url>https://github.com/spring-projects/spring-boot/issues</url></issueManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>2.4.0</version><scope>compile</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-test</artifactId><version>2.4.0</version><scope>compile</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-test-autoconfigure</artifactId><version>2.4.0</version><scope>compile</scope></dependency><dependency><groupId>com.jayway.jsonpath</groupId><artifactId>json-path</artifactId><version>2.4.0</version><scope>compile</scope></dependency><dependency><groupId>jakarta.xml.bind</groupId><artifactId>jakarta.xml.bind-api</artifactId><version>2.3.3</version><scope>compile</scope></dependency><dependency><groupId>org.assertj</groupId><artifactId>assertj-core</artifactId><version>3.18.1</version><scope>compile</scope></dependency><dependency><groupId>org.hamcrest</groupId><artifactId>hamcrest</artifactId><version>2.2</version><scope>compile</scope></dependency><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.7.0</version><scope>compile</scope></dependency><dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><version>3.6.0</version><scope>compile</scope></dependency><dependency><groupId>org.mockito</groupId><artifactId>mockito-junit-jupiter</artifactId><version>3.6.0</version><scope>compile</scope></dependency><dependency><groupId>org.skyscreamer</groupId><artifactId>jsonassert</artifactId><version>1.5.0</version><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.3.1</version><scope>compile</scope></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.3.1</version><scope>compile</scope></dependency><dependency><groupId>org.xmlunit</groupId><artifactId>xmlunit-core</artifactId><version>2.7.0</version><scope>compile</scope><exclusions><exclusion><artifactId>jaxb-api</artifactId><groupId>javax.xml.bind</groupId></exclusion></exclusions></dependency></dependencies></project>
我们就以路线1为例<artifactId>spring-boot-starter</artifactId>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>2.4.0</version><scope>compile</scope></dependency>
真正起作用是他,是spring-boot-starter-2.4.0.pom里的最终<artifactId>spring-boot-autoconfigure</artifactId>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId><version>2.4.0</version><scope>compile</scope></dependency>
autoconfigure.jar包分析
最终<artifactId>spring-boot-autoconfigure</artifactId>jar包长这样
自定义starter
上面理梳理了starter的依赖,真正起作用是他,是spring-boot-starter-2.4.0.pom里的最终<artifactId>spring-boot-autoconfigure</artifactId>
另外还要注意命名规范: starter命名规则:官方名称:spring-boot-starter-xxx 第三方命名:xxx-spring-boot-starter
我们创建一个空工程:
添加模块1:atguigu-hello-springboot-starter和模块2:atguigu-hello-springboot-starter-autoconfigurer
模块1依赖模块2,模块1是个空模块,只声明依赖
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.atguigu</groupId><artifactId>atguigu-hello-spring-boot-starter</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>com.atguigu</groupId><artifactId>atguigu-hello-spring-boot-starter-autoconfigure</artifactId><version>0.0.1-SNAPSHOT</version></dependency></dependencies></project>
模块2依赖官方<artifactId>spring-boot-starter</artifactId>
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.0</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.atguigu</groupId><artifactId>atguigu-hello-spring-boot-starter-autoconfigure</artifactId><version>0.0.1-SNAPSHOT</version><name>atguigu-hello-spring-boot-starter-autoconfigure</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency></dependencies></project>

新建空工程
模块1:atguigu-hello-springboot-starter
模块1只写pom别的都不写,全部删除
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.atguigu</groupId><artifactId>atguigu-hello-spring-boot-starter</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>com.atguigu</groupId><artifactId>atguigu-hello-spring-boot-starter-autoconfigure</artifactId><version>0.0.1-SNAPSHOT</version></dependency></dependencies></project>
模块2:atguigu-hello-springboot-starter-autoconfigure
业务类HelloService
这是我们抽取的抽象业务类:HelloService
package com.atguigu.hello.service;import com.atguigu.hello.bean.HelloProperties;import org.springframework.beans.factory.annotation.Autowired;/*** 默认不要放在容器中*/public class HelloService {@AutowiredHelloProperties helloProperties;public String sayHello(String userName){return helloProperties.getPrefix() + ":"+userName+"》"+helloProperties.getSuffix();}}
属性配置类HelloProperties
上面需要我们注入属性getPrefix,getSuffix,怎么办呢?模仿Spring的自动配置源码,封装属性配置类HelloProperties
并打上注解@ConfigurationProperties("atguigu.hello"),表明谁要用该场景启动器,谁就要在自己的yaml/properties配置指定前缀配置方可生效
package com.atguigu.hello.bean;import org.springframework.boot.context.properties.ConfigurationProperties;@ConfigurationProperties("atguigu.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;}}
开启自动配置HelloServiceAutoConfiguration
开启@EnableConfigurationProperties(HelloProperties.class)注解,使属性配置类HelloProperties.class生效
同时使用@Configuration搭配@Bean以及@ConditionalOnMissingBean(HelloService.class)将我们的目标业务类HelloService有条件的注入到容器,假如引入该场景启动器的**用户自己new了HelloService且自己打了@Bean注解**则使用用户自己new的
package com.atguigu.hello.auto;import com.atguigu.hello.bean.HelloProperties;import com.atguigu.hello.service.HelloService;import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;import org.springframework.boot.context.properties.EnableConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configuration@EnableConfigurationProperties(HelloProperties.class) //默认HelloProperties放在容器中public class HelloServiceAutoConfiguration{@ConditionalOnMissingBean(HelloService.class)@Beanpublic HelloService helloService(){HelloService helloService = new HelloService();return helloService;}}
META-INF/spring.factories
同时不要忘记最后一步,在模块2新建META-INF/spring.factories文件,将自动配置类全类名com.atguigu.hello.auto.HelloServiceAutoConfiguration写进META-INF/spring.factories,这样我们的场景启动器才会使我们所有的场景配置生效:META-INF/spring.factories
# Auto Configureorg.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.atguigu.hello.auto.HelloServiceAutoConfiguration
项目结构如下所示:
其实模块2可以不写的,只有1个moudel也可以实现 如果是1个模块,那么模块1也可以建spring.factories,将模块2的逻辑封装写到模块1,HelloServiceAutoConfiguration写到模块1
打包模块2
打包并打包到本地maven仓库,clean &&install
因为我们模块1依赖模块2,所以先打包模块2,再打包模块1
这样 包就放到了我们的本地maven仓库E:\dev_dir_temp\apache-maven-3.3.9\respository
[INFO] --- maven-install-plugin:2.5.2:install (default-install) @ atguigu-hello-spring-boot-starter-autoconfigure ---[INFO] Installing E:\开发教程\springboot2\boot-09-customer-starter\atguigu-hello-spring-boot-starter-autoconfigure\target\atguigu-hello-spring-boot-starter-autoconfigure-0.0.1-SNAPSHOT.jar to E:\dev_dir_temp\apache-maven-3.3.9\respository\com\atguigu\atguigu-hello-spring-boot-starter-autoconfigure\0.0.1-SNAPSHOT\atguigu-hello-spring-boot-starter-autoconfigure-0.0.1-SNAPSHOT.jar[INFO] Installing E:\开发教程\springboot2\boot-09-customer-starter\atguigu-hello-spring-boot-starter-autoconfigure\pom.xml to E:\dev_dir_temp\apache-maven-3.3.9\respository\com\atguigu\atguigu-hello-spring-boot-starter-autoconfigure\0.0.1-SNAPSHOT\atguigu-hello-spring-boot-starter-autoconfigure-0.0.1-SNAPSHOT.pom[INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------------[INFO] Total time: 1.826 s[INFO] Finished at: 2022-05-08T16:13:55+08:00[INFO] Final Memory: 28M/263M[INFO] ------------------------------------------------------------------------Process finished with exit code 0
tips:如果使用mvn clean package,那么包只会放到我们的项目target目录而已
打包模块1

[INFO] --- maven-install-plugin:2.4:install (default-install) @ atguigu-hello-spring-boot-starter ---[INFO] Installing E:\开发教程\springboot2\boot-09-customer-starter\atguigu-hello-spring-boot-starter\target\atguigu-hello-spring-boot-starter-1.0-SNAPSHOT.jar to E:\dev_dir_temp\apache-maven-3.3.9\respository\com\atguigu\atguigu-hello-spring-boot-starter\1.0-SNAPSHOT\atguigu-hello-spring-boot-starter-1.0-SNAPSHOT.jar[INFO] Installing E:\开发教程\springboot2\boot-09-customer-starter\atguigu-hello-spring-boot-starter\pom.xml to E:\dev_dir_temp\apache-maven-3.3.9\respository\com\atguigu\atguigu-hello-spring-boot-starter\1.0-SNAPSHOT\atguigu-hello-spring-boot-starter-1.0-SNAPSHOT.pom[INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------------[INFO] Total time: 0.984 s[INFO] Finished at: 2022-05-08T16:13:18+08:00[INFO] Final Memory: 12M/243M[INFO] ------------------------------------------------------------------------Process finished with exit code 0
用户项目导入自定义starter使用
用户项目结构如下:
引入自定义starter,引入的是模块1
<dependency><groupId>com.atguigu</groupId><artifactId>atguigu-hello-spring-boot-starter</artifactId><version>1.0-SNAPSHOT</version></dependency>

编写application.properties
atguigu.hello.prefix=ATGUIGUatguigu.hello.suffix=88888
注入场景启动器目标业务类Bean
package com.atguigu.boot.controller;import com.atguigu.hello.service.HelloService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class HelloController {@AutowiredHelloService helloService;@GetMapping("/hello")public String sayHello(){String s = helloService.sayHello("张三");return s;}}
覆盖注入场景启动器目标业务类Bean

假如我们在新工程里面自己手动用new的方式创建了HelloService这个Bean,由于我们源码里面写了
@ConditionalOnMissingBean(HelloService.class)@Beanpublic HelloService helloService(){HelloService helloService = new HelloService();return helloService;}
所以,用户创建的HelloServicebean会覆盖源码的HelloServicebean
可以在用户自己注入bean的地方打断点,重新运行新项目发现会执行用户的bean创建
