了解几个注解的概念下面的是核心注解
第一点:@SpringBootApplication介绍:
第二点:public @interface SpringBootApplication
@SpringBootConfiguration:springboot的配置
@Configuration:spring配置类
@Component:说明这也是spring的组件
@EnableAutoConfiguration::自动配置
@AutoConfigurationPackage:自动配置包
@Import(AutoConfigurationPackages.Registrar.class):自动配置‘包注册’
@Import(AutoConfigurationImportSelector.class):自动配置选择
@EnableAutoConfiguration 本文章以这个注解贯通自动配置原理 其他的细节下篇文章解释为了读者能看懂原理本文参用图片的方式来介绍
package com.bing.springboot0906;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Springboot0906Application {
public static void main(String[] args) {
SpringApplication.run(Springboot0906Application.class, args);
}
}
@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}
)}
)
上面的代码啥意思这里不介绍了上面有具体的说明
@Import(AutoConfigurationImportSelector.class):自动配置选择 点击下面的代码 AutoConfigurationImportSelector你会发现下面类中的代码 完全是考验Java的基础的时候了。
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = new ArrayList(SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader()));
ImportCandidates.load(AutoConfiguration.class, this.getBeanClassLoader()).forEach(configurations::add);
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories nor in META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. If you are using a custom packaging, make sure that file is correct.");
return configurations;
}
上面的代码 获取候选配置
点击这个进去:SpringFactoriesLoader
public final class SpringFactoriesLoader {
public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
private static final Log logger = LogFactory.getLog(SpringFactoriesLoader.class);
static final Map<ClassLoader, Map<String, List<String>>> cache = new ConcurrentReferenceHashMap();
private SpringFactoriesLoader() {
}