一、Spring Boot
Spring Boot是用来简化新Spring应用的初始搭建以及开发过程。不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性等问题得到了很好的解决。(整个Spring技术栈的大整合、J2EE开发的一站式解决方案)
spring Boot优点:
快速创建独立运行的Spring项目以及与主流框架继承。
使用嵌入式的Servlet容器,应用无需打成WAR包
starters自动依赖与版本控制
大量的自动配置,简化开发,也可修改默认配置
无需配置XML,无代码生成,开箱即用
准生产环境的运行时应用监控
与云计算天然集成。
二、Spring Boot——helloworld
2.1,使用idea sping Initalizr自动创建一个Spring Boot应用:
2.2,spring boot 主程序:
@SpringBootApplication
public class SpringBoot01HelloworldApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBoot01HelloworldApplication.class, args);
}
}
@SpringBootApplication:Spring Boot应用标注在某个类上说明是SpringBoot的主配置类,SpringBoot就运行这个类的main方法来启动SpringBoot应用
点进@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 {
@SpringBootConfiguration:Spring Boot的配置类。标注在某个类上,表示这是一个Spring Boot的配置类
@Configuration:spring的注解,配置类上来标注这个注解(配置类==配置文件)
@Component:配置类也是容器中的一个组件
@EnableAutoConfiguration:开启自动配置功能。以前我们需要配置的东西(比如MVC视图,包扫描等),Spring Boot帮我们自动配置。
我们点进@EnableAutoConfiguration(自动配置注解)可以看到:
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
@AutoConfigurationPackage:自动配置包
@Import(AutoConfigurationPackages.Registrar.class)
Spring的底层注解@Import,给容器中导入一个组件,导入的组件由AutoConfigurationPackages.Registrar.class类指定(里面
个方法registerBeanDefinitions,获取)
将主配置类(@SpringBootConfiguration标注的类)的所在包(com.huawei.springboot)及下面所有子包里面的所有组件扫描到 Spring容器
@Import(AutoConfigurationImportSelector.class):给容器中导入组件;
AutoConfigurationImportSelector.class:决定导入哪些组件;
将所有需要导入的组件以全类名的方式返回,这些组件就会被添加到容器中;
会给容器中导入非常多的自动配置类(xxxAutoConfiguration),就是给容器中导入这个场景需要的所有组件,并配置好这些组件
有了自动配置类,免去了我们手动编写配置注入功能组件等工作。SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),getBeanClassLoader());Spring Boot在启动的时候从类路径下的"META-INF/spring.factories"中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作,以前我们需要自己配置的东西,自动配置类都帮我们配置好了。
J2EE的整体整合解决方案和自动配置都在:spring-boot-autoconfigure-2.3.0.RELEASE.jar
三、Spring Boot配置文件
Spring Boot是用一个全局的配置文件,配置文件名是固定的:application.properties、application.yml
作用:修改SpringBoot自动配置的默认值(底层帮我们自动配置好了)
3.1,@value获取值和@configurationProperties获取值比较
@configurationProperties(prefix = "person"):告诉SpringBoot将本类中所有属性和配置文件中相关的配置进行绑定(默认从全局配置文件中获取值)
3.2,@PropertySource和@ImportResource
@PropertySource:加载指定的配置文件
@ImportResource:导入Spring的配置文件(bean.xml),让配置文件里面的内容生效
SpringBoot推荐使用全注解方式,不编写配置文件(由配置类==配置文件)
四、自动配置原理
上文的HelloWorld程序中我们讲到:
@Import(AutoConfigurationImportSelector.class):给容器中导入组件;
AutoConfigurationImportSelector.class:决定导入哪些组件;
将所有需要导入的组件以全类名的方式返回,这些组件就会被添加到容器中;
会给容器中导入非常多的自动配置类(xxxAutoConfiguration),就是给容器中导入这个场景需要的所有组件,并配置好这些组件;
4.1,我们以HttpEncodingAutoConfiguration(Http编码自动配置)为例讲解自动配置原理:
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(ServerProperties.class)
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = "server.servlet.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {
private final Encoding properties;
public HttpEncodingAutoConfiguration(ServerProperties properties) {
this.properties = properties.getServlet().getEncoding();
}
@Bean
@ConditionalOnMissingBean
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
filter.setEncoding(this.properties.getCharset().name());
filter.setForceRequestEncoding(this.properties.shouldForce(Encoding.Type.REQUEST));
filter.setForceResponseEncoding(this.properties.shouldForce(Encoding.Type.RESPONSE));
return filter;
}
(1)@Configuration:表示这是一个配置类,以前编写的配置文件(bean.xml)一样,也可以给容器中添加组件
(2)@EnableConfigurationProperties:启动指定类的ConfigurationProperties功能,将配置文件中对应的值和ServerProperties绑定起来;并把ServerProperties加入到ioc容器中
(3)@ConditionalOnWebApplication:Spring底层l注解@Conditional,根据不同的条件判断,如果满足指定的条件,整个配置生效。(这里判断的是:当前应用是否为web应用,如果是,当前配置生效)
(4)@ConditionalOnClass(CharacterEncodingFilter.class):判断当前项目有没有这个类;CharacterEncodingFilter(MVC中乱码解决的过滤器)。
(5)@ConditionalOnProperty:判读配置文件中是否存在某个配置
(6)@Bean:给容器中添加一个组件,这个组件的某些值需要从properties中获取
(7)@ConditionalOnMissingBean:判断容器中有没有这个组件
注:我们可以看到HttpEncodingAutoConfiguration 类中只有一个有参构造器,参数(ServerProperties )的值会从ioc容器中拿
所有在配置文件中能配置的属性都是在xxxProperties类中封装着,配置文件能配置什么就可以参照某个功能对应的这个属性类(ServerProperties.class)
@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties {
ServerProperties.class这个类中所有的属性我们都可以在全局配置文件中(application.properties)配置:以server.X开头(server.X=)
本例总结:根据当前不同条件判断,决定这个配置类是否生效?
一旦这个配置类生效,这个配置类就会给容器中添加各种组件(本例中的filter),这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的。
4.2,SpringBoot精髓
(1)SpringBoot启动会加载大量的自动配置类
(2)我们看我们需要的功能有没有SpringBoot默认写好的自动配置类
(3)我们看这个自动配置类中到底配置了哪些组件(只要我们要用的组件有,我们就不需要再来配置了)
(4)给容器中自动配置类添加组件的时候,会从properties类中获取某些属性,我们可以在配置文件中指定这些属性的值
SpringBoot中所有功能(可参考上面4.1例子):
xxxAutoConfigurartion:自动配置类:给容器中添加组件
xxxProperties:封装配置文件中相关属性
4.3,@Conditional派生注解(Spring原生注解)
作用:必须是@Conditional指定条件成立,才给容器中添加组件,配置类里面所有内容才生效
SpringBoot启动的时候会给我们加载非常多得自动配置类(涵盖了J2EE开发所有功能),但是否生效要满足一定条件。
也就是说:自动配置类必须在一定条件下才能生效
4.4,查看哪些配置类生效
在全局配置文件(application.properties)中配置:debug=true(默认不配置为false),这样启动时控制台就会打印自动配置类哪些生效哪些不生效。