admin 管理员组

文章数量: 887086


2024年1月16日发(作者:ubuntu cmake安装)

SpringBoot研究和应用王永和,张劲松,邓安明,周智勋(云南云电同方科技有限公司,云南昆明650218)摘要:SpringBoot是一个用于简化、加速Spring开发的框架,文章对SpringBoot的开发做了简要介绍,之后对整合传统Spring的开发做了探索性研究。关键词:SpringBoot;开发;整合传统Spring中图分类号:TN943.6文献标识码:A文章编号:1673-1131(2016)10-0091-041SpringBoot简介SpringBoot是在2013年推出的新项目,主要用来简化Spring开发框架的开发、配置、调试、部署工作,同时在项目内集成了大量易于使用且实用的基础框架。在SpringBoot中集成的基础框架,是在开发中经常需要使用的框架,如内嵌容器(Tomcat、Jettty、Undertow)、日志框架、JMS框架、持久化框架、流行的NOSQL数据库(Cassandra、MongoDB)、缓存框架等。在传统的Spring框架中开发,用户需要自行编写XML文件,并在Maven、Gradle中加入相应的依赖包,在响应的代码中添加功能代码,才能使用。同时对于引入多个依赖包时,包之间的版本调整也是个困难的问题,经常需要对依赖包的版本冲突进行处理。调整依赖2.1.6重连编组位置识别由于所有节点的应用程序相同,为了让显示器能正确读取到编组的数据并进行编组区分,通过综合判断各个编组的编组编号、编组索引之间的关联关系,分别定义编组1、编组2、编组3,并将3个编组的数据分别发送至本编组固定的MVB端口,由显示器读取并显示到正确的位置。各个编组的MVB主节点根据确定的重连拓扑与本节点的编组编号,节点索引以及本编组的拓扑进行分析,将编组号映射到显示器上显示的车辆编号。2.2重连列车行驶方向2.2.1全车行驶方向全车的行驶方向应由主控车司机室的方向命令唯一确定。司机通过输入向前或是向后命令,控制全车向主控车的头车或者尾车方向行驶。该方向命令传输到WTB过程数据的全车控制信息,通过WTB网络控制编组的运动方向。2.2.2非主控编组牵引方向列车的牵引逆变器通过正相序或反相序输出交流电来控制牵引电机和车辆轮对的正转或者反转,从而实现司机所期望的列车“向前”或者“向后”运行。所有编组在收到主控车的方向命令后,根据自编组与主控编组拓扑关系判断本编组的牵引方向,并逐个向每一个牵引逆变器单独发送“正向”或“反向”指令。2.3WTB协议与整车控制整车控制信息和关键状态信息数据量小,实时性要求高;用于显示和记录的状态和故障信息数据量大,实时性要求较低。WTB端口大小为128字节,为了最大限度利用总线带宽,同时降低总线负荷,对实时性要求不高的状态数据进行分页包的版本以及冲突问题是一个费时费力、重复、繁琐的工作。如果使用SpringBoot开发,仅需在Maven、Gradle配置文件中加上少量的配置,即可在代码中使用所需的框架,让原本的配置简化到几乎是零代码、零XML配置,同时依赖包的版本问题也由SpringBoot轻松解决。SpringBoot对目前的的主流构建工具Maven、Gradle都提供了良好的支持,对其他构建工具也提供了支持,如Ant,但是相对Maven、Gradle来说,支持的力度相对要少些,所以需要尽量使用Maven、Gradle来构建SpringBoot程序。本文的构建环境是Maven,使用Gradle可以参考SpringBoot的官方Reference文档。2简单示例HelloWorld开发对比2.1使用传统Spring开发HelloWorld程序分周期发送,通过写入页码的方法识别每个周期发送的设备状态,将节点的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开发一个HelloWorld的Web程序,构建开发工程是一个比较繁琐的过程,典型的工程,需要修改、配置一下4个文件:、、、,即使在IDE运行、调试,还是需要配置好J2EE容器才能进行调试工作。如果要进行运维、部署工作,还需要用IDE将应用打包为war文件,之后还要进行J2EE容器的配置、部署,再将war文件部署到容器中运行,才能看到运行效果。2.2使用SpringBoot开发HelloWorld程序使用SpringBoot开发HelloWorld程序,所需的工作量将大大减少。仅仅需要修改、配置2个文件:、,借助SpringBoot框架内的内嵌容器,在IDE即可轻松启动Web程序。核心内容如下:spring-boot-starter-parentEspring-boot-starter-web代码:packagehello;Application;Bo-otApplication;-tMapping;-seBody;@SpringBootApplicationpublicclassHello{@RequestMapping("/test/v1")@ResponseBodyStringhome(){return"HelloWorld";}publicstaticvoidmain(String[]args)throwsException{(,args);}}从和的代码可见,使用SpringBoot,代码、配置均得到了极大的简化,仅仅十多行代码加上Maven配置,即可完成一个Web程序。同时这个web程序可以轻松打包为单一的可运行jar文件,在命令行使用如下命令:就能不部署J2EE容器的情况下,启动一个Web应用。这种把Web应用打包为单一可运行jar包同时内嵌J2EE92王永和等:SpringBoot研究和应用容器的方式,主要目的是简化应用的部署、配置工作。在实际运维中这种打包方式可以很好地配合Docker之类的虚拟化平台,达到简单、快速部署的目标。3SpringBoot的主要功能特性作为一个简化Spring开发、调试、部署的框架,SpringBoot提供了许多好用的特性,这里仅介绍开发中主要特性。其他的诸多实用特性,比如:日志集成、安全技术、NoSQL技术、消息(JMS)、邮件发送、JTA分布式事务集成、JMX的监控和管理技术集成、测试功能集成、使用条件的自动配置技术、WebSo-ckets开发等不在本文中介绍,读者在本文的基础上,可以自行参考第六章中给出的资源进行扩展学习。SpringBoot的提供微服务框架开发功能,除了将Web程序打包为war文件的部署方式。还可以将Web程序编译为可独立运行的jar包,同时还可以内嵌J2EE容器,使得Web程序也可以独立于容器外运行。3.1SpringApplicationSpringApplication类提供了一种从main()方法启动Spring应用的便捷方式。如下面的SpringApplication类代码所示,Hello类在的main()方法中,通过调用这个静态方法启动应用本身。SpringApplication类代码:packagehello;Application;Bo-otApplication;-tMapping;-seBody;@SpringBootApplicationpublicclassHello{@RequestMapping("/test/v1")@ResponseBodyStringhome(){return"HelloWorld";}publicstaticvoidmain(String[]args)throwsException{(,args);}}上述代码说明了,SpringApplication可以简单地、很好地启动一个Spring应用。对于Web应用,SpringBoot可以通过打包工具将Tomcat、Jetty等容器嵌入到可执行的jar包内,使jar包成为独立运行的Web应用。3.2外化配置Spring开发框架中允许将程序的运行参数放置到properties文件内,在SpringBoot中,这些可配置的参数的来源扩大了,不在局限于properties文件,可以来自其他外部环境(比如启动命令行、系统环境变量),这个功能称为外化配置(externalize)。除了使用properties配置文件,还可以使用YAML配置文件,配置文件中参数可以系统环境变量、命令行参数等外部环境。SpringBoot的配置参数可以来源以下环境:

信息通信(1)命令行参数;(2)来自于java:comp/env的JNDI属性;(3)Java系统属性(perties());(4)操作系统环境变量;(5)只有在random.*里包含的属性会产生一个RandomValu-ePropertySource;(6)在打包的jar外的应用程序配置文件(-erties,包含YAML和profile变量);(7)在打包的jar内的应用程序配置文件(-erties,包含YAML和profile变量);(8)在@Configuration类上的@PropertySource注解;(9)默认属性(使用aultProperties指定)。下面是一个具体的示例,从外部环境中获取的属性(数据库端口):代码示例:获取外部资源参数publicclassApplication{@Value("${}")privateStringextResource;publicstaticvoidmain(String[]args)throwsException{(,args);}}SpringBoot的配置文件有2种格式,分别是properties和YAML。3.2.1Application属性文件SpringApplication会从以下位置加载ties文件,并把它们添加到SpringEnvironment中:(1)当前目录下的一个/config子目录;(2)当前目录;(3)一个classpath下的/config包;(4)classpath根路径(root)。这个列表是按优先级排序的(列表中位置高的将覆盖位置低的)。注:你可以使用YAML('.yml')文件替代'.properties'。如果不喜欢将ties作为配置文件名,你可以通过指定环境属性来切换其他的名称。你也可以使用on环境属性来引用一个明确的路径(目录位置或文件路径列表以逗号分割)。3.2.2YAMLYAML是JSON的一个超集,也是一种方便的定义层次配置数据的格式。无论你何时将SnakeYAML库放到classpath下,SpringApplication类都会自动支持YAML作为properties的替换。从下面的样例代码可知YAML易于人工书写、观察,缺点是YAML文件不能通过@PropertySource注解加载。YAML样例(代码来自/):nvironments:dev:url:e:DeveloperSetupprod:url:e:MyCoolApp王永和等:SpringBoot研究和应用对应的Properties(代码来自/)====MyCoolApp3.2.3Profiles在SpringBoot可以通过@Profiles来限制某些配置类的加载。如图10所示,代码中的配置,仅在环境的Profile为pro-duction才被加载,如果Profile为其他值,此配置类则不会被加载。通过环境变量控制@Profiles,从而可以灵活控制程序的加载。Profiles示例:@Configuration@Profile("production")publicclassProductionConfiguration{//...}如下面的代码,在ties中的激活Profile为:dev,hsqldb。=dev,hsqldb3.2.4开发Web应用在传统的springMVC、RESTful开发,需要手工处理XML,进行许多配置,在SpringBoot,仅需在maven配置添加一项:spring-boot-starter-web,如图1所示。图1SpringBootWeb程序的Maven配置文件3.2.5使用JPA操作数据库在SpringBoot使用JSP操作数据库,操作十分简单,仅需要在Maven配置加入pom项目:spring-boot-starter-data-jpa,如图2所示。然后定义需要的实体类:Customer,代码如下:@EntitypublicclassCustomerimplementsSerializable{@Id@GeneratedValueprivateLongid;@Column(nullable=false)privateStringname;@Column(nullable=false)privateIntegerage;//...additionalmembers,ofteninclude@OneToManyma-ppingsprotectedCustomer(){//no-argsconstructorrequiredbyJPAspec93

信息通信//thisoneisprotectedsinceitshouldn'tbeuseddirectly}publicCustomer(Stringname,intage){=name;=age;}publicStringgetName(){;}//...etc}根据业务需要的创建数据接口:CustomerRepository,代码如下:代码示例,CustomerRepository:publicinterfaceCustomerRepositoryextendsRepository{PagefindAll(Pageablepageable);CustomerfindByNameAndCountryAllIgnoringCase(Stringname,Stringcountry);}如图3所示,在配置类Application中对数据接口Custom-erRepository使用@Bean注解配置后,SpringBoot会自动创建接口CustomerRepository的实现,在零编码的情况下,就能使用CustomerRepository接口。图2增加pom项:spring-boot-starter-data-jpa图3图3实际配置类中零编码的情况下即可使用接口CustomerRepository(图3来自/guides/gs/accessing-data-jpa/)94王永和等:SpringBoot研究和应用3.3整合传统的基于XML配置的Spring旧代码如果要把早期的基于XML配置的旧代码整合到SpringBoot新代码中,在条件许可的情况下,尽量对旧代码进行改造,这样可以避免在实际运行中出现问题。如果旧代码改造成本较高,也可以考虑使用@ImportRe-source注解引入传统的XML配置,XML配置中的bean也能正常使用。在@ImportResource注解接入传统的SpringXML配置文件,可以解决大部分bean的的创建文件,实际使用时仍然存在少量的代码会出现问题,这时需要进行大量、细致的测试,才能找出有问题的代码并修正问题,这样也能解决问题。4SpringBoot的那些坑4.1JSP调试问题使用内嵌容器时,仅在使用Tomcat可以支持JSP(需要增加配置),其他容器不支持JSP。打包为war文件部署到标准容器时,不存在调试问题,所以仅会影响JSP调试。目前使用JSP开发的的情况越来越少,所以这个问题对开发的影响较小。4.2注解自动扫描问题SpringBoot仅仅扫描本身工程的源代码内的spring配置类,不会扫描引用的jar包内的进行spring配置类对象。对于引用的jar包的spring配置对象需要用@import注解进行。4.3整合传统Spring的XML配置冲突问题@ImportResource注解导入XML配置,如果在XML使用了的自动扫描功能,会引发Spring启动冲突。解决方法:在加入字段排除冲突的配置类(@Configuration),如:参考文献:[1]Pivotal团队,SpringBootReference[ol].2016.[2]Pivotal团队及其他开源贡献者.SpringBoot源码、示例[ol].2016.[3]作者:Pivotal团队,译者:qibaoguang@Boot参考指南(翻译)[ol].2016.[4]作者:DanWoods,译者:张卫滨.深入学习微框架:SpringBoot[ol].2014.[5]成富.使用SpringBoot快速构建Spring框架应用[ol].2014.


本文标签: 配置 编组 使用 开发 代码