spring boot 和jfinal和spring的区别

博客分类:
原本这个章节是要介绍《log4j多环境不同日志级别的控制的》但是没有这篇文章做基础的话,学习起来还是有点难度的,所以我们先一起了解下spring boot属性文件之多环境配置,当然文章中也会提到属性文件基本的一些知识,然后慢慢在升华到多环境配置。
相信很多人选择Spring Boot主要是考虑到它既能兼顾Spring的强大功能,还能实现快速开发的便捷。我们在Spring Boot使用过程中,最直观的感受就是没有了原来自己整合Spring应用时繁多的XML配置内容,替代它的是在pom.xml中引入模块化的Starter POMs,其中各个模块都有自己的默认配置,所以如果不是特殊应用场景,就只需要在application.properties中完成一些属性配置就能开启各模块的应用。
在之前的各篇文章中都有提及关于application.properties的使用,主要用来配置数据库连接、日志相关配置等。除了这些配置内容之外,本文将具体介绍一些在application.properties配置中的其他特性和使用方法。
自定义属性与加载
这方面的知识我们在之前一篇文章
中就已经有介绍过了,这里也当做温故下吧,当然重点还是之后的多环境配置文件。
我们在使用Spring Boot的时候,通常也需要定义一些自己使用的属性,我们可以如下方式直接定义:
在src/main/resources/application.properties:加入:
#自定义属性.
=Spring Boot教程
然后通过@Value("${属性名}")注解来加载对应的配置属性,具体如下:
(以下这种方式已经过时了,不推荐使用,但能正常运行的)。
@Component
public class BlogProperties {
@Value("${com.kfit.blog.name}")
private String name;//博客作者
@Value("${com.kfit.blog.title}")
private String title;//博客标题
// 省略getter和setter
通过单元测试来验证BlogProperties中的属性是否已经根据配置文件加载了。
引入单元测试依赖:
&!-- spring boot 单元测试. --&
&dependency&
&groupId&org.springframework.boot&/groupId&
&artifactId&spring-boot-starter-test&/artifactId&
&scope&test&/scope&
&/dependency&
进行编码进行单元测试:
package com.
import org.junit.A
import org.junit.T
import org.junit.runner.RunW
import org.springframework.beans.factory.annotation.A
import org.springframework.boot.test.SpringApplicationC
import org.springframework.test.context.junit4.SpringJUnit4ClassR
import com.kfit.properties.BlogP
* @author Angel(QQ:)
* @version v.0.1
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(App.class)
public class AppTest{
@Autowired
private BlogProperties blogProperties;
public void testBlog() throws Exception {
System.out.println("AppTest.testBlog()="+blogProperties);
Assert.assertEquals("Angel",blogProperties.getName());
Assert.assertEquals("Spring Boot教程", blogProperties.getTitle());
运行单元测试,完美的看到我们想要的结果了,但是我们刚刚提到了BlogProperties写法已经不推荐使用了,那么怎么写会比较perfect呢?看如下优雅的编码风格:
先引入spring boot提供的一个配置依赖:
&!--spring boot 配置处理器 --&
&dependency&
&groupId&org.springframework.boot&/groupId&
&artifactId&spring-boot-configuration-processor&/artifactId&
&optional&true&/optional&
&/dependency&
在这里我们主要使用@ConfigurationProperties注解进行编码,
修改BlogProperties为:
* prefix="com.kfit.blog" :
* 在application.properties配置的属性前缀,
* 在类中的属性就不用使用{@value}进行注入了。
* @author Angel(QQ:)
* @version v.0.1
@ConfigurationProperties(prefix="com.kfit.blog")
public class BlogProperties {
private String name;//博客作者
private String title;//博客标题
// 省略getter和setter
在启动类中加入:@EnableConfigurationProperties({BlogProperties.class})
在运行单元测试还是能够正常进行的。
这种的好处就是只需要配置一个地方,其它地方就是正常定义类的属性即可了。
参数间的引用
在application.properties中的各个参数之间也可以直接引用来使用,就像下面的设置:
=${com.kfit.blog.name}正在写《${com.kfit.blog.title}》
com.kfit.blog.desc参数引用了上文中定义的name和title属性,最后该属性的值就是Angel正在努力写《Spring Boot教程》。
使用随机数
在一些情况下,有些参数我们需要希望它不是一个固定的值,比如密钥、服务端口等。Spring Boot的属性配置文件中可以通过${random}来产生int值、long值或者string字符串,来支持属性的随机值。
# 随机字符串
=${random.value}
=${random.int}
# 随机long
=${random.long}
# 10以内的随机数
=${random.int(10)}
# 10-20的随机数
=${random.int[10,20]}
通过命令行设置属性值
相信使用过一段时间Spring Boot的用户,一定知道这条命令:java -jar xxx.jar --server.port=8888,通过使用--server.port属性来设置xxx.jar应用的端口为8888。
在命令行运行时,连续的两个减号--就是对application.properties中的属性值进行赋值的标识。所以,java -jar xxx.jar --server.port=8888命令,等价于我们在application.properties中添加属性server.port=8888,该设置在样例工程中可见,读者可通过删除该值或使用命令行来设置该值来验证。
通过命令行来修改属性值固然提供了不错的便利性,但是通过命令行就能更改应用运行的参数,那岂不是很不安全?是的,所以Spring Boot也贴心的提供了屏蔽命令行访问属性的设置,只需要这句设置就能屏蔽:SpringApplication.setAddCommandLineProperties(false)。
在Eclipse中具体操作如下:
【右键工程】--【Run As】 -- 【Run configurations】--找到【Arguments】--【Program arguments】-- 添加【--server.port=8888】
多环境配置
以上都不是重点,这才是重点,这才是重点,这才是重点,重要的事情说3遍。我们在开发Spring Boot应用时,通常同一套程序会被应用和安装到几个不同的环境,比如:开发、测试、生产等。其中每个环境的数据库地址、服务器端口等等配置都会不同,如果在为不同环境打包时都要频繁修改配置文件的话,那必将是个非常繁琐且容易发生错误的事。
对于多环境的配置,各种项目构建工具或是框架的基本思路是一致的,通过配置多份不同环境的配置文件,再通过打包命令指定需要打包的内容之后进行区分打包,Spring Boot也不例外,或者说更加简单。
在Spring Boot中多环境配置文件名需要满足application-{profile}.properties的格式,其中{profile}对应你的环境标识,比如:
application-dev.properties:开发环境
application-test.properties:测试环境
application-prod.properties:生产环境
至于哪个具体的配置文件会被加载,需要在application.properties文件中通过spring.profiles.active属性来设置,其值对应{profile}值。
如:spring.profiles.active=test就会加载application-test.properties配置文件内容
下面,以不同环境配置不同的服务端口为例,进行样例实验。
针对各环境新建不同的配置文件application-dev.properties、application-test.properties、application-prod.properties
在这三个文件均都设置不同的server.port属性,如:dev环境设置为8080,test环境设置为9090,prod环境设置为80
application.properties中设置spring.profiles.active=dev,就是说默认以dev环境设置
测试不同配置的加载:
执行java -jar xxx.jar,可以观察到服务端口被设置为8080,也就是默认的开发环境(dev)
执行java -jar xxx.jar --spring.profiles.active=test,可以观察到服务端口被设置为9090,也就是测试环境的配置(test)
执行java -jar xxx.jar --spring.profiles.active=prod,可以观察到服务端口被设置为80,也就是生产环境的配置(prod)
按照上面的实验,可以如下总结多环境的配置思路:
application.properties中配置通用内容,并设置spring.profiles.active=dev,以开发环境为默认配置
application-{profile}.properties中配置各个环境不同的内容
通过命令行方式去激活不同环境的配置。
多环境高级应用
在某些情况下,应用的某些业务逻辑可能需要有不同的实现。例如邮件服务,假设EmailService中包含的send(String email)方法向指定地址发送电子邮件,但是我们仅仅希望在生产环境中才执行真正发送邮件的代码,而开发环境里则不发送以免向用户发送无意义的垃圾邮件。
我们可以借助Spring的注解@Profile实现这样的功能,这样需要定义两个实现EmailService借口的类:
* 发送邮件接口.
* @author Angel(QQ:)
* @version v.0.1
public interface EmailService {
/**发送邮件*/
publicvoid send();
发送邮件的具体实现(dev-开发环境的代码):
@Profile("dev") //开发环境的时候.
public class DevEmailServiceImpl implements EmailService{
publicvoid send() {
System.out.println("DevEmailServiceImpl.send().开发环境不执行邮件的发送.");
发送邮件的具体实现(prod-生产环境的代码):
@Profile("prod") //生产环境.
public class ProdEmailServiceImpl2 implements EmailService{
publicvoid send() {
System.out.println("DevEmailServiceImpl.send().生产环境执行邮件的发送.");
//具体的邮件发送代码.
//mail.send();
@Profile("dev")表明只有Spring定义的Profile为dev时才会实例化DevEmailService这个类。那么如何设置Profile呢?
在配置文件中指定
在application.properties中加入:
spring.profiles.active=dev
通过命令行参数
java -jar app.jar --spring.profiles.active=dev
【Spring Boot 系列博客】
视频&交流平台:
/course/introduction.htm?courseId=
http://-qq-/blog/2321532
网易云课堂视频最新更新:
第十一章 Spring Boot 日志
1、spring boot日志—理论
2、Spring Boot日志-logback
3、Spring Boot日志-log4j2
第十二章 Spring Boot 知识点2
1、spring boot 服务配置和部署
2、Spring Boot 定制URL匹配规则
历史章节:
第一章 快速开始
1、Spring Boot之Hello World
2、Spring Boot之Hello World访问404
第二章 Spring Boot之JSON
1、spring boot返回json数据
2、Spring Boot完美使用FastJson解析JSON数据
第三章 Spring Boot热部署
1、Spring Boot热部署(springloader)
2、springboot + devtools(热部署)
第四章 Spring Boot数据库
1、Spring Boot JPA/Hibernate/Spring Data概念
2、Spring Boot JPA-Hibernate
3、Spring Boot Spring Data JPA介绍
4、Spring Boot JdbcTemplate
5、Spring Boot集成MyBatis
第五章 web开发
1、全局异常捕捉
2、配置server信息
3、spring boot使用thymeleaf
4、Spring Boot 使用freemarker
5、Spring Boot添加JSP支持
第六章 定时任务
1、Spring Boot定时任务
2、Spring Boot 定时任务升级篇(动态修改cron参数)
3、Spring Boot 定时任务升级篇(动态添加修改删除定时任务)
4、Spring Boot 定时任务升级篇(集群/分布式下的定时任务说明)
5、Spring Boot Quartz介绍
6、Spring Boot Quartz在Java Project中使用
7、Spring Boot 集成Quartz普通使用
8、Spring Boot 集成Quartz升级版
9、Spring Boot 集成Quartz二次升级版
10、Spring Boot 集成Quartz-Job如何自动注入Spring容器托管的对象
第七章 Spring Boot MyBatis升级篇
1、Spring Boot MyBatis升级篇-注解
2、Spring Boot MyBatis升级篇-注解-自增ID
3、Spring Boot MyBatis升级篇-注解-增删改查
4、Spring Boot MyBatis升级篇-注解-分页查询
5、Spring Boot MyBatis升级篇-注解-分页PageHelper不生效
6、Spring Boot MyBatis升级篇-注解- mybatic insert异常:BindingException: Parameter 'name' not found
7、Spring Boot MyBatis升级篇-注解- #和$符号特别篇
8、Spring Boot MyBatis升级篇-注解-@Result
9、Spring Boot MyBatis升级篇-注解-动态SQL(if test)-方案一:&script&
10、Spring Boot MyBatis升级篇-注解-动态SQL(if test)-方案二:@Provider
11、Spring Boot MyBatis升级篇-注解-动态SQL-参数问题
12、Spring Boot MyBatis升级篇-注解-特别篇:@MapperScan和@Mapper
13、Spring Boot MyBatis升级篇-XML
14、Spring Boot MyBatis升级篇-XML-自增ID
15、Spring Boot MyBatis升级篇-XML-增删改查
16、Spring Boot MyBatis升级篇-XML-分页查询
17、Spring Boot MyBatis升级篇-XML-分页PageHelper不生效
18、Spring Boot MyBatis升级篇-XML-动态SQL(if test)
19、Spring Boot MyBatis升级篇-XML-注解-初尝试
20、Spring Boot MyBatis升级篇- pagehelper替换为pagehelper-spring-boot-starter
第八章 Spring Boot 知识点1
1、Spring Boot 拦截器HandlerInterceptor
2、Spring Boot启动加载数据CommandLineRunner
3、Spring Boot环境变量读取和属性对象的绑定
4、Spring Boot使用自定义的properties
5、Spring Boot使用自定义的properties
6、Spring Boot使用@SpringBootApplication
7、Spring Boot 监控和管理生产环境
第十章 Spring Boot 打包部署
1、Spring Boot打包部署((提供Linux的sh文件))
第十一章 Spring Boot 日志
1、spring boot日志—理论
2、Spring Boot日志-logback
3、Spring Boot日志-log4j2
更多查看博客:
浏览 24949
论坛回复 /
(0 / 3383)
楼主,我查询了一下官方文档,@Profile只能用在Component和Configuration上,service注解上使用并不行,我自己的代码试过好像并不可以我这里很确认的告诉你,使用@Service注解是没有任何问题的,在看到你提出的疑问之后,我也写代码进行测试了,确实能够按照我们想要的进行运行。您在看看您的代码是否正常。
浏览: 1305661 次
u 写道在使用热部署devtools的时候, ...
zpl11111 写道xiangcunchouren 写道一般 ...
youzizhu1126 写道感谢博主分享,我才能照着学,真心 ...
感谢博主分享,我才能照着学,真心感谢,
xiangcunchouren 写道一般登录登录表单提交的时候 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'Spring Boot 和 Grails 的不同点
最近花了些时间了解了一下 Spring Boot 这个新框架。这个框架提供了快速开发基于 Spring Framework 的应用的功能。同样,SpringSource 旗下还有另一个用于 Web 应用快速开发的框架,就是 Grails。初看来这两个框架有很多相似的地方,所以可以将这两个框架做一下对比。
Spring Boot 强调自运行;Grails 应用则需要打包成 WAR 来运行
当然 Grails 应用也能通过内嵌的 Tomcat 或 Jetty 容器来运行,但这主要用于开发环境。在用于生产环境时,Grails 应用仍需要打包成 WAR 包。而 Spring Boot 的应用则主要是打包成可自运行的 JAR 包。
Spring Boot 侧重开发 RESTful Web Service;Grails 则提供了全面的 Web 应用支持,包括页面标签、Web 视图等等
Spring Boot 使用 Maven 和 Gradle 作为构建工具;Grails 使用自有的构建工具
Maven 和 Gradle 显然是两个最为广泛使用的构建工具。从构建工具的角度看,Spring Boot 更有通用性。而如果要用 Maven 去构建 Grails 应用倒也不难,但是需要一些并不复杂的额外工作。不过如果想用 Gradle 构建 Grails 应用那就更加麻烦一些了。
PS. 在使用 Maven 构建 Grails 应用时,我发现 Grails 的 grails create-pom 命令生成的 pom.xml 文件中缺少 servlet-api 的 dependency。需要手工添加,否则在用 Maven 编译打包时都会爆出 NoClassFound 的异常。
Spring Boot 通过添加 starter-module 的依赖来扩展功能;Grails 则通过插件
显然前者更加通用
数据库访问方面
Grails 通过 GORM 使得对关系型数据库支持更加的全面,也更易用。Spring Boot 则将关系型数据库和 NoSQL 数据库一视同仁
当构建 Web 应用时,首选的框架仍然是 Grails。(PS. 当然 Play! Framework 也是不错的选择,但是我不喜欢 Scala)但是 Spring Boot 非常值得关注。因为它关注于简化现有的 Spring 应用的开发,而不是一种全新的解决方案。Spring Boot 为现在越来越臃肿的 Spring 应用提供了新的希望,从这个角度讲,它要比 Grails 会有更广泛的应用。
Spring Boot 是一阵小清新。Grails 虽然依旧是一个非常好用的 Web 快速开发框架,但是因为它是一站式解决方案,所以不可避免的变得有些庞大了。
人气:1173
Copyright (C) , All Rights Reserved.
版权所有 闽ICP备号
processed in 0.092 (s). 12 q(s)博客分类:
扫一扫,关注我的公众号
我的新书 购买地址
之前有一篇《》介绍了普通方式开发spring web mvc web service。接下来看看使用spring boot如何快速构建一个。
Spring Boot使我们更容易去创建基于Spring的独立和产品级的可以”即时运行“的应用和服务。支持约定大于配置,目的是尽可能快地构建和运行Spring应用。
之前我们创建基于Spring的项目需要考虑添加哪些Spring依赖和第三方的依赖。使用Spring Boot后,我们可以以最小化的依赖开始spring应用。大多数Spring Boot应用需要很少的配置即可运行,比如我们可以创建独立独立大Java应用,然后通过java -jar运行启动或者传统的WAR部署。其也提供了命令行工具来直接运行Spring脚本(如groovy脚本)。也就是说Spring Boot让Spring应用从配置到运行变的更加简单,但不对Spring本身提供增强(即额外的功能)。
让所有Spring开发变得更快,且让更多的人更快的进行Spring入门体验,提供“starter” POM来简化我们的Maven配置(也就是说使用Spring Boot只有配合maven/gradle等这种依赖管理工具才能发挥它的能力),不像以前,构建一个springmvc项目需要进行好多配置等
开箱即用,快速开始需求开发而不被其他方面影响(如果可能会自动配置Spring)
提供一些非功能性的常见的大型项目类特性(如内嵌服务器、安全、度量、健康检查、外部化配置),如可以直接地内嵌Tomcat/Jetty(不需要单独去部署war包)
绝无代码生成,且无需XML配置
我的构建环境
Servlet3容器
首先使用Maven创建一个普通Maven应用即可,不必是web的。
添加Spring Boot相关POM配置
在pom.xml中添加如下配置
&!-- Inherit defaults from Spring Boot --&
&groupId&org.springframework.boot&/groupId&
&artifactId&spring-boot-starter-parent&/artifactId&
&version&0.5.0.BUILD-SNAPSHOT&/version&
&!-- Add typical dependencies for a web application --&
&dependencies&
&dependency&
&groupId&org.springframework.boot&/groupId&
&artifactId&spring-boot-starter-web&/artifactId&
&/dependency&
&/dependencies&
&!-- Package as an executable JAR --&
&groupId&org.springframework.boot&/groupId&
&artifactId&spring-boot-maven-plugin&/artifactId&
&/plugins&
&!-- Allow access to Spring milestones and snapshots --&
&!-- (you don't need this if you are using anything after 0.5.0.RELEASE) --&
&repositories&
&repository&
&id&spring-snapshots&/id&
&url&http://repo.spring.io/snapshot&/url&
&snapshots&&enabled&true&/enabled&&/snapshots&
&/repository&
&repository&
&id&spring-milestones&/id&
&url&http://repo.spring.io/milestone&/url&
&snapshots&&enabled&true&/enabled&&/snapshots&
&/repository&
&/repositories&
&pluginRepositories&
&pluginRepository&
&id&spring-snapshots&/id&
&url&http://repo.spring.io/snapshot&/url&
&/pluginRepository&
&pluginRepository&
&id&spring-milestones&/id&
&url&http://repo.spring.io/milestone&/url&
&/pluginRepository&
&/pluginRepositories&
继承spring-boot-starter-parent后我们可以继承一些默认的依赖,这样就无需添加一堆相应的依赖,把依赖配置最小化;spring-boot-starter-web提供了对web的支持,spring-boot-maven-plugin提供了直接运行项目的插件,我们可以直接mvn spring-boot:run运行。
package com.sishuok.
* &p&User: Zhang Kaitao
* &p&Date: 13-12-22
* &p&Version: 1.0
public class User {
public Long getId() {
public void setId(Long id) {
public String getName() {
public void setName(String name) {
this.name =
public boolean equals(Object o) {
if (this == o)
if (o == null || getClass() != o.getClass())
User user = (User)
if (id != null ? !id.equals(user.id) : user.id != null)
public int hashCode() {
return id != null ? id.hashCode() : 0;
package com.sishuok.
import com.sishuok.entity.U
import org.springframework.boot.SpringA
import org.springframework.boot.autoconfigure.EnableAutoC
import org.springframework.web.bind.annotation.PathV
import org.springframework.web.bind.annotation.RequestM
import org.springframework.web.bind.annotation.RestC
* &p&User: Zhang Kaitao
* &p&Date: 13-12-22
* &p&Version: 1.0
//@EnableAutoConfiguration
@RestController
@RequestMapping("/user")
public class UserController {
@RequestMapping("/{id}")
public User view(@PathVariable("id") Long id) {
User user = new User();
user.setId(id);
user.setName("zhang");
//public static void main(String[] args) {
SpringApplication.run(UserController.class);
第一种方式
通过在UserController中加上@EnableAutoConfiguration开启自动配置,然后通过SpringApplication.run(UserController.class);运行这个控制器;这种方式只运行一个控制器比较方便;
第二种方式
通过@Configuration+@ComponentScan开启注解扫描并自动注册相应的注解Bean
package com.
import com.sishuok.controller.UserC
import org.springframework.boot.SpringA
import org.springframework.boot.autoconfigure.EnableAutoC
import org.springframework.ponentS
import org.springframework.context.annotation.C
* &p&User: Zhang Kaitao
* &p&Date: 13-12-22
* &p&Version: 1.0
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class);
到此,一个基本的REST风格的web应用就构建完成了。
地址栏输入http://localhost:8080/user/1即可看到json结果。
如果大家查看其依赖,会发现自动添加了需要相应的依赖(不管你用/不用),但是开发一个应用确实变得非常快速,对于想学习/体验Spring的新手,快速建立项目模型等可以考虑用这种方式。当然如果不想依赖这么多的jar包,可以去掉parent,然后自己添加依赖。
欢迎加入spring群进行交流。
下载次数: 4122
浏览 368480
spring boot基础学习系列文章:广告打的蛮远的,有点烂
为什么我运行main函数,eclipse就直接要结束进程,什么错误信息都没有?先mvn install了的 我也是install成功了的,但是还是没法运行main函数
体验下零配置的感觉。看看playframework吧,让你真正体验到什么是飞一般的感觉!
& 上一页 1
jinnianshilongnian
浏览量:1761776
浏览量:2191263
浏览量:4418524
浏览量:179817
浏览量:1258828
浏览量:190133
浏览量:3831667
浏览量:463456
浏览量:491603
过滤器 过滤器,我告诉自己是过滤器
好东西 系统学习下!
貌似完整的 流程 没走完,拿到 授权code后,还需要重定向到 ...
数据库去哪了?
大神,麻烦帮我看下我的问题,你会感兴趣的http://ask. ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'【详解】为什么选择Spring Boot作为微服务的入门级微框架
发表于 16:33|
来源EAII企业架构创新研究院|
作者许二虎
摘要:1. Spring Boot是什么,解决哪些问题 1) Spring Boot使编码变简单 2) Spring Boot使配置变简单 3) Spring Boot使部署变简单 4) Spring Boot使监控变简单 5) Spring Boot的不足 2. Spring Boot在平台中的定位,相关技术如何融合 1) SpringBoot与SEDA +MicroService + RESTful 2) SpringBoot与Mock 3. 采用了SpringBoot之后,技术管理应该如何进行 首先,我...
本文为普元云计算高级工程师许二虎在普元云计算架构设计群的微课堂分享。如需加入普元新一代数字化企业云平台研发设计群参与微课堂、架构设计与讨论直播,请直接回复此公众号:&加群 姓名 公司 职位 微信号&。
1. Spring Boot是什么,解决哪些问题
& & &1) Spring Boot使编码变简单
& & &2) Spring Boot使配置变简单
& & &3) Spring Boot使部署变简单
& & &4) Spring Boot使监控变简单
& & &5) Spring Boot的不足
2. Spring Boot在平台中的定位,相关技术如何融合
& & &1) SpringBoot与SEDA +MicroService + RESTful
& & &2) SpringBoot与Mock
3. 采用了SpringBoot之后,技术管理应该如何进行
首先,我们来看一下spring boot是什么,它帮助我们解决了哪些问题:
SpringBoot是伴随着Spring4.0诞生的;
从字面理解,Boot是引导的意思,因此SpringBoot帮助开发者快速搭建Spring框架;
SpringBoot帮助开发者快速启动一个Web容器;
SpringBoot继承了原有Spring框架的优秀基因;
SpringBoot简化了使用Spring的过程。
Spring由于其繁琐的配置,一度被人认为&配置地狱&,各种XML、Annotation配置,让人眼花缭乱,而且如果出错了也很难找出原因。
Spring Boot更多的是采用Java Config的方式,对Spring进行配置。
可以看到,采用了spring-boot-start-actuator之后,直接以REST的方式,获取进程的运行期性能参数。
当然这些metrics有些是有敏感数据的,spring-boot-start-actuator为此提供了一些Basic Authentication认证的方案,这些方案在实际应用过程中也是不足的。
Spring Boot作为一个微框架,离微服务的实现还是有距离的。
没有提供相应的服务发现和注册的配套功能,自身的acturator所提供的监控功能,也需要与现有的监控对接。没有配套的安全管控方案,对于REST的落地,还需要自行结合实际进行URI的规范化工作。
下面,我们研究一下Spring Boot在平台中的定位,相关技术如何融合。
上图比较复杂,整体是采用SEDA,也就是Stage-EDA。可以看到,整体是以处理顺序进行展示的,响应过程类似。在处理过程中,主要会有前置过滤,核心功能处理,后置过滤几大部分。
图中的过滤器都是可插拔式的,并且可以根据实际场景进行扩展开发。每个过滤器都是Stage,比如ClientInstance合法性检查、调用鉴权、解密、限流等等。
一个请求Stage与Stage的转换,实现上是切换不同的线程池,并以EDA的方式驱动。
对于业务逻辑的开发者而言,只需要关心CORE部分的业务逻辑实现,其他的非功能都由框架进行统一实现。
Mock不应当再是测试的专有名词了,当然对于测试这个角色而言,mockito这样的工具,依然可以为他们提升不少效率。
SpringBoot为创建REST服务提供了简便的途径,相比之下,采用阿里的dubbo在做多团队、多进程联调时,mock的难度就陡增。
Mock是解耦并行开发的利器,在理性的情况下,软件从开发期Mock联调,到开发与开发的真实联调,只需要切换一个依赖的域名即可,比如:
mockURI:http://mock.service.net/v1/function?param1=value1
devURI:http://dev.service.net/v1/function?param1=value1
而上述的域名切换,只需要在开发期定义好一个配置项,在做环境切换的时候自动注入即可,省时、省心、省力。
如上图和docker的集成可以有AB两种方案:
& A方案的核心是,把docker作为操作系统环境的交付基线,也就是不同的fat jar 使用相同的操作系统版本、相同的JVM环境。但对于docker image来说都是一样的。
& B方案的核心是,不同的fat jar,独立的编译为docker image,在启动时直接启动带有特定版本的image。
A相比与B方案的特点是对于docker registry(也就是docker的镜像仓库)的依赖性较低,对于前期编译过程的要求也较低。
采用了Spring Boot之后,技术管理应该如何进行?
正因为Spring Boot是与Spring一脉相承的,所以对于广大的Java开发者而言,对于Spring的学习成本几乎为零。
在实践Spring Boot时学习重点,或者说思维方式改变的重点在于:
1)对于REST的理解,这一点尤为重要,需要从设计、开发多个角色达成共识,很多时候都是对于HTTP 1.1协议以及REST的精髓不理解,导致REST被「盲用」而产生一些不好的效果。
2)对于YAML的理解和对于JavaConfig的理解,这两点相对较为简单,本质上是简化了xml文件,并提供等价的配置表述能力。
1. 丰富的工具链为SpringBoot的推广带来了利好。
2. SpringBoot的工具链主要来自于两个方面:
& & 1) 原有Spring积累的工具链;
& & 2) SpringMVC或者其他REST框架使用HTTP协议,使得HTTP丰富的工具成为SpringBoot天然的资源。
SpringBoot自身对于前面提到的配置文件:&application.yml&提供了多个「Profile」,可以便于开发者描述不同环境的配置,这些配置例如数据库的连接地址、用户名和密码。
但是对于企业用户而言,把不同环境的配置,写到同一个配置文件中,是极其不安全的,是一个非常危险的动作。
有一个经常被提及的例子是,随着开源的进行,很多互联网公司,都由于把相关的代码提交到github之类的开源代码社区,并且没有对代码进行严格的配置审查,导致一些&password&被公开。有些不良用心的人,就利用搜索工具,专门去挖掘这些关键字,进而导致数据库被「拖库」。
所以对于企业用户,更多的应该是采用集中式的配置管理系统,将不同环境的配置严格区分地存放。
虽然SpringBoot的actuator自身提供了基于「用户名+口令」的最简单的认证方式,但它保护的是对框架自身运行期的性能指标敏感数据的最基本的保护。这种保护在实际应用过程中,「用户名+口令」的管理是缺乏的,「用户名+口令」的安全配置过程是缺失的。
SpringBoot也不提供对于我们自己开发的功能的任何防护功能。
一般来讲,一个安全的信道(信息传输的通道),需要通信双方在进行正式的信息传输之前对对方进行身份认证,服务提供方还需要在此基础之上,对请求方的请求进行权限的校验,以确保业务安全。这些内容也需要基于SpringBoot进行外围的安全扩展,例如采用前面提到的S-EDA进行进程级别的安全管控。这些还需要配套的安全服务提供支持。
一般来说,只要企业与互联网对接,那么随便一个面向消费者的「市场活动」,就有可能为企业带来井喷的流量。
传统企业内,更多的系统是管理信息类的支撑系统,这类系统在设计时的主要用户是企业内部员工以及有限的外部供应商。这类系统存在于企业内部的时间一直很长,功能耦合也很多,在功能解耦前,是非常不适合的,或者说绝对不可以直接为互联网的用户进行服务的。
SpringBoot自身并没有提供这样的流控措施,所以需要结合前面提到的S-EDA进行流量的控制,并结合下层的水平扩展能力(例如,Kubernets)进行流量负载合理的动态扩容。
另外,在长业务流程的设计上,也尽可能地采用异步的方式,比如接口调用返回的是一个「受理号」,而不是业务的处理结果,避免井喷业务到来时,同步调用所带来的阻塞导致系统迅速崩溃,这些也都是SpringBoot自身并不解决的问题。
以上是我分享的主要内容,下面我们总结一下:
谢谢大家的聆听。
关于作者:
EAII-企业架构创新研究院 专家委员
现任普元云计算高级工程师。毕业于中国科学技术大学,软件工程硕士。曾任职于群硕软件、科纬迅软件服务、平安健康,具备互联网领域的技术应用经验。在普元云计算平台中的角色是,以靠谱的后端的功底,支撑着整个DevOps业务平台交付。
EAII(Enterprise Architecture Innovation Institute)企业架构创新研究院,是专注于企业架构与业务创新领域的研究机构,致力于金融、电信、能源与政务等行业领域的企业软件架构优化设计与 创新研究,以及分布式计算、服务构件技术、可视化技术、业务流程管理、内存计算、企业移动计算、数据治理等领域的技术研究。
推荐阅读相关主题:
CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
相关热门文章

我要回帖

更多关于 springboot是什么 的文章

 

随机推荐