- SpringBoot是什么
- SpringBoot项目构建
- SpringBoot基础注解
- @Conditional
- @import
- @ConfigurationProperties
- 依赖管理大致与自动配置大致原理
- 依赖管理
- 自动配置
SpringBoot是为了整合其他框架所设计出来的一个“总框架”。利用SpringBoot的两大特性依赖管理和自动配置可以简单的整合其他框架,简化了其他框架的使用难度。
SpringBoot项目构建在pom文件中导入SpringBoot的父工程以及应用场景的起步依赖即可完成SpringBoot的配置。
org.springframework.boot spring-boot-starter-parent2.1.8.RELEASE org.springframework.boot spring-boot-starter-web
编写引导类(SprongBoot项目启动的起点)启动SpringBoot项目。
@SpringBootApplication
public class ApplicationMain {
public static void main(String[] args) {
SpringApplication.run(ApplicationMain.class, args);
}
}
SpringBoot基础注解
@Conditional
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@documented
public @interface Conditional {
Class extends Condition>[] value();
}
该注解需要传入一个实现了Condition接口的实现类的Class类对象,该接口规定的方法只有一个且返回值为boolean类型。
该注解规定了该注解的添加位置只能是类上或者方法上。
当该注解添加到类或者方法上时,当接口中的方法返回值为true时该类或者方法生效,负责不生效。
在@Conditional注解的基础上,SpringBoot封装了一系列条件判断注解便于判断添加该注解的类或者方法是否生效(是否存在某个bean、class或者环境(如web环境)等等)。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@documented
public @interface import {
Class>[] value();
}
该注解只能添加到类上,并且需要传入一个或者多个Class类对象。该注解会将这些Class类对象注册到SpringIOC容器中去。
@ConfigurationProperties@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@documented
public @interface ConfigurationProperties {
@AliasFor("prefix")
String value() default "";
@AliasFor("value")
String prefix() default "";
boolean ignoreInvalidFields() default false;
boolean ignoreUnknownFields() default true;
}
该注解可以添加在类或者方法上。通过@ConfigurationProperties注解可以给类上或者方法上的字段或者参数绑定application.yaml文件夹中带有prefix或者 value属性值前缀的数值。
需要注意的是在使用@ConfigurationProperties注解时,该类必须是一个bean因此必须添加@Component注解或者不添@Component注解而是在其他bean上添加@EnableConfigurationProperties注解,将 value属性设置成添加了@ConfigurationProperties注解的类的calss类对象即可。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@documented
@import({EnableConfigurationPropertiesimportSelector.class})
public @interface EnableConfigurationProperties {
Class>[] value() default {};
}
依赖管理大致与自动配置大致原理
依赖管理
当构建SpringBoot项目时,我们需要导入了SpringBoot的父工程以及应用场景的起步依赖。
父项目主要提供了各种技术的版本信息组合了一套最优的技术版本。
各种起步依赖里面定义了该场景所需的jar包的坐标合集,并且大部分版本来源于父工程这样不会出现版本冲突等问题。
当我们构建SpringMVC项目时,我们需要导入很多jar包还会因为版本原因出现报错等等问题。而SpringBoot构建web场景时只需要导入web的起步依赖,通过依赖传递就可以简单方便的获取到需要的jar包,而且不会出现版本冲突等问题。
这样就解决了jar包管理的问题大大简化了开发。
该程序是SpringBoot的引导类,是SoringBoot程序的起点也是这一步完成了各种bean的自动配置。
@SpringBootApplication
public class ApplicationMain {
public static void main(String[] args) {
SpringApplication.run(ApplicationMain.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}
)}
)
@SpringBootConfiguration注解它的底层其实是一个@Configuration注解。它的功能只是说明它是一个配置类。
@ComponentScan注解则定义了默认的包扫描规则,默认扫描引导类所在的包及其子包。
首先由于扫描注解默认只扫描引导类所在的包及其子包这就导致其他jar包的配置类不能被扫描到。而自动配置的关键注解@EnableAutoConfiguration解决了这个问题。它主要是利用@import注解加载了AutoConfigurationimportSelector.class进入IOC容器,而该类的selectimports方法将会把可能需要加载的所有配置类的全类名封装到一个String数组中返回,而SpringBoot框架将会根据这些全类名来加载这些配置类。这个方法获取全类名的底层原理是扫描所有jar包的meta-INF/spring.factories文件来获取全类名。这些全类名是提前写好的。但是Spring框架不会加载全部的配置类而是会根据@Conditional的派生注解中的信息来判断是否加载某个配置类以及这个配置类中的bean。
public String[] selectimports(Annotationmetadata annotationmetadata) {
if (!this.isEnabled(annotationmetadata)) {
return NO_importS;
} else {
AutoConfigurationmetadata autoConfigurationmetadata = AutoConfigurationmetadataLoader.loadmetadata(this.beanClassLoader);
AutoConfigurationimportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(autoConfigurationmetadata, annotationmetadata);
return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
}
@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 {};
}
SpringBoot的自动配置文件。
Mybatis的自动配置文件。
其中一个可能会被加载的一个配置类,当满足@ConditionalOnClass注解的条件时就会被加载否则就不会被加载到IOC容器中去。



