• springboot自动配置流程,以及实现自定义springboot starter


    SpringBoot starter机制:
             SpringBoot starter是一种常重要的机制,能抛以前繁杂的配置,将其统一集成进 tarter,应用者只需要在 maven starter中引入依赖。SpringBoot能自动扫描要加载的信息并启动相的认配置, starer让我们探脱了各种依赖的处理,需要配置种信息的国 SpringBoot动通过 classpath路径下的类发现需要的Bean,并注册进容器, SpringBoot提供了针对日常企业应用研发各种场的 spring--starter-boot-依起模块,所有这依赖模块都遵着约定成俗的默认配置,并允许我们调整这些配置即约走大于配置的理念。

    为什么要自定义starter?

            在我们的日常开发工作中,经有一些独立于业之外的配置模块,我们经常将其放到一个特定的包下,然后如一个工程需要用这块功能的时,需要代码硬贝到一个工程,重新集成一遍,麻至极如果我们这些可独立于业务代之外的功配置模块封装成一个个 starter,爱用的时候只需要其在pom中引用依可,再由 SpringBoot为我们完成自动配,就非常轻松了。

    一、springboot自动配置原理

    首先找到springboot项目的启动类,查看核心注解 @SpringBootApplication

    可以看到 @SpringBootApplication 的底层注解有三个,其他四个是元注解,用来自定义注解的

     @SpringBootApplication 注解组成:

     SpringBoot自动配置流程:

     二、自定义starter

    1、新建项目

     项目命名采用SpringBoot官方的建议:

    官方的命名为 spring-boot-starter-xxx ,我们自定义的尽量采用 xxx-spring-boot-starter (便于区别)。

    【引入依赖】:

    1. <dependencies>
    2. <dependency>
    3. <groupId>org.springframework.bootgroupId>
    4. <artifactId>spring-boot-autoconfigureartifactId>
    5. <version>2.7.3version>
    6. dependency>
    7. <dependency>
    8. <groupId>org.springframework.bootgroupId>
    9. <artifactId>spring-boot-configuration-processorartifactId>
    10. <version>2.7.3version>
    11. <optional>trueoptional>
    12. dependency>
    13. dependencies>

     2、自定义一个简单实体,配置信息

    1. @EnableConfigurationProperties //开启支持配置文件
    2. @ConfigurationProperties(prefix = "simplebean") //配置前缀
    3. public class SimpleBean {
    4. private Integer id;
    5. private String name;
    6. public Integer getId() {
    7. return id;
    8. }
    9. public void setId(Integer id) {
    10. this.id = id;
    11. }
    12. public String getName() {
    13. return name;
    14. }
    15. public void setName(String name) {
    16. this.name = name;
    17. }
    18. @Override
    19. public String toString() {
    20. return "SimpleBean{" +
    21. "id=" + id +
    22. ", name='" + name + '\'' +
    23. '}';
    24. }
    25. }

    3、自动配置类

    1. @Configuration
    2. public class MyAutoConfiguration {
    3. static {
    4. System.out.println("MyAutoConfiguration init……");
    5. }
    6. @Bean
    7. public SimpleBean simpleBean() {
    8. return new SimpleBean();
    9. }
    10. }

    4、resources文件下新建目录 META-INF 并添加文件spring.factories

     

     

     5、测试

    1. @RunWith(SpringRunner.class)
    2. @SpringBootTest
    3. public class SpringBootMyTestApplication {
    4. @Autowired
    5. private SimpleBean simpleBean;
    6. @Test
    7. public void contextLoads(){
    8. System.out.println(simpleBean);
    9. }
    10. }

    配置文件: 

     【结果】

     自此已经完成了一个简单的stater定义实现!现在有一个新的需求,要求能控制是否自动配置,别着急,我们再升级改造一下!

    6、实现控制是否开启自动配置

    引入一个标记类

    1. /**
    2. * 自动配置标记类
    3. */
    4. public class ConfigMarker {
    5. }

    再自定义一个注解 @ EnableAutoRegisterServer

    1. @Target(ElementType.TYPE)
    2. @Retention(RetentionPolicy.RUNTIME)
    3. @Import(ConfigMarker.class) //生成对应的实例,导入
    4. public @interface EnableAutoRegisterServer {
    5. }

     自动配置类引入一个新注解 @ConditionalOnBean

    1. @Configuration
    2. @ConditionalOnBean(ConfigMarker.class) //需要存在某些对象才生成当前bean
    3. public class MyAutoConfiguration {
    4. static {
    5. System.out.println("MyAutoConfiguration init……");
    6. }
    7. @Bean
    8. public SimpleBean simpleBean() {
    9. return new SimpleBean();
    10. }
    11. }

    继续测试

     

     OK!完结 撒花……

  • 相关阅读:
    MySQL事务控制
    好消息,微信消费者投诉工具升级,可以直接回复用户、处理投诉了。。。
    爱尔兰公司改名要遵循一定的程序和规定
    企业服务器中了babyk勒索病毒怎么办,babyk勒索病毒解密数据集恢复
    22.app.js的全局数据共享
    sqli-labs 靶场闯关基础准备、学习步骤、SQL注入类型,常用基本函数、获取数据库元数据
    ubuntu20 install ros
    JS6day(DOM结点的查找、增加、删除。实例化时间)
    推荐一个非常实用的程序员导航网站,码农必备!
    一文了解微分段应用场景与实现机制
  • 原文地址:https://blog.csdn.net/m0_46013789/article/details/126729036