SpringBoot自动装配
SpringBoot使用
-
可以在starts.spring.io官网选在版本初始化然后下载压缩包,再打开idea导入项目
-
可以直接使用idea新建项目选中spring Initializr,然后选择java环境等等记得勾选Spring Web
自动装配
-
之前在使用ssm框架时需要手动在pom.xml写入各种框架才能使用,需要各种复杂的配置
-
但是现在使用springboot之后有自动装配,springboot可以自动帮我们导入我们的依赖只需要在pom.xml导入一点点依赖
-
使用springboot在选择框架的时候可以看做模块化比如要使用web,只需要pom.xml导入一个依赖即可
-
说白了是springboot的启动场景(比如spring-boot-starter-web帮我们导入web环境所有的依赖)springboot会将所有的功能场景都变成启动器,要使用什么功能只需要导入对应的启动器即可
自动装配如何实现
-
新建项目之后会在java目录下有一个main程序入口,这个main方法是启动这个服务的入口
-
@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方法的定义类,找到运行的主类 */ } }
-
最主要的是这个@SpringBootApplication注释实现了自动装配
-
ctrl+鼠标左键查看源码:
-
这里又有很多注释,其中@SpringBootConfiguration是springboot的加载配置,@EnableAutoConfiguration是自动装配的注释,再点击查看源码
-
可以看到@AutoConfigurationPackage是自动配置包这个里面包括一个自动注册器Register.class
-
可以看到这个里面还Import了一个class文件,自动装配选择.class,再点进去查看源码,找到一个getAutoConfigurationEntry的方法
-
发现这个方法调用了一个获取候选配置getCandidateConfigurations的方法,再点进去
-
这个方法又调用加载了getSpringFactoriesLoaderFactoryClass()和getBeanClassLoader()
而getSpringFactoriesLoaderFactoryClass()返回EnableAutoConfiguration,只要是被@EnableAutoConfiguration注解的都会加载loadFactoryNames会加载spring.factories
-
getCandidateConfigurations(annotationMetadata, attributes)方法调用断言,如果没有候选配置就报错检查spring.factories,根据错误信息发现这个spring.factories是在spring-boot-autoconfigure 的/META-INF/spring.factories
-
找到这个文件打开,里面是各种解决方案和配置的东西,随便点一个进去看源码,会发现都有@Bean注释
-
它会以类名的方式返回,这些组件就会被添加到容器
-
但是springboot不会吧所有的配置都加载,而是通过@ConditionOn的方式判断是否导入
-
如果满足了这些conditionOn的条件则会被自动装配
-
总结来说springBoot所有的自动配置都是在启动main方法的时候扫描并加载:spring.factories所有的自动配置类都在这个文件中,但是不一定会生效,要判断条件是否成立,只要在pom.xml中导入了对应spring-boot-starter就有对应的启动器,有了启动器自动装配才会生效用@ConditionalOn的注解的这个注解的参数都满足的才会生效