SpringBoot啟動類:
@SpringBootApplication public class SpringBootDemo1Application { public static void main(String[] args) { SpringApplication.run(SpringBootDemo1Application.class, args); } }
@SpringBootApplication是一個組合注解,其中包含
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) public @interface SpringBootApplication {
1、查看SpringBootApplication中的參數
前面四個注解:(前面兩個為元注解)
//元注解:對注解進行描述的注解,加在注解類上 @Target(ElementType.TYPE) //有效時間,定義注解,一定:runtime @Retention(RetentionPolicy.RUNTIME) //注解是否在javaDoc文檔顯示 @Documented //注解是否被繼承,子類能不能繼承這個父類的注解 @Inherited
后面三個注解:
//springboot的配置類 @SpringBootConfiguration //開啟自動配置 @EnableAutoConfiguration //掃描注解 @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
2、查看@SpringBootConfiguration
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration //就是Configuration注解 public @interface SpringBootConfiguration {
3、查看@EnableAutoConfiguration
@EnableAutoConfiguration 簡單概括一下就是,借助@Import的支持,收集和注冊特定場景相關的bean定義。
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import(AutoConfigurationImportSelector.class) //導入一個類的核心類 public @interface EnableAutoConfiguration {
借助AutoConfigurationImportSelector,@EnableAutoConfiguration可以
幫助SpringBoot應用將所有符合條件的@Configuration配置都加載到當前SpringBoot創建並使用的IoC容器
AutoConfigurationImportSelector的核心方法:
@Override public String[] selectImports(AnnotationMetadata annotationMetadata) { if (!isEnabled(annotationMetadata)) { return NO_IMPORTS; } AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader .loadMetadata(this.beanClassLoader); AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata); return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations()); }
自動配置幕后英雄:SpringFactoriesLoader詳解
SpringFactoriesLoader屬於Spring框架私有的一種擴展方案,其主要功能就是從指定的配置文件META-INF/spring.factories加載配置。
public abstract class SpringFactoriesLoader { private static final Log logger = LogFactory.getLog(SpringFactoriesLoader.class); public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
配合@EnableAutoConfiguration使用的話,它更多是提供一種配置查找的功能支持,即根據@EnableAutoConfiguration的完整類名org.springframework.boot.autoconfigure.EnableAutoConfiguration作為查找的Key,獲取對應的一組@Configuration類
所以,@EnableAutoConfiguration自動配置:
配置類: “spring04.config.JdbcConfig” --> 反射技術
Class.forName() --> JdbcConfig的Class對象
--> newInstace() --> 得到配置類的對象
--> 配置類對象調用方法, 把方法產生的對象保存到Ioc容器
selectImport()解析”MATA-INF/spring.factories” 文件, 這個文件包含所有的配置類的”包.類”, 通過反射,調用每一個配置類的方法, 這個方法上都有一個@Bean, 把這個方法產生的對象保存到IOC容器, 這個配置類的bean就是原先在spring配置文件中配置的bean
4、@ComponentScan包掃描
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
component
是組件,scan
是掃描,所以這個注解的含義就是用來掃描組件的,
componentScan
掃描當前包及其子包下被 @Component
,@Controller
,@Service
,@Repository
注解標記的類並納入到spring容器中進行管理,所以這個注解會自動注入所有在主程序所在包下的組件。默認把當前啟動類所在的包作為掃描包的起點,例如咱們的項目,掃描 com.maweiqi
包
以前在ssm項目中我們需要去配置我們的包掃描
<context:component-scan base-package="com.xxx"></context:component-scan>