1.前言Springboot的自动配置原理,面试经常被问到,但一直记不住。何不手写一个starter来加深记忆。看了之后发现大部分的starter都是按照这个原理来的,实践起来就会过目不忘。核心思想:约定大于配置。2.初探starter的启动原理我们来看看官网上的starter是怎么设计的,就这么写一个吧!我们Ctrl点击spring-boot-starter-web进入内部pom,发现里面有一个。org.springframework.bootspring-boot-starter2.5.3compile中这个Ctrl点击spring-boot-starter进入starter的内部pom:我们发现这个包依赖就是我们后面要做的:org.springframework.bootspring-boot-autoconfigure2.5.3compile我们现在可以创建两个项目:spring-boot-starter(starter)spring-boot-starter-autoconfigure(自动配置包)小编看到官方提醒是这样写的,按照官网命名即可,千万不要学小编!!您应该确保为您的启动器提供适当的命名空间。不要以.开头模块名称spring-boot。即使您使用不同的MavengroupId。我们将来可能会为您的自动配置内容提供官方支持。根据经验,您应该以启动器命名您的复合模块。例如,假设您正在为“acme”创建启动器,并将自动配置模块命名为acme-spring-boot和启动器acme-spring-boot-starter。如果您只有一个模块将两者结合起来,请将其命名为acme-spring-boot-starter。三、工程搭建1、新建一个空白工程,输入总工程名:在空白工程中新建两个,这里可以分开单独创建,这里编辑器和雷神一样,就不说了单独构建项目!2.新建一个maven项目包名及名称:3.新建一个springboot项目4.项目架构把这里没用的都删掉!!没有必要删除。四、配置1、在starter工程中引入自己的autoconfigure依赖,就是上面工程的设置。com.wangspring-boot-autoconfigure0.0.1-SNAPSHOT2、spring-boot-autoconfigurepom配置1.8UTF-8UTF-82.3.7.RELEASEorg.springframework.bootspring-boot-starter<版本>${spring-boot.version}org.projectlombok<artifactId>lombok1.18.24还是把没用的东西删掉,剩下的如下:5.写autoconfigure项目1.先配置一个bean删除自动启动类,我们不需要,在spring-boot-autoconfigure项目中新建一个bean,此时不需要让这个bean在容器中,我们自己写一个配置,让他自动添加到容器中,这是自动配置的思路。/***不用让它在容器里,我们自己写一个配置,让他自动加入容器*@authorwangzhenjun*@date2022/10/1416:26*/publicclassHelloService{@AutowiredprivateMyPropertiesmyProperties;publicStringHelloWord(Stringusername){returnmyProperties.getPrefix()+username+myProperties.getSuffix();}}2.写一个配置文件这里,为了获取配置文件中的属性值,springboot自动配置了大部分源码就这些了,所以写在一个配置文件里,其他的就可以获取到属性和值了按照开头!!/***@authorwangzhenjun*@date2022/10/1416:28*/@Data@ConfigurationProperties("wang.name")publicclassMyProperties{privateStringprefix;privateStringsuffix;}3.编写自动配置boot.context.properties.EnableConfigurationProperties;导入组织。springframework.context.annotation.Bean;导入org.springframework.context.annotation.Configuration;/***@authorwangzhenjun*@date2022/10/1416:33*/@Configuration//只有在没有这个bean的情况下才会生效@ConditionalOnMissingBean(HelloService.class)//加载配置文件并制作一个容器bean@EnableConfigurationProperties(MyProperties.class)publicclassServiceAutoConfiguration{/***将刚刚写入的服务添加到容器中*/@BeanpublicHelloServicehelloService(){returnnewHelloService();完成bean是否加入容器的注解:常用:@ConditionalOnClass@ConditionalOnMissingClass@ConditionalOnBean@ConditionalOnMissingBean@ConditionalOnProperty4、新建一个spring.factories我们在源码中看到自动配置,就是从这个文件加载的,所以我们模仿这个新创建的One,这样就可以扫描加入容器了!如果是springboot2.7以上:文件夹名:META-INF.spring文件名:org.springframework.boot.autoconfigure.AutoConfiguration.imports直接写全类名!5、打包首先将spring-boot-autoconfigure打包到本地库中,然后打包spring-boot-starter。订单一定要有,否则找不到之前的包裹!!六、测试我们的新项目进行测试,新项目小编是不会带领大家去搭建的!1.导入我们的starter依赖com.wangspring-boot-starter1.0-SNAPSHOT2.添加一个配置文件wang:name:prefix:hellosuffix:8863新建controllertestclass@RestController@RequestMapping("/test")publicclassTestController{@AutowiredprivateHelloServicehelloService;@GetMapping("/starter")publicStringstarter(){returnhelloService.HelloWord("tom");}}4.测试访问成功,但是中文乱码,找不到解决方法如果有知道方法的请留言告诉我们!!主进程一清二楚,就可以慢慢体会自动配置的魅力了!整体流程应该是这样的:引入starter---xxxAutoConfiguration---将组件放入容器中---bindxxxProperties---配置项中文乱码,可能没有servlet,懂的可以走人留言告诉我的计划,谢谢大家!7.综上所述,看了看就可以了,做了就没用了!大家还是要做自己的实战操作,不要太高高在上,这样才会有所收获。简直就是协议大于配置+SPI发现机制!还有一些源码中经常出现的注解,记住了就可以自己写starter了!