SpringBoot的自动加载原理
1. @SpringBootApplication
@SpringBootApplication 是一个复合注解,其中包括三个比较重要的注解:
@ComponentScan
扫描当前包以及子包的所有类的,将带有注解的类都加载到IOC容器中@EnableAutoConfiguration
基于配置项,引入一些依赖类。扫描所有jar包下面的META-INF/spring.factories,该文件的配置类就是我们开发所需要的工具类。然后将这些依赖类注入到IOC容器中。整个依赖注入用到的工具类如下SpringFactoriesLoader
public final class SpringFactoriesLoader {
public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
//其余部分省略
}
@SpringBootConfiguration
说明整个类是一个IOC容器配置类
2. @EnableAutoConfiguration详解
@Target({ElementType.TYPE}) //注解的适用范围
@Retention(RetentionPolicy.RUNTIME) //注解生命周期
@Documented //表明这个注解可以被javadoc记录
@Inherited //子类可以继承该注解
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
@AutoConfigurationPackage
将当前启动类的包以bean的形式注入到IOC容器@Import({AutoConfigurationImportSelector.class})
加载META-INF/spring.factories里面的配置类
3. application.yml是怎样生效的
我们使用 MybatisPlusAutoConfiguration
来举例:
@Configuration
@ConditionalOnClass({SqlSessionFactory.class, MybatisSqlSessionFactoryBean.class})
@ConditionalOnBean({DataSource.class})
@EnableConfigurationProperties({MybatisPlusProperties.class})
@AutoConfigureAfter({DataSourceAutoConfiguration.class})
public class MybatisPlusAutoConfiguration {
@EnableConfigurationProperties
让使用@ConfigurationProperties
这个注解的类注入到IOC容器@ConfigurationProperties
读取配置文件里面的属性值@ConfigurationProperties( prefix = "mybatis-plus" ) public class MybatisPlusProperties { public static final String MYBATIS_PLUS_PREFIX = "mybatis-plus"; private String configLocation; private String[] mapperLocations; private String typeAliasesPackage; private String typeEnumsPackage; private String typeHandlersPackage; private boolean checkConfigLocation = false; private ExecutorType executorType; private Properties configurationProperties; @NestedConfigurationProperty private GlobalConfig globalConfig; @NestedConfigurationProperty private MybatisConfiguration configuration;
如果喜欢博主,可以关注我的公众号哈