1. Springboot项目的构建方式
1.1 通过官网自动生成
1.2 IDEA通过maven项目构建
a.创建一个独立的maven项目
b.引入对应依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.15.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
c. 添加对应的启动器
@SpringBootApplication
public class GpSpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(GpSpringBootApplication.class,args);
}
}
d.启动启动器的主方法即可
2.Springboot的常规配置
2.1 入口类和相关注解
@SpringBootApplication
public class GpSpringbootDemo02Application {
public static void main(String[] args) {
// Spring IoC 容器的初始化
ApplicationContext ac = SpringApplication.run(GpSpringbootDemo02Application.class, args);
}
}
main方法: 其实完成的就是一个SpringIOC容器的初始化操作
@SpringBootApplication注解
- 在IOC初始化的时候会加载该注解
- 是一个组合注解
@Target({ElementType.TYPE}) // 注解可以写在哪些地方
@Retention(RetentionPolicy.RUNTIME) // 该注解的作用域 RESOURCES CLASS RUNTIME
@Documented // 该注解会被API抽取
@Inherited // 可继承
// 以上四个是Java中提供的元注解
@SpringBootConfiguration // 本质上就是一个Configuration注解
@EnableAutoConfiguration // 自动装配的注解
@ComponentScan( // 扫描 会自动扫描 @SpringBootApplication所在的类的同级包(com.gupaoedu)以及子包中的Bean,所有一般我们建议将入口类放置在 groupId+artifcatID的组合包下
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
2.2 常规配置
在Spring Boot中给我们提供的有两个配置文件 applicationContext.properties,applicationContext.yml作用是一样的,一个项目中只需要其中的一个就可以了。
自定义属性
# 自定义的配置信息
user.username=bobo
user.age=18
user.address=湖南长沙
获取
@Value("${user.username}")
private String userName;
@Value("${user.age}")
private Integer age;
@Value("${user.address}")
private String address;
2.3 logback日志
Spring Boot内置的有Logback的依赖
直接在属性文件中简单配置
# logback的配置
logging.file=d:/log.log
logging.level.org.springframework.web=DEBUG
或者单独提供一个logback.xml
2.4 Profile
命名规则 application-xxx.properties
spring.profiles.active=xxx # 指定对应的环境
3.Springboot的静态资源
3.1 static目录
SpringBootmore的存放静态资源的目录
3.2 webapp目录
在resources统计目录下创建一个webapp目录,该目录的类型必须是ResourcesRoot
3.3 自定义静态资源路径
自定义目录后,创建对应的相关资源,然后在属性文件中去覆盖静态资源的路径配置即可
# 表示所有的访问都经过静态资源路径
spring.webflux.static-path-pattern=/**
# 覆盖默认的配置,所有需要将默认的static public等这些路径将不能作为静态资源的访问
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/custom
4.自动装配的原理
@EnableAutoConfiguration
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
通过@EableAutoConfiguration注解发现。其本身就是一个组合注解,有一个注解我们必须要先弄清除@Import注解,可参考博客Spring之IOC-优快云博客
4.1 原理分析
public String[] selectImports(AnnotationMetadata annotationMetadata) {
if (!this.isEnabled(annotationMetadata)) {
return NO_IMPORTS;
} else {
// 加载META-INF/spring-autoconfigure-metadata.properties
AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);
AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata);
// 返回需要IoC加载的类型数组
return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
}
protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata, AnnotationMetadata annotationMetadata) {
if (!this.isEnabled(annotationMetadata)) {
return EMPTY_ENTRY;
} else {
AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
// 获取候选的配置信息 META-INF/spring.factories 加载了很多的 类路径
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
// 去掉重复的
configurations = this.removeDuplicates(configurations);
// 去掉要排除掉的类型
Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
this.checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
// 过滤器
configurations = this.filter(configurations, autoConfigurationMetadata);
// 广播
this.fireAutoConfigurationImportEvents(configurations, exclusions);
return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
}
}
其启动的流程:
1.在SpringBoot项目启动的时候,会加载SpringBootApplication这个注解
2.会解析@EnableAutoConfiguration注解
3.与之对应的解析@Import注解
4.执行ImportSelector接口的的实现
5.加载META-INF/spring-autoconfigure-metadata.properties中的注解元数据信息
6.加载META-INF/spring.factories各种类路径【第三方扩展也同样的会加载对应的文件 SPI扩展机制】