• spring项目中starter包的原理,以及自定义starter包的使用


    MAVEN项目中starter的原理

    一.原始方式

    我们最早配置spring应用的时候,必须要经历的步骤:1.pom文件中引入相关的jar包,包括spring,redis,jdbc等等 2.通过properties或者xml配置相关的信息 3.不断调试直到可以使用。

    问题:时间长,复杂,同时在写下一个项目的时候大概率要经过相同的模式配置才能达到可以使用的状态。同时在众多的jar中,我们需要相互配置依赖间的版本关系,十分的复杂

    原始版本:

    我们就想到能不能把这些jdbc整合起来,类似于深度学习中anaconda下载依赖一样去管理,依赖间的关系不需要我们去负责,而是交给spring去管理。

    starter版本:

    我们可以将starter包看作是一个包装箱,把复杂的事情都交给了spring负责,官方维护starter包会导入的东西。而我们只需要知道那个starter包是有什么用处,例如:spring-boot-starter-web是负责spring web项目的依赖。

    复制代码
    
                org.springframework.boot
                spring-boot-starter-web
            
    

    二.starter内部详情

    starter文件也只是一个pom文件,而不是jar,它的目的也是去自动的引入其他的jar文件,上图展示的spring-boot-starter-web中的依赖就有spring-boot-starter。

    starter只是一个pom文件

    下面也就是starter的关键所在,请问我们为什么引入了starter之后只需要配置一点点的个性化设置,例如创建application.properties仅仅配置端口等等就可以完成启动应用?是谁帮助我们配置了其他复杂的信息?

    引出自动配置

    三.自动配置

    1.自动配置类的梳理

    自动配置主要通过xxxAutoConfiguration这些类来实现,我们查找一个这样的类来进行示例演示

    上图是DataSourceAutoConfiguration这个自动配置类,我们可以看到类上的几个注解。

    • @Configuration 将该类标记为配置类,@Configuration注解的类可以看作是能生产让Spring IoC容器管理的Bean实例的工厂
    • @ConditionalOnClass表示某个类位于类路径上时候,才会实例化这个bean
    • @EnableConfigurationProperties注解的作用是使@ConfigurationProperties注解生效。如果只配置@ConfigurationProperties注解,在spring容器中是获取不到yml或者properties配置文件转化的bean的。

    我们点击@EnableConfiguration注解中的@DataSourceProperties进去查看

    可以查看到这里使用@configurationPropertes,@ConfigurationProperties注解的作用是把yml或者properties配置文件转化为bean。

    同时这里也设置了prefix前缀,在我们项目的application.properties中配置的时候,提示的就是这些bean实例中的属性。

    所以是使用@ConfigurationProperties和@EnableConfigurationProperties这两个注解来完成将一个包含众多属性的类来注册成为可供springIoc容器管理的bean。

    而这个bean的注册过程是在各个XXXAutoConfiguration类中完成的。

    2.如何发现依赖包中的bean

    我们都知道springboot默认扫描启动类下面的主类和子类的bean来完成注解,但是并没有包括依赖包中的类,那么依赖包中的bean是如何被发现和加载的?

    关键在于@SpringBootApplication这个注解

    注解层次: