Spring Boot研究和应用
王永和,张劲松,邓安明,周智勋
(云南云电同方科技有限公司,云南昆明650218)
摘要:Spring Boot是一个用于简化、加速Spring开发的框架,文章对Spring Boot的开发做了简要介绍,之后对整合传统Spring的开发做了探索性研究。
关键词:Spring Boot;开发;整合传统Spring
中图分类号:TN943.6文献标识码:A文章编号:1673-1131(2016)10-0091-04
1Spring Boot简介
Spring Boot是在2013年推出的新项目,主要用来简化Spring开发框架的开发、配置、调试、部署工作,同时在项目内集成了大量易于使用且实用的基础框架。
在Spring Boot中集成的基础框架,是在开发中经常需要使用的框架,如内嵌容器(Tomcat、Jettty、Undertow)、日志框架、JMS框架、持久化框架、流行的NOSQL数据库(Cassandra、MongoDB)、缓存框架等。
在传统的Spring框架中开发,用户需要自行编写XML文件,并在Maven、Gradle中加入相应的依赖包,在响应的代码中添加功能代码,才能使用。
同时对于引入多个依赖包时,包之间的版本调整也是个困难的问题,经常需要对依赖包的版本冲突进行处理。调整依赖包的版本以及冲突问题是一个费时费力、重复、繁琐的工作。
如果使用Spring Boot开发,仅需在Maven、Gradle配置文件中加上少量的配置,即可在代码中使用所需的框架,让原本的配置简化到几乎是零代码、零XML配置,同时依赖包的版本问题也由Spring Boot轻松解决。
Spring Boot对目前的的主流构建工具Maven、Gradle都提供了良好的支持,对其他构建工具也提供了支持,如Ant,但是相对Maven、Gradle来说,支持的力度相对要少些,所以需要尽量使用Maven、Gradle来构建Spring Boot程序。
本文的构建环境是Maven,使用Gradle可以参考Spring Boot的官方Reference文档。
2简单示例Hello World开发对比
2.1使用传统Spring开发Hello World程序
2.1.6重连编组位置识别
由于所有节点的应用程序相同,为了让显示器能正确读取到编组的数据并进行编组区分,通过综合判断各个编组的编组编号、编组索引之间的关联关系,分别定义编组1、编组2、编组3,并将3个编组的数据分别发送至本编组固定的MVB 端口,由显示器读取并显示到正确的位置。各个编组的MVB 主节点根据确定的重连拓扑与本节点的编组编号,节点索引以及本编组的拓扑进行分析,将编组号映射到显示器上显示的车辆编号。
2.2重连列车行驶方向
2.2.1全车行驶方向
全车的行驶方向应由主控车司机室的方向命令唯一确定。司机通过输入向前或是向后命令,控制全车向主控车的头车或者尾车方向行驶。该方向命令传输到WTB过程数据的全车控制信息,通过WTB网络控制编组的运动方向。
2.2.2非主控编组牵引方向
列车的牵引逆变器通过正相序或反相序输出交流电来控制牵引电机和车辆轮对的正转或者反转,从而实现司机所期望的列车“向前”或者“向后”运行。所有编组在收到主控车的方向命令后,根据自编组与主控编组拓扑关系判断本编组的牵引方向,并逐个向每一个牵引逆变器单独发送“正向”或“反向”指令。
2.3WTB协议与整车控制
整车控制信息和关键状态信息数据量小,实时性要求高;用于显示和记录的状态和故障信息数据量大,实时性要求较低。WTB端口大小为128字节,为了最大限度利用总线带宽,同时降低总线负荷,对实时性要求不高的状态数据进行分页分周期发送,通过写入页码的方法识别每个周期发送的设备状态,将节点的128字节平均分为控制信息、关键状态、设备状态和故障信息4个部分,控制信息和关键状态部分的所有信息在每个周期内都实时发送,各编组的设备状态与故障信息分页分周期发送。在协议的第95和第127字节分别加入页码用于识别当前周期发送的状态和故障页。
3实现效果
实际测试结果表明:实时性要求较高的控制数据与关键状态的发送周期为16ms,实时性要求相对较低的全车设备状态单页发送周期为80ms,总发送周期为1040ms,重连后控制信息能够准确达到所有编组,所有编组的拓扑结构与设备状态都能够实时准确地显示。
4结语
本文在原有的基础上重新设计动车组重连控制逻辑,有效解决了可变编组与编组方式的多编组自动重连逻辑,保证了重连拓扑与多编组设备状态显示的实时性和准确性。
参考文献:
[1]李国平.列车通信网络WTB_MVB与LonWorks的技术
比较与应用[J].铁道车辆,2004(1):27-30.
[2]姜娜.WTB底层协议的研究与实现[D].北京交通大学,
2007.
[3]蔡国强,贾利民,刘春煌,李熙.绞线式列车总线初运行算法
分析[J].铁路计算机应用,2007(5):8-10.
作者简介:张卫杰(1989-),男,湖南人,工程师,主要从事动车
网络研发工作。
91
使用传统Spring开发一个Hello World的Web程序,构建开发工程是一个比较繁琐的过程,典型的工程,需要修改、配置一下4个文件:Hello.java、l、l、l,即使在IDE运行、调试,还是需要配置好J2EE 容器才能进行调试工作。
如果要进行运维、部署工作,还需要用IDE将应用打包为war文件,之后还要进行J2EE容器的配置、部署,再将war文件部署到容器中运行,才能看到运行效果。
2.2使用Spring Boot开发Hello World程序
使用Spring Boot开发Hello World程序,所需的工作量将大大减少。仅仅需要修改、配置2个文件:Hello.java、l,借助Spring Boot框架内的内嵌容器,在IDE即可轻松启动Web程序。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.5.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
Hello.java代码:
package hello;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBo-otApplication;
import org.springframework.web.bind.annotation.Reques-tMapping;
import org.springframework.web.bind.annotation.Respon-seBody;
@SpringBootApplication
public class Hello{
@RequestMapping("/test/v1")
@ResponseBody
String home(){
return"Hello World";
}
public static void main(String[]args)throws Exception{
SpringApplication.run(Hello.class,args);
}
}
从l和Hello.java的代码可见,使用Spring Boot,代码、配置均得到了极大的简化,仅仅十多行代码加上Maven 配置,即可完成一个Web程序。
同时这个web程序可以轻松打包为单一的可运行jar文件hello.jar,在命令行使用如下命令:
java-jar hello.jar
就能不部署J2EE容器的情况下,启动一个Web应用。
这种把Web应用打包为单一可运行jar包同时内嵌J2EE 容器的方式,主要目的是简化应用的部署、配置工作。
在实际运维中这种打包方式可以很好地配合Docker之类的虚拟化平台,达到简单、快速部署的目标。
3Spring Boot的主要功能特性
作为一个简化Spring开发、调试、部署的框架,Spring Boot 提供了许多好用的特性,这里仅介绍开发中主要特性。其他的诸多实用特性,比如:日志集成、安全技术、NoSQL技术、消息(JMS)、邮件发送、JTA分布式事务集成、JMX的监控和管理技术集成、测试功能集成、使用条件的自动配置技术、WebSo-ckets开发等不在本文中介绍,读者在本文的基础上,可以自行参考第六章中给出的资源进行扩展学习。
Spring Boot的提供微服务框架开发功能,除了将Web程序打包为war文件的部署方式。还可以将Web程序编译为可独立运行的jar包,同时还可以内嵌J2EE容器,使得Web程序也可以独立于容器外运行。
3.1SpringApplication
SpringApplication类提供了一种从main()方法启动Spring 应用的便捷方式。如下面的SpringApplication类代码所示,Hello类在的main()方法中,通过调用SpringgApplication.run 这个静态方法启动应用本身。
SpringApplication类代码:
package hello;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBo-otApplication;
import org.springframework.web.bind.annotation.Reques-tMapping;
import org.springframework.web.bind.annotation.Respon-seBody;
@SpringBootApplication
public class Hello{
@RequestMapping("/test/v1")
@ResponseBody
String home(){
return"Hello World";
}
public static void main(String[]args)throws Exception{
SpringApplication.run(Hello.class,args);
}
}
上述代码说明了,SpringApplication可以简单地、很好地启动一个Spring应用。对于Web应用,Spring Boot可以通过打包工具将Tomcat、Jetty等容器嵌入到可执行的jar包内,使jar包成为独立运行的Web应用。
3.2外化配置
Spring开发框架中允许将程序的运行参数放置到properties 文件内,在Spring Boot中,这些可配置的参数的来源扩大了,不在局限于properties文件,可以来自其他外部环境(比如启动命令行、系统环境变量),这个功能称为外化配置(externalize)。
除了使用properties配置文件,还可以使用YAML配置文件,配置文件中参数可以系统环境变量、命令行参数等外部环境。
Spring Boot的配置参数可以来源以下环境:
92
(1)命令行参数;
(2)来自于java:comp/env的JNDI属性;
(3)Java系统属性(Properties());
(4)操作系统环境变量;
(5)只有在random.*里包含的属性会产生一个RandomV alu-ePropertySource;
(6)在打包的jar外的应用程序配置文件(application.prop-erties,包含YAML和profile变量);
(7)在打包的jar内的应用程序配置文件(application.prop-erties,包含YAML和profile变量);
(8)在@Configuration类上的@PropertySource注解;
(9)默认属性(使用SpringApplication.setDefaultProperties 指定)。
下面是一个具体的示例,从外部环境中获取db.port的属性(数据库端口):
代码示例:获取外部资源参数
public class Application{
@Value("${dp.port}")
private String extResource;
public static void main(String[]args)throws Exception{ SpringApplication.run(Application.class,args);
}
}
Spring Boot的配置文件有2种格式,分别是properties 和YAML。
3.2.1Application属性文件
SpringApplication会从以下位置加载application.properties 文件,并把它们添加到Spring Environment中:
(1)当前目录下的一个/config子目录;
(2)当前目录;
(3)一个classpath下的/config包;
(4)classpath根路径(root)。
这个列表是按优先级排序的(列表中位置高的将覆盖位置低的)。
注:你可以使用YAML('.yml')文件替代'.properties'。
如果不喜欢将application.properties作为配置文件名,你可以通过指定fig.name环境属性来切换其他的名称。你也可以使用fig.location环境属性来引用一个明确的路径(目录位置或文件路径列表以逗号分割)。
3.2.2YAML
YAML是JSON的一个超集,也是一种方便的定义层次配置数据的格式。无论你何时将SnakeY AML库放到classpath下,SpringApplication类都会自动支持Y AML作为properties的替换。
从下面的样例代码可知YAML易于人工书写、观察,缺点是YAML文件不能通过@PropertySource注解加载。
YAML样例(代码来自docs.spring.io/):
nvironments:
dev:
url:dev.bar
name:Developer Setup
prod:
url:foo.bar
name:My Cool App
对应的Properties(代码来自docs.spring.io/)
environments.dev.url=dev.bar
environments.dev.name=Developer Setup
environments.prod.url=foo.bar
environments.prod.name=My Cool App
3.2.3Profiles
在Spring Boot可以通过@Profiles来限制某些配置类的加载。如图10所示,代码中的配置,仅在环境的Profile为pro-duction才被加载,如果Profile为其他值,此配置类则不会被加载。
通过环境变量控制@Profiles,从而可以灵活控制程序的加载。
Profiles示例:
@Configuration
@Profile("production")
public class ProductionConfiguration{
//...
}
如下面的代码,在Application.properties中的激活Profile 为:dev,hsqldb。
spring.profiles.active=dev,hsqldb
3.2.4开发Web应用
在传统的spring MVC、RESTful开发,需要手工处理XML,进行许多配置,在Spring Boot,仅需在maven配置添加一项:spring-boot-starter-web,如图1
所示。
图1Spring Boot Web程序的Maven配置文件
3.2.5使用JPA操作数据库
在Spring Boot使用JSP操作数据库,操作十分简单,仅需要在Maven配置加入pom项目:spring-boot-starter-data-jpa,如图2所示。
然后定义需要的实体类:Customer,代码如下:
@Entity
public class Customer implements Serializable{
@Id
@GeneratedValue
private Long id;
@Column(nullable=false)
private String name;
@Column(nullable=false)
private Integer age;
//...additional members,often include@OneToMany ma-ppings
protected Customer(){
//no-args constructor required by JPA spec
93
94
//this one is protected since it shouldn't be used directly }
public Customer (String name,int age ){
this.name =name;this.age =age;
}
public String getName (){
return this.name;}//...etc }
根据业务需要的创建数据接口:CustomerRepository ,代码如下:
代码示例,CustomerRepository :
public interface CustomerRepository extends Repository<Customer,Long>{
Page<Customer>findAll (Pageable pageable );
Customer findByNameAndCountryAllIgnoringCase (String name,String country );
}如图3所示,在配置类Application 中对数据接口Custom-erRepository 使用@Bean 注解配置后,Spring Boot 会自动创建接口CustomerRepository 的实现,在零编码的情况下,就能使用CustomerRepository
接口。
图2增加pom 项:
spring-boot-starter-data-jpa
图3图3实际配置类中零编码的情况下即可使用接口
CustomerRepository
(图3来自spring.io/guides/gs/accessing-data-jpa/)  3.3整合传统的基于XML 配置的Spring 旧代码
如果要把早期的基于XML 配置的旧代码整合到Spring Boot 新代码中,在条件许可的情况下,尽量对旧代码进行改造,这样可以避免在实际运行中出现问题。
如果旧代码改造成本较高,也可以考虑使用@ImportRe-source 注解引入传统的XML 配置,XML 配置中的bean 也能正常使用。
在@ImportResource 注解接入传统的Spring XML 配置文件,可以解决大部分bean 的的创建文件,实际使用时
仍然存在少量的代码会出现问题,这时需要进行大量、细致的测试,才能出有问题的代码并修正问题,这样也能解决问题。
springboot框架的作用
4Spring Boot 的那些坑
4.1JSP 调试问题
使用内嵌容器时,仅在使用Tomcat 可以支持JSP (需要增加配置),其他容器不支持JSP 。
打包为war 文件部署到标准容器时,不存在调试问题,所以仅会影响JSP 调试。
目前使用JSP 开发的的情况越来越少,所以这个问题对开发的影响较小。
4.2注解自动扫描问题
Spring Boot 仅仅扫描本身工程的源代码内的spring 配置类,不会扫描引用的jar 包内的进行spring 配置类对象。对于引用的jar 包的spring 配置对象需要用@import 注解进行。
4.3整合传统Spring 的XML 配置冲突问题
@ImportResource 注解导入XML 配置,如果在XML 使用了<context:component-scan>的自动扫描功能,会引发Spring 启动冲突。
解决方法:
在<context:component-scan>加入<exclude-filter>字段排
除冲突的配置类(@Configuration ),如:
<context:exclude-filter type="assignable"expression="类的全路径"/>参考文献:[1]Pivotal 团队,Spring Boot Reference [ol ].2016.
[2]Pivotal 团队及其他开源贡献者.Spring Boot 源码、示例[ol ].2016.
[3]
作者:Pivotal 团队,译者:qibaoguang@gmail.Spring Boot 参考指南(翻译)[ol ].2016.
[4]作者:Dan Woods ,译者:张卫滨.深入学习微框架:Spring
Boot [ol ].2014.[5]
成富.使用Spring Boot 快速构建Spring 框架应用[ol ].2014.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。