整理汇编者:文思
SpringBoot是伴随着Spring4.0诞生的。
Spring Boot主要特性:
(1)遵循“习惯优于配置”的原则,使用Spring Boot只需要很少的配置,大部分的时候我们直接使用默认的配置即可。
(2)项目快速搭建,可以无需配置的自动整合第三方的框架。
(3)可以完全不使用XML配置文件,只需要自动配置和Java Config。
(4)内嵌Servlet容器,降低了对环境的要求,可以使用命令直接执行项目,应用可用jar包执行:java -jar。
(5)提供了starter POM,能够非常方便的进行包管理,很大程度上减少了jar hell或者dependencyhell。
(6)运行中应用状态的监控。
(7)对主流开发框架的无配置集成。
(8)与云计算的天然继承。
Spring Boot核心功能:
(1)独立运行的Spring项目。
(2)内嵌的Servlet容器,内嵌容器,使得我们可以执行运行项目的主程序main函数,使项目的快速运行。
(3)提供starter简化Manen配置,Spring Boot提供了一系列的starter pom用来简化我们的Maven依赖,下边是创建一个web项目中自动包含的依赖,使用的starter pom为:spring-boot-starter-web,代替传统方式下的若干pom依赖。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
框架展开:
从字面理解,Boot是引导的意思,因此SpringBoot帮助开发者快速搭建Spring框架:
Spring Boot更多的是采用Java Config的方式,对Spring进行配置:
部署简单:
监控简单:采用了spring-boot-start-actuator之后,直接以REST的方式,获取进程的运行期性能参数
不足之处:
在实践Spring Boot时学习重点,或者说思维方式改变的重点在于:
1)对于REST的理解,这一点尤为重要,需要从设计、开发多个角色达成共识,很多时候都是对于HTTP 1.1协议以及REST的精髓不理解,导致REST被「盲用」而产生一些不好的效果。
2)对于YAML的理解和对于JavaConfig的理解,这两点相对较为简单,本质上是简化了xml文件,并提供等价的配置表述能力。
总结:
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
框架概述:
从最根本上来讲,Spring Boot就是一些库的集合,为了简化依赖图,Boot的功能是模块化的,通过导入Boot所谓的“starter”模块,可以将许多的依赖添加到工程之中,为了更容易地管理依赖版本和使用默认配置,框架提供了一个parent POM,工程可以继承它。
其中:
在Maven依赖中引入了spring-boot-starter-web,它包含了Spring Boot预定义的一些Web开发的常用依赖:
spring-web,spring-webmvcSpring WebMvc框架
tomcat-embed-*内嵌Tomcat容器
jackson处理json数据
spring-*Spring框架
spring-boot-autoconfigure:Spring Boot提供的自动配置功能
为了快速地搭建和运行Boot工程,Pivotal提供了称之为“Spring Initializr”的web界面,用于下载预先定义好的Maven或Gradle构建配置,访问http://start.spring.io/即可.我们也可以使用Lazybones模板实现快速起步(略)。
应用可以通过spring run App.groovy命令在Spring Boot CLI中运行。Boot会分析文件并根据各种“编译器自动配置(compiler auto-configuration)”标示符来确定其意图是生成Web应用。然后,它会在一个嵌入式的Tomcat中启动Spring应用上下文,并且使用默认的8080端口。打开浏览器并导航到给定的URL,随后将会加载一个页面并展现简单的文本响应:“hello”。提供默认应用上下文以及嵌入式容器的这些过程,能够让开发人员更加关注于开发应用以及业务逻辑,从而不用再关心繁琐的样板式配置。日常开发中一般使用:run as -->java application或者spring boot app
直接运行MainApplication和在BootDashboard中运行是一样的
@SpringBootApplication
@EnableAutoConfiguration
@EnableDiscoveryClient
@EnableFeignClients
@RestController
public class MainApplication {
public staticvoid main(String[] args) {
SpringApplication.run(MainApplication.class,args);
}
@RequestMapping("/")
public Stringindex(){
return "hello world!";
}
@RequestMapping("/test")
public Stringtest(){
return "test MainApplication!";
}
在Application类上的@EnableAutoConfiguration注解会告知Boot要采用一种特定的方式来对应用进行配置。这种方法会将其他样板式的配置均假设为框架默认的约定,因此能够聚焦于如何尽快地使应用准备就绪以便运行起来。Application类是可运行的,因此,当我们以Java Application的方式运行这个类时,就能启动该应用及其嵌入式的容器,这样也能实现即时地开发。
Java代码中没有任何配置,和传统的Spring应用相比,多了两个我们不认识的符号:
@EnableAutoConfiguration和@SpringApplication
它们都是由Spring Boot框架提供。在SpringApplication.run()方法执行后,Spring Boot的autoconfigure发现这是一个Web应用(根据类路径上的依赖确定),Spring Context中根据默认的约定配置了Spring WebMvc:
Servlet容器默认的Context路径是/
DispatherServlet匹配的路径(servlet-mapping中的url-patterns)是/*
@ComponentScan路径被默认设置为SampleController的同名package,也就是该package下的所有@Controller,@Service,@Component,@Repository都会被实例化后并加入Spring Context中
没有一行配置代码、也没有web.xml。基于Spring Boot的应用在大多数情况下都不需要我们去显式地声明各类配置,而是将最常用的默认配置作为约定,在不声明的情况下也能适应大多数的开发场景。
开发微服务
Boot对Spring应用的开发进行了简化,提供了模块化方式导入依赖的能力,强调了开发RESTful Web服务的功能并提供了生成可运行jar的能力,这一切都清晰地表明在开发可部署的微服务方面Boot框架是一个强大的工具。
在开发微服务应用时,需要特别注意的一点是使用了@RequestMapping注解。这不是Boot特定的注解。不过,因为Boot安装了自己的端点以监控应用的性能、健康情况以及配置,所以需要确保应用的代码不要与这些内置的提供详情的路径解析相冲突。
@RequestMapping("/configprops/test") //这是十分错误的,与http get/configprops查看配置属性路径冲突
public String testApplicationProperties(){
return applicationProper.mapperidentity;
}
可看到,采用了spring-boot-start-actuator之后,直接以REST的方式,获取进程的运行期性能参数。所以要避免在RequestMapping中路径冲突.
加入actuator依赖后,应用启动后会创建一些基于Web的Endpoint:
/autoconfig,用来查看Spring Boot的框架自动配置信息,哪些被自动配置,哪些没有,原因是什么。
/beans,显示应用上下文的Bean列表
/dump,显示线程dump信息
/health,应用健康状况检查
/metrics
/shutdown,默认没有打开
/trace
数据访问
在传统的Spring应用中,访问数据库我们需要配置:
类路径上添加数据库访问驱动
实例化DataSource对象,指定数据库url,username,password等信息
注入JdbcTemplate对象,如果使用Hibernate,Mybatis等框架,还需要进一步配置框架信息
在Spring Boot中,上述过程会被简化。首先在Maven项目依赖中定义:
spring-boot-starter-jdbc引入了spring-jdbc依赖,h2是一个内存关系型数据库。在引入了这些依赖并启动Spring Boot应用程序后,autoconfigure发现spring-jdbc位于类路径中,于是根据类路径上的JDBC驱动类型(这里是h2,预定义了derby,sqlite, mysql, oracle, sqlserver等等),创建一个DataSource连接池对象,本例中的h2是内存数据库,无需任何配置,如果是mysql, oracle等类型的数据库需要开发者配置相关信息。
在SpringContext中创建一个JdbcTemplate对象(使用DataSource初始化)接下来开发者的工作就非常简单了,在业务逻辑中直接引入JdbcTemplate即可:
除了spring-jdbc,Spring Boot还能够支持JPA,以及各种NoSQL数据库——包括MongoDB。
spring-boot-starter-data-jpa包含进来,Boot的自动配置引擎就能探测到你的工程需要数据访问功能,,并且会在Spring应用上下文中创建必要的Bean,这样你就可以使用Repository和服务了。
CrudRepository提供了一些通用的接口方法来创建、查询、更新以及删除对象和对象集合。应用所需的其他特定功能可以按照Spring Data的Repository开发约定进行定义。一旦UserRepository接口创建成功,Boot的spring-data-jpa层会在工程中探测到它,并将其添加到Spring应用上下文之中,这样对于controller和sevice对象来说,它就成为可以进行自动注入的可选对象。这种自动化的配置只有在Boot应用要求按照这种方式初始化的时候才生效,这是通过存在@EnableAutoConfiguration注解来标识的。
微服务所提供的数据并不一定全部适合关系型结构,针对这一点Spring Boot也暴露了一些模块,从而让开发人员可以使用Spring Data的MongoDB和Redis项目,不过依然采取特定的方式来进行配置。Spring Data用来定义数据访问对象(Data Access Object)的高层框架,这样快速切换JPA与非JPA数据源会变得非常容易。
public interface UserRepository extendsMongoRepository {
}
MongoRepository接口也扩展了CrudRepository,因此微服务的Controller代码,也就是程序清单1.8所示并不需要修改。为了实现与MongoDB的集成,工程唯一要做的就是在应用的classpath中包含spring-boot-starter-data-mongodb
配置
默认情况下Spring Boot加载类路径上的application.properties或application.yml文件,我们也可以很快地重写Spring Boot的默认配置。默认情况下,应用的配置可以使用Java属性文件来进行定义,这个文件名为application.properties并且位于应用的classpath根目录下。不过,一种更好的方式是使用YAML配置,它提供了结构化以及嵌套的配置。在应用的运行时类路径之中包含snakeyaml之后,你的工程就可以在application.yml文件中直接定义配置了。但我个人仍然喜欢用application.properties.
spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
微服务必须要支持的很重要的一点就是外部化配置。这种配置可以包含任何的内容. Boot一个很棒的特性在于它能管理外部化的配置并将其转换为对象结构,这个对象可以在整个应用上下文中使用。创建一个简单老式的Java/Groovy对象(Plain Old Java/Groovy Object),并使用@ConfigurationProperties注解,那么这个对象就能使用Boot配置结构中预先定义的name名下的配置项。
@PropertySource(value ="application.properties")
@Configuration
public class ApplicationProperties {
@Value("${test}")
public String test;
publicString getTest() {
returntest;
}
public void setTest(String test) {
this.test= test;
}
}
当ApplicationProperties对象在Spring上下文中创建完成之后,Boot将会识别出它是一个配置对象,并且会按照运行时classpath之中application.properties或application.yml文件中的配置指令填充它的属性。因此,如果我们在微服务的application.yml文件中添加application内容区的话,如程序清单1.16所示,那么我们就可以在应用的其他部分以编程的方式访问这些配置指令
public class MainApplication {
@Autowired
private ApplicationPropertiesapplicationProper;
publicstatic void main(String[] args) {
SpringApplication.run(MainApplication.class,args);
}
@RequestMapping("/testApplicationProperties")
publicString testApplicationProperties(){
return applicationProper.test;
}
}
配置类也支持嵌套式的对象图,这样来自于配置中的深层数据就能更便利地进行访问,也有了更好的语义。例如,如果我们想要得到的配置指令是application.根下的那些metrics key,那么可以在ApplicationPropertiesPOGO中添加一个嵌套对象来表示。注解必须先使用@Configuration,将此类声明为配置类型。且必须有set,get方法,遵循传统pojo属性查找模式
安全
在微服务的开发中,对于完备安全场景的需求会持续增长。为了满足这种需求,Boot引入了强大完整的Spring Security,并且提供了自动配置的功能,以快速简便地启用安全层。只需在应用的classpath中包含spring-boot-starter-security模块就能使Boot引入一些安全特性,如跨站脚本防护(cross-site scripting
protection)并且会添加头信息以防止点击劫持(click-jacking)。除此之外,添加一条简单的配置指令就能启用基本认证来保护你的应用
使用略
消息集成
Boot并没有提供明确的Spring上下文自动化配置,但是它为Spring Integration提供了一个starter模块,它会负责引入Spring Integration项目的一系列依赖。这些依赖包括Spring
Integration的核心库(Core library)、HTTP模块(用来进行面向HTTP的企业集成)、IP模块(用来进行基于Socket的集成操作)、File模块(用于进行文件系统集成)以及Stream模块(用于支持使用Stream的操作,如stdin和stdout)。这个starter模块为开发人员提供了健壮的消息功能的工具集,可以使已有的基础设施适应微服务APIs
使用略
提供度量指标
使用略
@EnableAutoCongiguration
从Spring 3.0开始,为了替代繁琐的XML配置,引入了@Enable...注解对@Configuration类进行修饰以达到和XML配置相同的效果。想必不少开发者已经使用过类似注解:
@EnableTransactionManagement开启Spring事务管理,相当于XMl中的
@EnableWebMvc使用Spring MVC框架的一些默认配置
@EnableScheduling会初始化一个Scheduler用于执行定时任务和异步任务
Spring Boot提供的@EnableAutoCongiguration似乎功能更加强大,一旦加上,上述所有的配置似乎都被包含进来而无需开发者显式声明。
它究竟是如何做到的呢,先看看它的定义:
为了添加生产环境特性支持,需要在Maven依赖中引入:
加入actuator依赖后,应用启动后会创建一些基于Web的Endpoint:
/autoconfig,用来查看Spring Boot的框架自动配置信息,哪些被自动配置,哪些没有,原因是什么。
/beans,显示应用上下文的Bean列表
/dump,显示线程dump信息
/health,应用健康状况检查
/metrics
/shutdown,默认没有打开
/trace
下一节将进入Spring Boot正式学习讲解阶段.如果您觉得这篇文章对您有帮助,就请赞赏支持。