Spring Boot 3.x 最佳实践

Spring Boot不需要任何特定的代码布局。然而有一些最佳实践可以提供帮助。

代码结构

  1. 使用默认的包
    当一个类没有包含包声明时,它会默认在"default package"中。通常不建议使用“default package”,应该避免使用。它可能会导致Spring Boot应用程序使用@ComponentScan, @ConfigurationPropertiesScan, @EntityScan, 或者 @SpringBootApplication 注解时,读取每个jar中的每个类。

  2. 定位应用程序主类
    通常建议将主应用程序类放在根包中。@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)

禁用特定的自动配置类

如果你发现你不想要某些特定的自动配置类被应用,你可以使用@SpringBootApplicationexclude属性禁用它们。如下所示:

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class FirstSpringboot3MavenApplication {}

如果类不在类路径上,则可以使用注释的excludeName属性并指定完全限定名。如果你更喜欢使用@EnableAutoConfiguration而不是@SpringBootApplication, excludeexcludeName也可以使用。最后,您还可以通过使用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注解可以启用着三个特性:

  1. @EnableAutoConfiguration:启用自动配置
  2. @ComponentScan:在应用所在的包上启用@Component扫描
  3. @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 最佳实践相关推荐

  1. 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 ...

  2. Spring Boot 几条最佳实践!

    点击上方"朱小厮的博客",选择"设为星标" 回复"1024"获取独家整理的学习资料 Spring Boot是最流行的用于开发微服务的Java ...

  3. 2022 年学习 Spring Boot 开发的最佳书籍

    在我们之前的文章中,我们查看了学习 Java 编程的必读书籍我们在其中探索了一些您可以利用的资源来加快 Java 开发的速度.在此基础上,在用 vanilla Java 编写一段时间后,您将意识到组织 ...

  4. Spring Boot开发MongoDB应用实践

    本文继续上一篇定时任务中提到的邮件服务,简单讲解Spring Boot中如何使用MongoDB进行应用开发. 上文中提到的这个简易邮件系统大致设计思路如下: 1.发送邮件支持同步和异步发送两种 2.邮 ...

  5. Guava Cache本地缓存在 Spring Boot应用中的实践

    概述 在如今高并发的互联网应用中,缓存的地位举足轻重,对提升程序性能帮助不小.而 3.x开始的 Spring也引入了对 Cache的支持,那对于如今发展得如火如荼的 Spring Boot来说自然也是 ...

  6. Spring Boot 多模块项目实践(附打包方法)

    序言:比起传统复杂的单体工程,使用Maven的多模块配置,可以帮助项目划分模块,鼓励重用,防止POM变得过于庞大,方便某个模块的构建,而不用每次都构建整个项目,并且使得针对某个模块的特殊控制更为方便. ...

  7. Spring Boot学习笔记-Nginx+Jar包部署项目

    写在前面 之前用Spring Boot写的获取英雄联盟战绩的小项目,只是上传到了Github上,Github地址:lol-api.一直没时间部署到服务器上.今天,找时间部署好了,网址是:api.51c ...

  8. spring 2.0核心技术与最佳实践 pdf_推荐 Spring Boot 实践学习案例大全 数据缓存 和中间件 安全权限...

    概况 spring boot 实践学习案例 spring boot 初学者及核心技术巩固的最佳实践 目录 『 Spring Boot 2 快速教程 』 Spring Boot 2:WebFlux集成 ...

  9. mysql 主键 最佳实践_Spring Data Jpa + MySQL IDENTITY 主键下批量插入最佳实践

    Spring Data Jpa 虽然可以使用参数调整批量插入,但是仅限于主键策略不是 IDENTITY 的情况下,对于习惯了使用 IDENTITY 的 MySQL 选手来说,批量插入数据直接就悲剧了. ...

最新文章

  1. 计算机应用基础问卷答题,计算机应用基础调查问卷
  2. HTML 中的字符实体集
  3. 6个炫酷又好用的 Python 工具,个个都很奔放呀
  4. C#设计模式学习资料--原型模式
  5. AI算法连载16:统计之聚类
  6. 使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
  7. oracle中导入,ORACLE数据导入
  8. sql2005 分页 ROW_NUMBER()
  9. 微软水下数据中心“浮出水面”、GitHub代码保存在北极,数据黑科技贮藏方式大曝光!...
  10. android bitmap 获取像素点 太慢_Drawable与 Bitmap 转换总结
  11. Storm Control
  12. 国际版(英文版)Skype使用国内卡打电话(转)
  13. 华为手机热点无法连接_华为手机开热点,连不上怎么破
  14. 视频教程-JQuery全套视频-jQuery
  15. EXCEL预览正常,打印却是空白的解决方法之一
  16. 808通讯协议技术规范消息ID:0x0704数据分析,后附go代码
  17. 使用docker engine 运行时 集群部署 kubernetes v1.23
  18. python回调廖雪蜂_廖雪峰Python总结4
  19. mysql8.0.17数据库的搭建-windows
  20. 三坐标检测之测头补偿原理

热门文章

  1. java小案例(适合初学者)-银行系统的存款收款转账等功能代码
  2. 一图看懂 tomli 模块:一个 TOML解析器、使用 mformat -toc 生成的目录,资料整理+笔记(大全)
  3. FastDFS - 分布式文件存储系统(文件存储从此无忧)
  4. jquery的fadeTo方法的淡入淡出轮播图插件
  5. python做空矩阵_【手把手教你】Python实现基于隐马尔科夫的多空策略
  6. 全国计算机一级考试理论知识点2019,2019全国计算机一级MsOffice应用基础知识点:字符的编码...
  7. 《Springboot设计思想》2-Springboot青出于蓝
  8. windows笔记本命令行方式建立wifi热点
  9. 职场小故事,工作大道理(16)
  10. C++:执行第 K 个值和权重的快速计算 N点高斯-勒让德正交规则(附完整源码)