SpringBoot系列(一)
SpringBoot简述
一. 什么是SpringBoot?
springboot是一个基于spring所有功能的工具框架,能够让一个spring框架的开发过程简化再简化,能应对非常多的开发场景,实现自动配置。例如最长涉及的web应用,springboot帮住完成了web容器的配置,springmvc,spring的配置
二. Springboot的特点
-
独立运行spring容器
spring容器的运行一般都需要别的容器的支持,比如开发一个web应用,要由第三方web容器支持。而springboot可以独立运行,在main方法中直接加载springboot 运行代码。
-
内嵌servlet
springboot为web工程提供了内嵌的web容器,默认使用tomcat,可以修改成jetty和undertow,并且按照习惯进行默认配置,例如端口号8080 项目访问路径 /.结合第一个特点,web工程就可以不用封装war包访问外部的web容器运行,直接使用jar包运行。
-
简化依赖
springboot能够实现它的独有的特点,是因为它在spring基础之上扩展了非常庞大的代码.导致要想使用springboot必须依赖大量的资源.这样极其不方便的。所以springboot为开发者准备了丰富环境的简化依赖。例如:我们要开发一个web应用(spring-context,spring-webmvc,jackson,loggings等等),在springboot只要想开发一个web应用,只需要依赖一个spring-boot-starter-web,实现依赖的传递。
-
自动配置
springboot最核心的特点,就是自动配置。它为大多数开发场景准备对应的配置逻辑.在使用springboot开发时,可以不考虑如何配置这些技术,环境,只需要按照springboot提供的逻辑准备你的技术,环境。
例如:自动完成web容器的配置。简化了端口,程序访问根目录,静态资源访问前后缀拼接等等配置内容。自动完成了datasource数据源配置,你一旦需要持久层数据源连接数据库,只需要提供对应属性就可以了。
三. SpringBoot核心注解
springboot工程中总是在添加一个核心注解@SpringBootApplication,它是一个springboot框架提供的组合注解,一共组合了3个注解:
-
SpringBootConfiguration
本质上,这个注解就是一个spring的配置注解@Configuration。继承自
@Configuration
(一个配置注解所在的类,相当于与一个xml配置文件的功能) -
ComponentScan
相当于一个xml配置文件中的<context:component-scan>标签,默认将当前类所在的包作为basePackage使用。
上述两个注解同时存在,相当于使用了一个xml配置文件。
<beans> <context:component-scan basePackage="org.example"/> </beans>
两个注解一组合,能让我们在代码中自定义的各种 @Component @Controller @Service注解所在类生成在IOC容器。
-
EnableAutoConfiguration
每一个版本的springboot都会扩展非常庞大的**AutoConfiguration的配置类,每一个类都相当于是一个xml.@EnableAutoConfiguration的作用就是导入这些配置类,使得在加载一个springboot启动类时,不仅具备扫描自定义业务层注解的功能,还具备加载springboot自动配置逻辑。
springboot当前版本都准备了哪些自动配置类,可以从一个spring.factories的文件中观察到。在spring-boot-autoconfigure的jar包中,找到META-INF文件夹,从中观察打开spring.factories。
四. 其他注解
Ⅰ. Conditional的组合注解
- @ConditionalOnBean:当容器里有指定Bean的条件下
- @ConditionalOnClass:当类路径下有指定的类的条件下
- @ConditionalOnExpression:基于SpEL表达式为true的时候作为判断条件才去实例化
- @ConditionalOnJava:基于JVM版本作为判断条件
- @ConditionalOnJndi:在JNDI存在的条件下查找指定的位置
- @ConditionalOnMissingBean:当容器里没有指定Bean的情况下
- @ConditionalOnMissingClass:当容器里没有指定类的情况下
- @ConditionalOnWebApplication:当前项目是Web项目的条件下
- @ConditionalOnNotWebApplication:当前项目不是Web项目的条件下
- @ConditionalOnProperty:指定的属性是否有指定的值
- @ConditionalOnResource:类路径是否有指定的值
- @ConditionalOnOnSingleCandidate:当指定Bean在容器中只有一个,或者有多个但是指定首选的Bean
这些注解都组合了@Conditional
注解,只是使用了不同的条件组合最后为true时才会去实例化需要实例化的类,否则忽略过滤掉。
Ⅱ. @ConfigurationProperties
从配置文件中绑定属性到对应的bean上,与Value既有联系又有区别
- 自定义前缀(即,匹配掉前缀后的名称才对应Bean属性)
- 可以多级赋值
- 如果接受的是List类型,可以自动截取逗号
五. 启动原理(自动配置)
Spring Boot启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,而这些自动配置类都是以AutoConfiguration结尾来命名的,它实际上就是一个JavaConfig形式的Spring容器配置类,它能通过以Properties结尾命名的类中取得在全局配置文件中配置的属性如:server.port,而XxxxProperties类是通过@ConfigurationProperties 注解与全局配置文件中对应的属性进行绑定的。