Spring Boot 3.x 最佳实践
Spring Boot 3.x 最佳实践
Spring Boot不需要任何特定的代码布局。然而有一些最佳实践可以提供帮助。
代码结构
使用默认的包
当一个类没有包含包声明时,它会默认在"default package"中。通常不建议使用“default package”,应该避免使用。它可能会导致Spring Boot应用程序使用@ComponentScan
,@ConfigurationPropertiesScan
,@EntityScan
, 或者@SpringBootApplication
注解时,读取每个jar中的每个类。定位应用程序主类
通常建议将主应用程序类放在根包中。@SpringBootApplication
注释通常放在主类上, 它还隐式地为某些项目定义了一个基本的“search package”。例如,如果你正在编写一个JPA应用程序,那么@SpringBootApplication
注解类的包将用于搜索@Entity
项。使用根包还允许组件扫描只应用于你的项目。
下面一个典型的代码布局:
com+- example+- myapplication+- FirstSpringboot3MavenApplication.java|+- customer| +- Customer.java| +- CustomerController.java| +- CustomerService.java| +- CustomerRepository.java|+- order+- Order.java+- OrderController.java+- OrderService.java+- OrderRepository.java
FirstSpringboot3MavenApplication.java
定义了main
方法,并且启用了@SpringBootApplication
注解,如下所示:
@SpringBootApplication
public class FirstSpringboot3MavenApplication {public static void main(String[] args) {SpringApplication.run(FirstSpringboot3MavenApplication.class, args);}
}
如果你不想使用
@SpringBootApplication
,那么它导入的@EnableAutoConfiguration
和@ComponentScan
注释定义了该行为,因此也可以使用它们。
配置类
Spring Boot支持基于java的配置。虽然可以将SpringApplication
与XML源一起使用,但通常建议你的主配置源是一个@Configuration
类。通常定义main
方法的类是首选的@Configuration
。
导入额外的配置
你不需要把所有的@Configuration
放到一个类中。@Import
注释可用于导入其他配置类。或者你可以使用@ComponentScan
自动扫描所有Spring组件,包括@Configuration
类。
导入XML配置
如果你必须使用基于XML的配置,建议你仍然从@Configuration
类开始。然后可以使用@ImportResource
注释来加载XML配置文件。
自动配置
Spring Boot自动配置尝试基于添加的jar依赖项自动配置Spring应用程序。例如,如果HSQLDB在你的类路径上,并且你没有手动配置任何数据库连接bean,那么Spring Boot会自动配置内存中的数据库。 你需要通过向你的@Configuration
类添加@EnableAutoConfiguration
或@SpringBootApplication
注解来选择自动配置。
你应该只添加一个
@SpringBootApplication
或@EnableAutoConfiguration
注释。通常建议你只将其中一个添加到你的主类@Configuration
中。
逐步替代自动配置
自动配置非侵入性。在任何时候,你都可以开始定义自己的配置,以替换自动配置的特定部分。例如,如果你添加自己的DataSource bean,默认的嵌入式数据库支持就会消失。
如果你需要了解当前应用的自动配置及其原因,请使用–debug开关启动应用程序。这样做将启用一组核心日志记录器的调试日志,并将条件报告记录到控制台。
Positive matches:
-----------------AopAutoConfiguration matched:- @ConditionalOnProperty (spring.aop.auto=true) matched (OnPropertyCondition)AopAutoConfiguration.ClassProxyingConfiguration matched:- @ConditionalOnMissingClass did not find unwanted class 'org.aspectj.weaver.Advice' (OnClassCondition)- @ConditionalOnProperty (spring.aop.proxy-target-class=true) matched (OnPropertyCondition)DispatcherServletAutoConfiguration matched:- @ConditionalOnClass found required class 'org.springframework.web.servlet.DispatcherServlet' (OnClassCondition)- found 'session' scope (OnWebApplicationCondition)
禁用特定的自动配置类
如果你发现你不想要某些特定的自动配置类被应用,你可以使用@SpringBootApplication
的exclude
属性禁用它们。如下所示:
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class FirstSpringboot3MavenApplication {}
如果类不在类路径上,则可以使用注释的excludeName
属性并指定完全限定名。如果你更喜欢使用@EnableAutoConfiguration
而不是@SpringBootApplication
, exclude
和excludeName
也可以使用。最后,您还可以通过使用spring.autoconfigure.exclude
属性来控制要排除的自动配置类列表。
即使自动配置类是
public
,单自动配置类被认为是公共API的唯一方面是类的名称,可用于禁用自动配置。这些类的实际内容,例如嵌套的配置类或bean方法,仅供内部使用,不建议直接使用它们。
Spring Beans 和依赖注入
你可以自由地使用任何标准Spring Framework技术来定义bean
及其注入的依赖项。通常建议使用构造函数注入来连接依赖关系,使用@ComponentScan
来查找bean
。
如果你像上面建议的那样架构你的代码(应用程序主类在根包),你可以在没有任何参数的情况下添加@ComponentScan
,或者使用@SpringBootApplication
注释来隐式地包含它。所有应用程序组件(@Component
、@Service
、@Repository
、@Controller
等)都自动注册为Spring bean。
下面的例子一个OneService Bean
,它使用构造函数注入来获取一个必需的 TwoService Bean
:
@Service
public class OneServiceImpl implements OneService {private final TwoService twoService;public OneServiceImpl(TwoService twoService) {this.twoService = twoService;}}
如果一个bean
有多个构造函数,你需要用@Autowired
标记你想让Spring使用的构造函数:
@Service
public class OneServiceImpl implements OneService {private final TwoService twoService;@Autowiredpublic OneServiceImpl(TwoService twoService) {this.twoService = twoService;}public OneServiceImpl(TwoService twoService, PrintStream printStream) {this.twoService = twoService;}
}
TwoService
构造函数注入被标记成final
,表示后续不能被修改。
@SpringBootApplication
大多数Spring Boot开发者喜欢他们的应用程序使用自动配置、组件扫描,并且能够在“application class”上定义额外的配置。@SpringBootApplication
注解可以启用着三个特性:
@EnableAutoConfiguration
:启用自动配置@ComponentScan
:在应用所在的包上启用@Component扫描@SpringBootConfiguration
:支持在上下文中注册额外的bean或导入额外的配置类。一个Spring标准@Configuration
的替代方案,它可以在集成测试中帮助配置检测。
//相同效果 @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan
@SpringBootApplication
public class MyApplication {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}
这些特性都不是强制性的,你可以选择用它所支持的任何特性来替换这个注解。例如,你可能不想在你的应用程序中使用组件扫描或配置属性扫描:
@SpringBootConfiguration(proxyBeanMethods = false)
@EnableAutoConfiguration
@Import({ SomeConfiguration.class, AnotherConfiguration.class })
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}}
在本例中,MyApplication与其他Spring Boot应用程序一样,只是@Component注解的类和@ConfigurationProperties注解的类不会自动检测到,用户定义的bean会显式导入(SomeConfiguration.class, AnotherConfiguration.class
)。
Spring Boot 3.x 最佳实践相关推荐
- 21. Spring Boot 2.x最佳实践之 HTTPS 集成
Spring Boot 2.x最佳实践之 HTTPS 集成 1. HTTPS 科普篇 1.1 什么是HTTP? 1.2 什么是HTTPS? 1.3 HTTP 和HTTPS 的区别 1.4 HTTPS ...
- Spring Boot 几条最佳实践!
点击上方"朱小厮的博客",选择"设为星标" 回复"1024"获取独家整理的学习资料 Spring Boot是最流行的用于开发微服务的Java ...
- 2022 年学习 Spring Boot 开发的最佳书籍
在我们之前的文章中,我们查看了学习 Java 编程的必读书籍我们在其中探索了一些您可以利用的资源来加快 Java 开发的速度.在此基础上,在用 vanilla Java 编写一段时间后,您将意识到组织 ...
- Spring Boot开发MongoDB应用实践
本文继续上一篇定时任务中提到的邮件服务,简单讲解Spring Boot中如何使用MongoDB进行应用开发. 上文中提到的这个简易邮件系统大致设计思路如下: 1.发送邮件支持同步和异步发送两种 2.邮 ...
- Guava Cache本地缓存在 Spring Boot应用中的实践
概述 在如今高并发的互联网应用中,缓存的地位举足轻重,对提升程序性能帮助不小.而 3.x开始的 Spring也引入了对 Cache的支持,那对于如今发展得如火如荼的 Spring Boot来说自然也是 ...
- Spring Boot 多模块项目实践(附打包方法)
序言:比起传统复杂的单体工程,使用Maven的多模块配置,可以帮助项目划分模块,鼓励重用,防止POM变得过于庞大,方便某个模块的构建,而不用每次都构建整个项目,并且使得针对某个模块的特殊控制更为方便. ...
- Spring Boot学习笔记-Nginx+Jar包部署项目
写在前面 之前用Spring Boot写的获取英雄联盟战绩的小项目,只是上传到了Github上,Github地址:lol-api.一直没时间部署到服务器上.今天,找时间部署好了,网址是:api.51c ...
- spring 2.0核心技术与最佳实践 pdf_推荐 Spring Boot 实践学习案例大全 数据缓存 和中间件 安全权限...
概况 spring boot 实践学习案例 spring boot 初学者及核心技术巩固的最佳实践 目录 『 Spring Boot 2 快速教程 』 Spring Boot 2:WebFlux集成 ...
- mysql 主键 最佳实践_Spring Data Jpa + MySQL IDENTITY 主键下批量插入最佳实践
Spring Data Jpa 虽然可以使用参数调整批量插入,但是仅限于主键策略不是 IDENTITY 的情况下,对于习惯了使用 IDENTITY 的 MySQL 选手来说,批量插入数据直接就悲剧了. ...
最新文章
- 计算机应用基础问卷答题,计算机应用基础调查问卷
- HTML 中的字符实体集
- 6个炫酷又好用的 Python 工具,个个都很奔放呀
- C#设计模式学习资料--原型模式
- AI算法连载16:统计之聚类
- 使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
- oracle中导入,ORACLE数据导入
- sql2005 分页 ROW_NUMBER()
- 微软水下数据中心“浮出水面”、GitHub代码保存在北极,数据黑科技贮藏方式大曝光!...
- android bitmap 获取像素点 太慢_Drawable与 Bitmap 转换总结
- Storm Control
- 国际版(英文版)Skype使用国内卡打电话(转)
- 华为手机热点无法连接_华为手机开热点,连不上怎么破
- 视频教程-JQuery全套视频-jQuery
- EXCEL预览正常,打印却是空白的解决方法之一
- 808通讯协议技术规范消息ID:0x0704数据分析,后附go代码
- 使用docker engine 运行时 集群部署 kubernetes v1.23
- python回调廖雪蜂_廖雪峰Python总结4
- mysql8.0.17数据库的搭建-windows
- 三坐标检测之测头补偿原理
热门文章
- java小案例(适合初学者)-银行系统的存款收款转账等功能代码
- 一图看懂 tomli 模块:一个 TOML解析器、使用 mformat -toc 生成的目录,资料整理+笔记(大全)
- FastDFS - 分布式文件存储系统(文件存储从此无忧)
- jquery的fadeTo方法的淡入淡出轮播图插件
- python做空矩阵_【手把手教你】Python实现基于隐马尔科夫的多空策略
- 全国计算机一级考试理论知识点2019,2019全国计算机一级MsOffice应用基础知识点:字符的编码...
- 《Springboot设计思想》2-Springboot青出于蓝
- windows笔记本命令行方式建立wifi热点
- 职场小故事,工作大道理(16)
- C++:执行第 K 个值和权重的快速计算 N点高斯-勒让德正交规则(附完整源码)