手写自定义springboot-starter,感受框架的魅力和原理( 二 )

还是把没用的东西删除了,剩余如下图:

手写自定义springboot-starter,感受框架的魅力和原理

文章插图
五、编写autoconfigure项目1. 配置一个bean首先删除了自动启动类,咱们用不到,在spring-boot-autoconfigure项目中新建一个bean,此时不需要让这个bean在容器中,我们写一个自己配置,让他自动加入到容器中 。这就是自动配置的思想
/** * 这里不需要让在容器中,我们写一个自己配置,让他自动加入到容器中 * @author wangzhenjun * @date 2022/10/14 16:26 */public class HelloService {@Autowiredprivate MyProperties myProperties;public String HelloWord (String username){return myProperties.getPrefix() + username + myProperties.getSuffix();}}2. 编写一个配置文件这里为了获取配置文件中的属性值,springboot自动配置源码里大部分都是,这样实现在一个配置文件中书写,其他的可以按照开头获取到属性和值!!
/** * @author wangzhenjun * @date 2022/10/14 16:28 */@Data@ConfigurationProperties("wang.name")public class MyProperties {private String prefix;private String suffix;}3. 编写自动配置import com.wang.springbootautoconfigure.properties.MyProperties;import com.wang.springbootautoconfigure.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;/** * @author wangzhenjun * @date 2022/10/14 16:33 */@Configuration//没有这个bean的时候才会生效@ConditionalOnMissingBean(HelloService.class)// 加载配置文件,让它成为容器中的bean@EnableConfigurationProperties(MyProperties.class)public class ServiceAutoConfiguration { /*** 把刚刚写的服务,加入到容器中*/@Beanpublic HelloService helloService (){return new HelloService();}}主要就是condition下的几个注解,来完成bean是否加入到容器中:常用的:
  • @ConditionalOnClass
  • @ConditionalOnMissingClass
  • @ConditionalOnBean
  • @ConditionalOnMissingBean
  • @ConditionalOnProperty
    手写自定义springboot-starter,感受框架的魅力和原理

    文章插图
4. 新建spring.factories我们看到源码里自动配置,就是从这个文件获取加载,所以我们模仿这新建一个,这样就可以扫描加入容器中!!
手写自定义springboot-starter,感受框架的魅力和原理

文章插图
如果是springboot2.7以上就是:文件夹名称:META-INF.spring文件名称:org.springframework.boot.autoconfigure.AutoConfiguration.imports
手写自定义springboot-starter,感受框架的魅力和原理

文章插图
里面直接写全类名即可!
5. 打包先把spring-boot-autoconfigure打包到本地库,在打包spring-boot-starter,顺序一定要有,不然找不到前者的包!!
手写自定义springboot-starter,感受框架的魅力和原理

文章插图
六、测试我们那一个新项目进行测试,新项目小编就不带大家建了!
1. 导入咱们的starter依赖<dependency><groupId>com.wang</groupId><artifactId>spring-boot-starter</artifactId><version>1.0-SNAPSHOT</version></dependency>2. 添加配置文件wang: name:prefix: hellosuffix: 886
手写自定义springboot-starter,感受框架的魅力和原理

文章插图
3. 新建controller测试类@RestController@RequestMapping("/test")public class TestController {@Autowiredprivate HelloService helloService;@GetMapping("/starter")public String starter(){return helloService.HelloWord("tom");}}

经验总结扩展阅读