SpringBoot自动装配

SpringBoot使用

  1. 可以在starts.spring.io官网选在版本初始化然后下载压缩包,再打开idea导入项目

  2. 可以直接使用idea新建项目选中spring Initializr,然后选择java环境等等记得勾选Spring Web

自动装配

  1. 之前在使用ssm框架时需要手动在pom.xml写入各种框架才能使用,需要各种复杂的配置

  2. 但是现在使用springboot之后有自动装配,springboot可以自动帮我们导入我们的依赖只需要在pom.xml导入一点点依赖

  3. 使用springboot在选择框架的时候可以看做模块化比如要使用web,只需要pom.xml导入一个依赖即可

  4. 说白了是springboot的启动场景(比如spring-boot-starter-web帮我们导入web环境所有的依赖)springboot会将所有的功能场景都变成启动器,要使用什么功能只需要导入对应的启动器即可

自动装配如何实现

  1. 新建项目之后会在java目录下有一个main程序入口,这个main方法是启动这个服务的入口

  2. @SpringBootApplication//标注这个类是springboot的类
    public class SpringbootHelloworldApplication {
    
        public static void main(String\\\[\\\] args) {
            //讲springboot应用启动
            //运行后开启了一个服务
            SpringApplication.run(SpringbootHelloworldApplication.class, args);
            //这个类大概做了四个事情
            /**
             * 1.推断应用的类型是普通项目还是Web项目
             * 2.查找并加载所有可用的初始化器,设置到initializer属性中
             * 3.找出所有的应用程序监听器,设置到listeners属性中
             * 4.推断并设置main方法的定义类,找到运行的主类
             */
        }
        
    
    }
    
  3. 最主要的是这个@SpringBootApplication注释实现了自动装配

  4. ctrl+鼠标左键查看源码:

  5. image.png

  6. 这里又有很多注释,其中@SpringBootConfiguration是springboot的加载配置,@EnableAutoConfiguration是自动装配的注释,再点击查看源码

  7. image.png

  8. 可以看到@AutoConfigurationPackage是自动配置包这个里面包括一个自动注册器Register.class

  9. 可以看到这个里面还Import了一个class文件,自动装配选择.class,再点进去查看源码,找到一个getAutoConfigurationEntry的方法

  10. image.png

  11. 发现这个方法调用了一个获取候选配置getCandidateConfigurations的方法,再点进去image.png

  12. 这个方法又调用加载了getSpringFactoriesLoaderFactoryClass()和getBeanClassLoader()

而getSpringFactoriesLoaderFactoryClass()返回EnableAutoConfiguration,只要是被@EnableAutoConfiguration注解的都会加载loadFactoryNames会加载spring.factories
  1. getCandidateConfigurations(annotationMetadata, attributes)方法调用断言,如果没有候选配置就报错检查spring.factories,根据错误信息发现这个spring.factories是在spring-boot-autoconfigure 的/META-INF/spring.factories

  2. 找到这个文件打开,里面是各种解决方案和配置的东西,随便点一个进去看源码,会发现都有@Bean注释

  3. image.png

  4. 它会以类名的方式返回,这些组件就会被添加到容器

  5. 但是springboot不会吧所有的配置都加载,而是通过@ConditionOn的方式判断是否导入

  6. image.png

  7. 如果满足了这些conditionOn的条件则会被自动装配

  8. 总结来说springBoot所有的自动配置都是在启动main方法的时候扫描并加载:spring.factories所有的自动配置类都在这个文件中,但是不一定会生效,要判断条件是否成立,只要在pom.xml中导入了对应spring-boot-starter就有对应的启动器,有了启动器自动装配才会生效用@ConditionalOn的注解的这个注解的参数都满足的才会生效