@SpringBootApplication
@SpringBootApplication注解由@SpringBootConfiguration、@ComponentScan、@EnableAutoConfiguration三个注解组成
@SpringBootConfiguration
:我们点进去以后可以发现底层是Configuration注解,说白了就是支持JavaConfig的方式来进行配置(使用Configuration配置类等同于XML文件)。@EnableAutoConfiguration
:开启自动配置功能@ComponentScan
:扫描注解,默认是扫描当前类下的package。将@Controller/@Service/@Component/@Repository
等注解加载到IOC容器中。
所以SpringBoot入口类可以写成:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
public class KnowledgeBaseApplication {
public static void main(String[] args) {
SpringApplication.run(KnowledgeBaseApplication.class, args);
}
}
@EnableAutoConfiguration
我们知道SpringBoot可以帮我们减少很多的配置,也肯定听过“约定大于配置”这么一句话,那SpringBoot是怎么做的呢?其实靠的就是@EnableAutoConfiguration
注解。
简单来说,这个注解可以帮助我们自动载入应用程序所需要的所有默认配置。
@AutoConfigurationPackage
:自动配置包@Import
:给IOC容器导入组件
@AutoConfigurationPackage
图中所示依靠@Import注解。点进去看重要的代码是:
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata,
BeanDefinitionRegistry registry) {
register(registry, new PackageImport(metadata).getPackageName());
}
在默认的情况下就是将:主配置类(@SpringBootApplication
)的所在包及其子包里边的组件扫描到Spring容器中。
注意:
@Controller/@Service/@Component/@Repository
这些注解是由ComponentScan
来扫描并加载的。- 诸如
@Entity
此类的注解是由@AutoConfigurationPackage
扫描并加载
@Import
AutoConfigurationImportSelector.class
此时只看到了SpringFactoriesLoader.loadFactoryNames()方法加载
此时可以知道:
FACTORIES_RESOURCE_LOCATION
的值是META-INF/spring.factories
- Spring启动的时候会扫描所有jar路径下的
META-INF/spring.factories
,将其文件包装成Properties对象 - 从Properties对象获取到key值为
EnableAutoConfiguration
的数据,然后添加到容器里边。
总结
@SpringBootApplication
等同于下面三个注解:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
其中@EnableAutoConfiguration
是关键(启用自动配置)该注解又通过 @Import 注解导入了AutoConfigurationImportSelector类,在该类中加载 META-INF/spring.factories 的配置信息。然后筛选出以 EnableAutoConfiguration 为 key 的数据,加载到 IOC 容器中,实现自动配置功能!
@SpringBootApplication
@SpringBootApplication注解由@SpringBootConfiguration、@ComponentScan、@EnableAutoConfiguration三个注解组成
@SpringBootConfiguration
:我们点进去以后可以发现底层是Configuration注解,说白了就是支持JavaConfig的方式来进行配置(使用Configuration配置类等同于XML文件)。@EnableAutoConfiguration
:开启自动配置功能@ComponentScan
:扫描注解,默认是扫描当前类下的package。将@Controller/@Service/@Component/@Repository
等注解加载到IOC容器中。
所以SpringBoot入口类可以写成:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
public class KnowledgeBaseApplication {
public static void main(String[] args) {
SpringApplication.run(KnowledgeBaseApplication.class, args);
}
}
@EnableAutoConfiguration
我们知道SpringBoot可以帮我们减少很多的配置,也肯定听过“约定大于配置”这么一句话,那SpringBoot是怎么做的呢?其实靠的就是@EnableAutoConfiguration
注解。
简单来说,这个注解可以帮助我们自动载入应用程序所需要的所有默认配置。
@AutoConfigurationPackage
:自动配置包@Import
:给IOC容器导入组件
@AutoConfigurationPackage
图中所示依靠@Import注解。点进去看重要的代码是:
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata,
BeanDefinitionRegistry registry) {
register(registry, new PackageImport(metadata).getPackageName());
}
在默认的情况下就是将:主配置类(@SpringBootApplication
)的所在包及其子包里边的组件扫描到Spring容器中。
注意:
@Controller/@Service/@Component/@Repository
这些注解是由ComponentScan
来扫描并加载的。- 诸如
@Entity
此类的注解是由@AutoConfigurationPackage
扫描并加载
@Import
AutoConfigurationImportSelector.class
此时只看到了SpringFactoriesLoader.loadFactoryNames()方法加载
此时可以知道:
FACTORIES_RESOURCE_LOCATION
的值是META-INF/spring.factories
- Spring启动的时候会扫描所有jar路径下的
META-INF/spring.factories
,将其文件包装成Properties对象 - 从Properties对象获取到key值为
EnableAutoConfiguration
的数据,然后添加到容器里边。
总结
@SpringBootApplication
等同于下面三个注解:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
其中@EnableAutoConfiguration
是关键(启用自动配置)该注解又通过 @Import 注解导入了AutoConfigurationImportSelector类,在该类中加载 META-INF/spring.factories 的配置信息。然后筛选出以 EnableAutoConfiguration 为 key 的数据,加载到 IOC 容器中,实现自动配置功能!
- 本文作者:
- 原文链接:
- 版权声明: 本博客所有文章除特别声明外,均采用 进行许可。转载请署名作者且注明文章出处。