1、微服务
一篇非常著名的微服务论文:https://martinfowler.com/articles/microservices.html
其核心思想是将一个单体应用根据业务功能拆分为多个服务,使业务代码之间不在耦合。
微服务优势:
- 服务解耦
- 技术选型广泛
- 单一职责
- 独立部署
- 敏捷开发
- 故障隔离
微服务劣势:
- 部署需要花费更多精力
- 服务接口问题
- 高可用
- 分布式事务
- 网络复杂性
- 测试的复杂性
2、SpringBoot
2.1、什么是SpringBoot
SpringBoot伴随Spring4而生,它在继承Spring的优点上,简化了基于Spring的开发。SpringBoot并不提供Spring框架的扩展功能,只是用于快速开发Spring的应用程序。
2.2、SpringBoot优点
SpringBoot在Java应用开发领域快速兴起,其原因可归纳为以下几点:
- 约定大于配置
- 采用简洁的配置方式来替代Xml
- 自动配置Spring
- “开箱即用”的Starter,没有代码生成
- 对主流框架无配置集成
因此SpringBoot更加快速、透明、高效。
2.3、SpringBoot自动配置
spring2004年发布了第一个版本,致力于做一个轻量级的控制反转(IoC)和面向切面(AOP)的的容器框架,给软件行业带来“春天”。但是随着时间的流逝,Spring越来越庞大,对于使用xml配置的Spring来说可不是个好消息。有句话说的好,只有用过Spring才知道SpringBoot的好,Spring荣获新外号“配置地狱”,成功做到“配置俩小时,Coding五分钟”。SpringBoot出生名门,比Spring更加优秀,支持自动装配,是软件开发发展的大势所趋。
程序启动入口类代码示例:
1 |
|
分析代码可得,@SpringBootApplication注解与SpringApplication的run方法占重要位置。
分析@SpringBootApplication注解,它和@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan等价。
![SpringBootApplication](/2021/08/07/SpringBoot/SpringBootApplication.png)
@SpringBootConfiguration
1 |
|
@ComponentScan,这个就是扫描注解的意思,默认扫描当前类所在的包及其子包下包含的注解,将@Controller、@Service、@Component、@Repository等注解加载到IOC容器中;
@EnableAutoConfiguration,实现自动装配,它与@AutoConfigurationPackage、@Import等价。
@EnableAutoConfiguration源码如下所示:
1 |
|
@AutoConfigurationPackage和@ComponentScan一样,也是将主配置类所在的包及其子包里面的组件扫描到IOC容器中,但是区别是@AutoConfigurationPackage扫描@Enitity、@MapperScan等第三方依赖的注解,@ComponentScan只扫描@Controller、@Service、@Component、@Repository这些常见注解。所以这两个注解扫描的对象是不一样的。
@Import(AutoConfigurationImportSelector.class)是自动装配的核心注解,AutoConfigurationImportSelector.class中有个getCandidateConfigurations方法,断言META-INF/spring.factories文件,看来这个类需要导入该文件,因此META-INF/spring.factories应该是自动配置核心文件。
1 | protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) { |
SpringApplication是SpringBoot启动的完整解决方案。
SpringBoot的自动装配是非入侵式的。在任何时候我们都可以开始自定义配置,以替换自动配置的特定部分。
在我们使用ssm框架时,配置需要我们自己一个一个去实现,因此需要配置的很全,也十分的冗杂。SpringBoot默认帮我们配置好了,我们只需要修改与默认配置不同的地方就可以实现自定义配置,比之前的配置简洁了许多,可以说SpringBoot将我们从配置地狱解救出来了。
3、starter
所有官方的starter都遵循类似的命名方式。spring-boot-starter-*
,其中*
是特定类型的应用程序。例:
1 | <dependency> |
官方定义的启动器:
Spring Boot应用程序启动器
名称 | 描述 |
---|---|
spring-boot-starter |
核心启动工具,包括自动配置支持,日志记录和YAML |
spring-boot-starter-activemq |
使用Apache ActiveMQ的JMS消息传递启动 |
spring-boot-starter-amqp |
使用Spring AMQP和Rabbit MQ的启动 |
spring-boot-starter-aop |
使用Spring AOP和AspectJ进行面向方面编程的启动 |
spring-boot-starter-artemis |
使用Apache Artemis的JMS消息传递启动 |
spring-boot-starter-batch |
使用Spring Batch的启动 |
spring-boot-starter-cache |
使用Spring Framework的缓存支持的启动器 |
spring-boot-starter-data-cassandra |
使用Cassandra分布式数据库和Spring Data Cassandra的启动 |
spring-boot-starter-data-cassandra-reactive |
使用Cassandra分布式数据库和Spring Data Cassandra Reactive的启动 |
spring-boot-starter-data-couchbase |
使用Couchbase面向文档的数据库和Spring Data Couchbase的启动 |
spring-boot-starter-data-couchbase-reactive |
使用Couchbase面向文档的数据库和Spring Data Couchbase Reactive的启动 |
spring-boot-starter-data-elasticsearch |
使用Elasticsearch搜索和分析引擎以及Spring Data Elasticsearch的启动器 |
spring-boot-starter-data-jdbc |
使用Spring Data JDBC的启动 |
spring-boot-starter-data-jpa |
将Spring Data JPA与Hibernate结合使用的启动 |
spring-boot-starter-data-ldap |
使用Spring Data LDAP的启动 |
spring-boot-starter-data-mongodb |
使用MongoDB面向文档的数据库和Spring Data MongoDB的启动 |
spring-boot-starter-data-mongodb-reactive |
使用MongoDB面向文档的数据库和Spring Data MongoDB Reactive的启动 |
spring-boot-starter-data-neo4j |
使用Neo4j图形数据库和Spring Data Neo4j的启动工具 |
spring-boot-starter-data-r2dbc |
使用Spring Data R2DBC的启动 |
spring-boot-starter-data-redis |
使用Redis键值数据存储与Spring Data Redis和Lettuce客户端的启动 |
spring-boot-starter-data-redis-reactive |
将Redis键值数据存储与Spring Data Redis Reacting和Lettuce客户端一起使用的启动 |
spring-boot-starter-data-rest |
使用Spring Data REST在REST上公开Spring数据存储库的启动 |
spring-boot-starter-data-solr |
将Apache Solr搜索平台与Spring Data Solr结合使用的启动器。从2.3.9版开始不推荐使用 |
spring-boot-starter-freemarker |
使用FreeMarker视图构建MVC Web应用程序的启动 |
spring-boot-starter-groovy-templates |
使用Groovy模板视图构建MVC Web应用程序的启动 |
spring-boot-starter-hateoas |
使用Spring MVC和Spring HATEOAS构建基于超媒体的RESTful Web应用程序的启动器 |
spring-boot-starter-integration |
使用Spring Integration的启动 |
spring-boot-starter-jdbc |
结合使用JDBC和HikariCP连接池的启动 |
spring-boot-starter-jersey |
使用JAX-RS和Jersey构建RESTful Web应用程序的启动。的替代品spring-boot-starter-web |
spring-boot-starter-jooq |
使用jOOQ访问SQL数据库的启动。替代spring-boot-starter-data-jpa 或spring-boot-starter-jdbc |
spring-boot-starter-json |
读写JSON启动器 |
spring-boot-starter-jta-atomikos |
使用Atomikos的JTA交易启动 |
spring-boot-starter-jta-bitronix |
使用Bitronix的JTA交易启动。从2.3.0版本开始不推荐使用 |
spring-boot-starter-mail |
使用Java Mail和Spring Framework的电子邮件发送支持的启动 |
spring-boot-starter-mustache |
使用Mustache视图构建Web应用程序的启动 |
spring-boot-starter-oauth2-client |
使用Spring Security的OAuth2 / OpenID Connect客户端功能的启动 |
spring-boot-starter-oauth2-resource-server |
使用Spring Security的OAuth2资源服务器功能的启动 |
spring-boot-starter-quartz |
启动使用Quartz Scheduler |
spring-boot-starter-rsocket |
用于构建RSocket客户端和服务器的启动 |
spring-boot-starter-security |
使用Spring Security的启动 |
spring-boot-starter-test |
用于使用包括JUnit Jupiter,Hamcrest和Mockito在内的库测试Spring Boot应用程序的启动程序 |
spring-boot-starter-thymeleaf |
使用Thymeleaf视图构建MVC Web应用程序的启动 |
spring-boot-starter-validation |
初学者,可将Java Bean验证与Hibernate Validator结合使用 |
spring-boot-starter-web |
使用Spring MVC构建Web(包括RESTful)应用程序的启动程序。使用Tomcat作为默认的嵌入式容器 |
spring-boot-starter-web-services |
使用Spring Web Services的启动 |
spring-boot-starter-webflux |
使用Spring Framework的Reactive Web支持构建WebFlux应用程序的启动器 |
spring-boot-starter-websocket |
使用Spring Framework的WebSocket支持构建WebSocket应用程序的启动 |
4、配置文件
SpringBoot使用全局配置文件,它的名称是固定的application.[properties|yaml|yml]
4.1、propertis与yaml
注意:propertis中配置中文可能会乱码,因为java会默认使用ISO-8859-1的编码方式读取*.properties配置文件
在SpringBoot中有俩种传统的java配置文件propertis,以及yaml文件。
YAML是”YAML Ain’t a Markup Language”(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:”Yet Another Markup Language”(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。——百度百科
propertis文件后缀为’.propertis’,yaml文件后缀为’.yaml’或’.yml’。
使用yaml
YAML是JSON的超集,因此是一种用于指定层次结构配置数据的便捷格式。只要你classpath库有属性SnakeYAML,该SpringApplication
级自动支持YAML来替代。
注:只需要导入spring-boot-starter,SnakeYAML就会被提供。
4.2、语法
propertis:key=value,propertis只能保存键值对。
yaml:
- 键值对
1 | name: jiuzhao |
对象
- 常见写法
1
2
3student:
name: jiuzhao
age: 21- 行内写法
1
student: {name: jiuzhao,age: 17}
数组
- 常见写法
1
2
3fruit:
- apple
- banana- 行内写法
1
fruit: [apple,banana]
取值
${}
propertis与yaml的注释都是使用#
字符。
yaml可以注入到我们的配置类中。
4.3、配置文件位置
查看ConfigFileApplicationListener类
1 | public class ConfigFileApplicationListener implements EnvironmentPostProcessor, SmartApplicationListener, Ordered { |
可得配置文件可放在:
- classpath:/
- classpath:/config/
- file:./
- file:./config/*/
- file:./config/
配置文件优先级从上往下递增。
4.4、多环境配置
通常,一个项目会有几套不同的环境配置。例:开发环境、测试环境、运行环境。为了不需要每次都修改配置文件,SpringBoot对多环境配置提供了支持。
配置环境文件名application-{name}.properties的格式
1 | spring: |
4.5、配置原理
我们知道,在SpringBoot自动配置时会加载META-INF/spring.factories这个核心配置文件,如下位置:
![SpringBootAutoConfigurePack](/2021/08/07/SpringBoot/SpringBootAutoConfigurePack.png)
spring.factories中有许多全限定类名(截取部分),命名格式为XXXAutoConfiguration的类,这些类都是进行自动配置的类:
![SpringBootAutoConfigurePackFile](/2021/08/07/SpringBoot/SpringBootAutoConfigurePackFile.png)
XXXAutoConfiguration类会在初始化时获取一个XXXProperties类为默认设置类。我们使用HttpEncodingAutoConfiguration类进行讨论。
HttpEncodingAutoConfiguration是一个自动配置类,按照XXXAutoConfiguration的命名格式。它在初始化时需要传递一个ServerProperties类进行初始化。
1 |
|
我们可以看到@EnableConfigurationProperties(ServerProperties.class)这个注解,这个注解将ServerProperties.class进行传参。
@EnableConfigurationProperties注解的作用是:使使用 @ConfigurationProperties 注解的类生效。
再让我们看看ServerProperties类:
1 |
|
ServerProperties类中有许多的属性,这些属性都被映射到了配置文件上,我们可以去配置文件上对其进行设置,也可以不设置,从而使用默认设置。例,如上所示ServerProperties有属性port,该属性控制web容器端口号。
@ConfigurationProperties这个注解声明这个类是个配置属性类,prefix 前置属性。
注:如果一个配置类只配置@ConfigurationProperties注解,而没有使用@Component,那么在IOC容器中是获取不到properties 配置文件转化的bean。@EnableConfigurationProperties 是把指定类的属性又注入了一次。
总结:SpringBoot的自动配置依赖于XXXAutoConfiguration自动配置类,每个自动配置类需要XXXProperties默认配置类进行初始化,在配置文件application.[properties|yaml|yml]中,我们可以覆盖掉默认配置,至此SpringBoot就可以根据自动配置类进行配置了。
5、SpringBoot注解
@Value
在类中,如果需要读取配置文件中的内容,那么只需要在属性上使用@Value(“${属性名}”)即可。
@Validated
数据校验 JSR303校验
@ConfigurationProperties
6、web开发
1、扩展MVC配置
如果要保留这些Spring Boot MVC的默认配置并进行更多的MVC定制(拦截器,格式化程序,视图控制器和其他功能),则可以添加自己@Configuration
的注解类,实现WebMvcConfigurer
接口但不添加 @EnableWebMvc
。
@EnableWebMvc注解会导入DelegatingWebMvcConfiguration类,DelegatingWebMvcConfiguration类从容器中获取所有的WebMvcConfigurer,但是DelegatingWebMvcConfiguration类是一个WebMvcConfigurationSupport类,而WebMvcAutoConfiguration有个导入自动配置的条件注解
1 |
会失败,因此所有默认配置失效,从而导致mvc出现问题。
WebMvcConfigurer使用了java的特性——接口可以写默认方法。
1 | public interface WebMvcConfigurer { |
1 |
|
总结:在SpringBoot中,扩展了非常多的XXXConfiguration帮助我们扩展配置,这些配置可能改变了原有的SpringBoot配置。
2、页面模板
模板引擎框架是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档。
在SpringBoot中,支持
- FreeMarker
- Groovy
- Thymeleaf(官网推荐)
- Mustache
参考文献
尽管这不是一个详尽的清单,但还是希望对大家有所启示。
[1]James Lewis,Martin Fowler.Microservices[D]:[2014-3-25]
[2]Phillip WebbDave SyerJosh LongStéphane NicollRob WinchAndy WilkinsonMarcel OverdijkChristian DupuisSébastien DeleuzeMichael SimonsVedran PavićJay BryantMadhura BhaveEddú MeléndezScott Frederick.SpringBoot官方文档[EB/OL]:[2021-4-15]
[]杨洋.Spring Boot 2 实战之旅.北京[M]:清华大学出版社[2019]
[2]程序员铁蛋.SpringBoot自动装配原理[EB/OL]:[2020-07-21]
[3]吴胜.SpringBoot开发实战:微课视频版.北京[M]:清华大学出版社[2019]
[4]陈恒主编.SpringBoot从入门到实战:微课视频版.北京[M]:清华大学出版社[2020.5]
[5](英国)马特·戴尼姆著,张楚雄、张琦译.Spring Boot2攻略-北京[M]:清华大学出版社[2019]