自动装配
原理初探
pom.xml
- spring-boot-dependencies 核心依赖在父工程中
- 我们在引入springboot依赖时 不需要版本号 是因为有这些版本仓库的支持
启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
启动器 :就是springboot所需场景的启动器
例如: spring-boot-starter-web 配置这个启动器他就会加载web相关的一些组件和服务 比如tomcat
springboo会将所有的功能场景变成一个个启动器
如果我们需要使用某些功能 我们只需要找到对应的启动器 引入pom.xml 即可
主程序
//@SpringBootApplication 标注这个类是一个springboot的应用
@SpringBootApplication
public class Application {
public static void main(String[] args) {
//此方法将springboot应用启动
SpringApplication.run(Application.class, args);
}
}
- 注解
@ComponentScan注解作用
@ComponentScan用于类或接口上主要是指定扫描路径,spring会把指定路径下带有指定注解的类自动装配到bean容器里。会被自动装配的注解包括@Controller、@Service、@Component、@Repository等等。其作用等同于<context:component-scan base- package="com.maple.learn" />配置
@SpringBootConfiguration:springboot的配置文件
@Configuration:spring 配置类
@Component:说明这也是spring的一个组件
@EnableAutoConfiguration:自动配置
@AutoConfigurationPackage:自动配置包
@Import({AutoConfigurationPackages.Registrar.class}):自动配置"包注册"
@Import({AutoConfigurationImportSelector.class}):自动配置导入选择
//获取所有的配置
List<String>configurations=this.getCandidateConfigurations(annotationMetadata,attributes);
获取候选的配置
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations =
SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(),
this.getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
return configurations;
}
META-INF/spring.factories:自动配置的核心文件
Properties properties = PropertiesLoaderUtils.loadProperties(resource);
所有的资源加载到配置类中
结论
springboot所有的自动装配都是在启动的时候扫描并加载:spring.factories所有的自动配置类都在这里面但是不一定生效,要判断条件是否成立,只要导入了对应的start启动器,自动装配就会生效然后就会配置成功了
springboot自动装配分为2部分 一部分自动装配是当前主启动类下所在包及包下类中所需由@AutoConfigurationPackage所导入 另一部分系统配置所需要的由@Import(AutoConfigurationImportSelector.class)所导入
- springboot在启动的时候 从类路径下:/META-INF/spring.facatories 获取指定的值;
- 将这些自动配置的类导入容器,自动配置类就会生效帮我们进行自动配置
- 以前我们需要自动配置的东西,现在springboot帮我们做了
- 整个javaEE,解决方案和自动配置的的东西都在spring-boot-autoconfigure-2.3.5.RELEASE.jar这个包下
- 他会将所有需要导入的组件,以类名的方式返回,这些组件就会被添加到容器中
- 容器中也会存在非常多的XXXAutoConfiguration的文件(@Bean),就是这些类给容器中导入了这个场景需要的所有组件并自动配置,@Configuration,javaConfig
- 有了自动配置类就免去了我们手动编写配置文件的工作了
通过对配置文件的分析 发现配置文件和自动配置之间的关系
/表示这是一个配置类
@Configuration(proxyBeanMethods = false)
//自动配置属性 ServerProperties
@EnableConfigurationProperties(ServerProperties.class)
//spring的底层注解:根据不同的条件来判断当前配置或者类是否生效
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = "server.servlet.encoding", value = "enabled", matchIfMissing = true)
通过注解
@ConfigurationProperties(prefix = "") 绑定配置文件和java类 在通过源码展示发现
1、SpringBoot启动会加载大量的自动配置类
2、我们看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中;
3、我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件存在在其中,我们就不需要再手动配置了)
4、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们只需要在配置文件中指定这些属性的值即可;
xxxxAutoConfigurartion:自动配置类;给容器中添加组件
xxxxProperties:封装配置文件中相关属性;
xxxxAutoConfigurartion:自动配置类===》注入所需要的类格式为 xxxxProperties==》封装相关的属性(默认属性)=====》applicatio.yaml可以修改默认属性来增加程序的灵活性
在springboot中,有非常多的XXXConfiguration帮我们进行扩展配置只要看见了这个东西我么就要注意了