spring boot 使用及最佳实践
一、Spring boot的使用
1. 使用maven进行构建
用户可以通过继承spring-boot-starter-parent来获取默认的依赖。
- 默认java1.8编译级别
- 默认UTF-8编码设置
- 默认的DependencyManagement,继承与spring-boot-dependencies pom文件,用于管理常用依赖及版本。后续使用添加maven依赖可以省略version信息。
- repackage 配置
- 资源文件过滤
- plugin信息配置(包括exec、shade等)
- application.properties,application.yml文件及profile环境文件(如application-dev.properties或者application-dev.yml等)过滤。
starter parent 继承,pom依赖:
<!-- Inherit defaults from Spring Boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
</parent>
后续添加starter依赖,可以使用新的版本号进行覆盖。也可以通过定义相应的属性,来覆盖相应依赖的版本信息。
<properties>
<spring-data-releasetrain.version>Fowler-SR2</spring-data-releasetrain.version>
</properties>
支持的版本信息可以通过spring-boot-dependencies pom文件来查看。
2. 不通过继承start-parent来使用
有些时候,通过继承starter-parent来使用spring boot并不合适,例如,项目有自定义的需要继承的pom。这种情况下就可以通过使用spring-boot-dependencies pom文件来使用默认依赖(不包括默认插件配置),如下:声明type为pom,scope为import
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
这种情况下,定义相应的属性配置,将不再能覆盖已有版本信息。如果需要,可以通过使用以下方式,以spring-data-releasetrain为例:
<dependencyManagement>
<dependencies>
<!-- Override Spring Data release train provided by Spring Boot -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-releasetrain</artifactId>
<version>Fowler-SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3. Spring boot maven插件使用
Spring boot包含一个可以将工程打包成可执行jar的maven插件,可以通过如下方式进行添加:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
继承starter-parent情况下,只配置此插件即可使用。如果需要更改stater-parent中的默认配置属性,可以通过定义进行覆盖。
二、最佳实践
1. 代码结构:
避免使用默认包
如果创建的类没有声明包信息,则类会默认使用默认包,默认包使用在使用诸如@ComponentScan, @EntityScan, 及@SpringBootApplication时可能会引发特殊问题。
官方建议遵循java既有的命名约定规则,使用反转域名的方式命名包。例如,com.example.project.
2. 应用主类位置:
通常我们建议将主类放置于根路径下,注解@SpringBootApplication 通常放置于主类上,并且作为么某些扫描的根路径。如JPA配置的Entity扫描等。
@SpringBootApplication注解包含 @EnableAutoConfiguration 和 @ComponentScan ,可以单独配置,或者直接使用@SpringBootApplication 简化配置。
如下,基本工程结构:
com
+- example
+- myapplication
+- Application.java
|
+- customer
| +- Customer.java
| +- CustomerController.java
| +- CustomerService.java
| +- CustomerRepository.java
|
+- order
+- Order.java
+- OrderController.java
+- OrderService.java
+- OrderRepository.java
包含main方法的主类定义如下:
package com.example.myapplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
public class Application { public static void main(String[] args) {
SpringApplication.run(Application.class, args);
} }
3. 配置类@Configuration:
Spring boot倾向使用基于java配置类的配置方式,建议使用主类作为主要的配置位置@Configuration。
4. 引入额外的配置类:
不需要将所有的配置放到一个配置类中,可以通过使用@Import注解引入额外的配置类信息。当然@ComponentScan注解会扫描包含@Configuration注解的配置类。
5. 引入xml配置
如果存在不许使用xml配置的情况,则可以通过@ImportResource注解来进行加载。
6. 自动配置@EnableAutoConfiguration
Spring boot基于添加的相应的功能jar进行自动配置。例如,类路径中有HSQLDB jar包的情况下,如果没有主动定义相应的数据源连接bean,则spring boot会自动配置内存数据库。
自动配置需添加相应的@EnableAutoConfiguration或者@SpringBootApplication来启用。通常放置其一于主类即可。
7. 自动配置的覆盖:
自动配置是非侵入性的,可以通过定义相应的自定义配置类进行覆盖,如果需要知道工程目前使用了那些自动配置,可以通过在启动时添加—debug选项,来进行输出。
8. 禁用某些自动配置
如果发现输出的日中包含一些不需要应用的自动配置可以通过在注解@EnableAutoConfiguration上添加exclude附加选项来禁用,如下:
import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc.*;
import org.springframework.context.annotation.*; @Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration {
}
如果相应的配置类不再类路径下,则可以使用excludeName属性进行全路径配置。
另外,也可以通过配置文件spring.autoconfigure.exclude属性进行配置。
9. Spring bean及依赖注入
使用@ComponentScan进行bean的扫描及使用@Autowired进行以来注入。
如果工程结构遵循了以上的建议结构,那么添加@ComponentScan于主类上,就会将所有的诸如@Component, @Service, @Repository, @Controller等注解的类注册为spring bean。
如下示例,使用构造器诸如的@Service注解的服务类:
package com.example.service; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; @Service
public class DatabaseAccountService implements AccountService { private final RiskAssessor riskAssessor; @Autowired
public DatabaseAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
} // ... }
如果只有一个构造函数,则@Autowired可以省略。
10. @SpringBootApplication:等价以下三个注解默认配置
- @EnableAutoConfiguration:自动配置
- @ComponentScan:自动组件扫描
- @Configuration:配置类注解
package com.example.myapplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan
public class Application { public static void main(String[] args) {
SpringApplication.run(Application.class, args);
} }
包含的注解并不是强制性的,可以自定义的使用相应的注解以使用相应的特性:
package com.example.myapplication; import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.ComponentScan
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import; @Configuration
@EnableAutoConfiguration
@Import({ MyConfig.class, MyAnotherConfig.class })
public class Application { public static void main(String[] args) {
SpringApplication.run(Application.class, args);
} }
如上,不使用自动扫描发现,及主动引入基于java的配置类。
11. 运行你的工程
可以将工程打包为一个可运行的jar,并使用内置的http服务器来运行。
$ java -jar target/myapplication-0.0.1-SNAPSHOT.jar
或者添加调试:
$ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n \
-jar target/myapplication-0.0.1-SNAPSHOT.jar
使用maven插件运行:
$ mvn spring-boot:run
spring boot 使用及最佳实践的更多相关文章
- Spring Boot 16 条最佳实践
Spring Boot是最流行的用于开发微服务的Java框架.在本文中,我将与你分享自2016年以来我在专业开发中使用Spring Boot所采用的最佳实践.这些内容是基于我的个人经验和一些熟知的Sp ...
- Spring Boot使用Liquibase最佳实践
Liquibase问题 随着项目的发展,一个项目中的代码量会非常庞大,同时数据库表也会错综复杂.如果一个项目使用了Liquibase对数据库结构进行管理,越来越多的问题会浮现出来. ChangeSet ...
- 【Spring Cloud】Spring Cloud之整合Spring Cloud Bus以及最佳实践
一.整合步骤 1)加入Maven坐标 <!-- actuator监控模块 --> <dependency> <groupId>org.springframework ...
- Spring Boot消息队列应用实践
消息队列是大型复杂系统解耦利器.本文根据应用广泛的消息队列RabbitMQ,介绍Spring Boot应用程序中队列中间件的开发和应用. 一.RabbitMQ基础 1.RabbitMQ简介 Rabbi ...
- spring boot + mybatis + druid配置实践
最近开始搭建spring boot工程,将自身实践分享出来,本文将讲述spring boot + mybatis + druid的配置方案. pom.xml需要引入mybatis 启动依赖: < ...
- Spring Boot开发MongoDB应用实践
本文继续上一篇定时任务中提到的邮件服务,简单讲解Spring Boot中如何使用MongoDB进行应用开发. 上文中提到的这个简易邮件系统大致设计思路如下: 1.发送邮件支持同步和异步发送两种 2.邮 ...
- Spring Boot WebFlux 快速入门实践
02:WebFlux 快速入门实践 Spring Boot 2.0 spring.io 官网有句醒目的话是: BUILD ANYTHING WITH SPRING BOOT Spring Boot ( ...
- Spring Boot Admin简介及实践
问题 在若干年前的单体应用时代,我们可以相对轻松地对整个业务项目进行健康检查.指标监控.配置管理等等项目治理.如今随着微服务的发展,我们将大型单体应用按业务模型进行划分,以此形成众多小而自治的微服务, ...
- Spring Boot 配置文件 – 在坑中实践
摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 仓廪实而知礼节,衣食足而知荣辱 - 管仲 』 本文提纲 一.自动配置 二.自定义 ...
随机推荐
- Java虚拟机18:Java对象大小、对象内存布局及锁状态变化
一个对象占多少字节? 关于对象的大小,对于C/C++来说,都是有sizeof函数可以直接获取的,但是Java似乎没有这样的方法.不过还好,在JDK1.5之后引入了Instrumentation类,这个 ...
- PHP开发者应了解的24个库
@PHP开发者应了解的24个库 本文由 伯乐在线 - 贾朝藤 翻译.未经许可,禁止转载!英文出处:tutorialzine.欢迎加入翻译组. 作为一个PHP开发者,现在是一个令人激动的时刻.每天有许许 ...
- CF893F:Subtree Minimum Query(线段树合并)
Description 给你一颗有根树,点有权值,m次询问,每次问你某个点的子树中距离其不超过k的点的权值的最小值.(边权均为1,点权有可能重复,k值每次询问有可能不同,强制在线) Input 第一行 ...
- 4719: [Noip2016]天天爱跑步
Time Limit: 40 Sec Memory Limit: 512 MB Submit: 1986 Solved: 752 [Submit][Status][Discuss] Descripti ...
- Python学习之路 (三)爬虫(二)
通用爬虫和聚焦爬虫 根据使用场景,网络爬虫可分为 通用爬虫 和 聚焦爬虫 两种. 通用爬虫 通用网络爬虫 是 捜索引擎抓取系统(Baidu.Google.Yahoo等)的重要组成部分.主要目的是将互联 ...
- Python自动化之clean方法前端调用clean方法的错误
obj.non_field_errors.0 源代码: NON_FIELD_ERRORS = '__all__' 如果在前端写 obj.errors.__all__.0直接就会报错 所以经过尝试得知, ...
- w10下Oracle 11g完全干净卸载
1.关闭oracle所有的服务.可以在windows的服务管理器中关闭: 2.打开注册表:regedit 打开路径: <找注册表 :开始->运行->regedit> H ...
- kubernetes pvc pv 坑
这里遇到一个问题,开始建立的pv死活claim为空,查看pv以及pvc的配置发现并没有任何名称上的关联,继续研究,发现纯粹是通过storage大小进行匹配的,之前因为照抄书本,一个是5G,一个是8G所 ...
- Linux Shell常用技巧(三)
八. 流编辑器sed: sed一次处理一行文件并把输出送往屏幕.sed把当前处理的行存储在临时缓冲区中,称为模式空间(pattern space).一旦sed完成对模式空间中的行的处理,模式空间中的行 ...
- Linux Shell常用技巧(一)
一. 特殊文件: /dev/null和/dev/tty Linux系统提供了两个对Shell编程非常有用的特殊文件,/dev/null和/dev/tty.其中/dev/null将会丢掉所有写入它 ...