这是我参与8月更文挑战的第23天,活动详情查看:8月更文挑战
依赖
pom.xml
pom.xml的父类 spring-boot-starter-parent
启动器
spring-boot-starter-XXX:从dependencies中自动导入环境依赖
例如-web:自动导入web环境的所有依赖
点击去就能发现很多依赖包:spring-web,spring-webmvc,tomcat,json
<dependency>
<!-- 启动器,web这个依赖包含了SpringMvc,自动装配,使用tomcat为默认容器-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
spring-boot-starter-parent
资源过滤,maven插件
<resources>
<resource>
<filtering>true</filtering>
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>**/application*.yml</include>
<include>**/application*.yaml</include>
<include>**/application*.properties</include>
</includes>
</resource>
<resource>
<directory>${basedir}/src/main/resources</directory>
<excludes>
<exclude>**/application*.yml</exclude>
<exclude>**/application*.yaml</exclude>
<exclude>**/application*.properties</exclude>
</excludes>
</resource>
</resources>
dependenices
所有功能场景变成启动器
spring-boot-dependencies 包下,已经指定好了那个版本,依赖时就不需要指定了
这些就是启动器
如果你想用哪个环境,就启用对应的启动器就行了
主程序
//这个类就是一个Component
@SpringBootApplication
//@SpringBootApplication标志这个类是一个springboot的应用
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
注解
@主配置类:springBootApplication:
作用:将该包及其所有子包纳入spring容器,这就是为什么要将业务放到主程序同级目录下的原因
//元注解,用来修饰当前注解,就像public类的修饰词,无实际功能
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
// springboot的配置,说明这是一个配置文件类,它会被@ComponentScan扫描到
@SpringBootConfiguration
// 开启自动装配
@EnableAutoConfiguration
//扫描包(filters过滤一些东西)
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes =TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
@SpringBootConfiguration:主程序为配置类
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
// 配置类
@Configuration
public @interface SpringBootConfiguration {
@EnableAutoConfiguration
作用:自动注册包和引入需要的第三方jar包
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
//获取所在包进行注册
@AutoConfigurationPackage
// 将第三方jar引入
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
@AutoConfigurationPackage:所在包注册
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
// 对源数据所在包下组件进行注册
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
@AutoConfigurationPackages.Registrar
作用:打包源数据获取包名调用register注册
register方法: 注册包
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistryregistry) {
// new PackageImport(metadata).getPackageName())将源数据打包,并获得其包名
register(registry, new PackageImport(metadata).getPackageName());
}
@Override
public Set<Object> determineImports(AnnotationMetadata metadata) {
return Collections.singleton(new PackageImport(metadata));
}
}
包名就是这个,主程序所在的包
@Import:三方jar包
List configurations = getCandidateConfigurations(annotationMetadata, attributes);
进入getCandidateConfigurations
getCandidateConfigurations:
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
// 这边获取所有配置 getSpringFactoriesLoaderFactoryClass()方法就在下面
List<String> configurations =SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
getBeanClassLoader());
// 如果为空,输出语句,META-INF/spring.factories
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;
}
// EnableAutoConfiguration返回的就是主程序的包,所以获取的是springboot的所有配置
protected Class<?> getSpringFactoriesLoaderFactoryClass() {
return EnableAutoConfiguration.class;
}
loadFactoryNames
spring.factories
所在地址:
里面储存的都是配置类的路径,当你需要用时,就会通过路径调用配置类(比如视图解析器)