当前位置: 首页 > news >正文

Spring Boot开发最佳实践速览

这段内容是来自 Spring Boot 官方文档 的一部分,主要介绍了 Spring Boot 项目中关于代码结构、配置类、自动配置、Bean 管理与依赖注入、主类注解、运行方式等核心开发实践。下面我将用通俗易懂的方式,逐段为你解析这些内容的含义和实际意义。


📚 总体理解

Spring Boot 的设计目标是让开发者能快速搭建 Spring 应用,减少繁琐的 XML 配置。它通过“约定优于配置”(convention over configuration)的理念,提供了一套最佳实践。你看到的这些章节,就是在告诉你:

如何组织你的代码结构?怎么写主类?怎么使用自动配置?怎么运行应用?

下面我们来一步步拆解。


4.2 结构你的代码(Structuring Your Code)

4.2.1 不要使用“默认包”(Using the “default” Package)

  • 问题:如果你的 Java 类没有写 package com.xxx;,那就是在“默认包”里。
  • 为什么不好?
    • Spring Boot 常用 @ComponentScan 来扫描所有组件(如 @Service, @Controller)。
    • 如果你在默认包里,Spring 会去扫描整个 classpath 下所有 jar 包里的类,非常慢且容易出错。
  • 建议做法
    package com.example.yourproject;
    
    使用反向域名命名法(比如你的公司是 example.com,就用 com.example 开头)。

4.2.2 主应用类的位置(Locating the Main Application Class)

  • 主类通常是带有 public static void main(String[] args) 方法的那个类。
  • 建议:把这个主类放在根包下,其他模块(如 customer、order)作为子包。
示例结构:
com.example.myapplication
├── Application.java            <-- 主类,在最外层
├── customer
│   ├── Customer.java
│   ├── CustomerController.java
│   └── ...
└── order├── Order.java└── ...
主类代码示例:
@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
为什么这样设计?
  • @SpringBootApplication 会以这个类所在的包为基准包进行扫描。
    • 比如上面例子中,Spring 会自动扫描 com.example.myapplication 及其子包下的所有组件。
  • 如果主类放在某个子包里(比如 com.example.myapplication.customer),那它只会扫描 customer 包下的内容,可能漏掉 order 包!

🔔 所以:主类放根包,确保扫描完整!


4.3 配置类(Configuration Classes)

Spring Boot 推荐使用 Java 注解方式配置,而不是传统的 XML。

✅ 推荐:

@Configuration
public class MyConfig {@Beanpublic MyService myService() {return new MyServiceImpl();}
}

❌ 不推荐(虽然可用):

<bean id="myService" class="com.example.MyServiceImpl"/>

小技巧:

  • 通常把主类也标记为 @Configuration,这样可以在里面定义一些额外的 Bean。
  • 或者干脆用 @SpringBootApplication(它本身就包含了 @Configuration)。

4.3.1 引入其他配置类

你可以把配置分散到多个类中,然后用:

@Import(DataSourceConfig.class)
@SpringBootApplication
public class Application { ... }

或者更常见的是使用 @ComponentScan,自动发现所有带 @Configuration 的类。


4.3.2 使用 XML 配置(不推荐但支持)

如果你必须用 XML(比如老系统迁移),可以这样做:

@SpringBootApplication
@ImportResource("classpath:applicationContext.xml")
public class Application { ... }

⚠️ 仅建议过渡期使用,新项目尽量用 Java Config。


4.4 自动配置(Auto-configuration)

这是 Spring Boot 的核心功能之一!

🌟 核心思想:

根据你引入的依赖(jar 包),自动帮你配置好相应的组件。

举个例子:

  • 你加了 H2 或 HSQLDB 的依赖 → Spring Boot 自动配置一个内存数据库。
  • 你加了 Spring Data JPA → 自动配置 EntityManager、事务管理器等。
  • 你加了 Spring MVC → 自动配置 DispatcherServlet、视图解析器等。

如何启用自动配置?

只需要在主类上加:

@EnableAutoConfiguration
// 或更常用的
@SpringBootApplication // 它包含了上面这个注解

💡 注意:整个项目只能有一个 @SpringBootApplication@EnableAutoConfiguration


4.4.1 逐步替换自动配置

自动配置不是“强制”的,它是“可覆盖”的。

举个例子:
  • Spring Boot 发现你没配数据源 → 自动创建一个内存数据库。
  • 但如果你自己写了:
    @Bean
    public DataSource dataSource() {return new HikariDataSource(...);
    }
    
    → 那么 Spring Boot 就不会自动配置数据源了!

✅ 这叫“条件化自动配置”:只有在没有用户定义 Bean 时才生效。

调试自动配置:

启动时加上 --debug 参数:

java -jar myapp.jar --debug

会输出一份“条件报告”,告诉你哪些自动配置生效了、哪些没生效、为什么。


4.4.2 禁用某些自动配置

有时候你不想要某个自动配置(比如不想连数据库),可以排除:

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

也可以排除多个:

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,RedisAutoConfiguration.class
})

或者通过配置文件禁用:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

🔔 注意:自动配置类的名字是公开的 API,但里面的内部类/方法不要直接调用,属于内部实现。


4.5 Bean 和依赖注入(Beans & Dependency Injection)

Spring 的核心就是 IoC(控制反转)和 DI(依赖注入)。

推荐做法:

  • @ComponentScan 扫描组件。
  • @Autowired 实现依赖注入。

示例:

@Service
public class DatabaseAccountService implements AccountService {private final RiskAssessor riskAssessor;@Autowiredpublic DatabaseAccountService(RiskAssessor riskAssessor) {this.riskAssessor = riskAssessor;}
}

更简洁写法(推荐):

如果类只有一个构造函数,@Autowired 可省略:

@Service
public class DatabaseAccountService implements AccountService {private final RiskAssessor riskAssessor;public DatabaseAccountService(RiskAssessor riskAssessor) {this.riskAssessor = riskAssessor;}
}

✅ 好处:字段可以用 final,保证不可变,线程安全,代码更健壮。


4.6 @SpringBootApplication 注解详解

这个注解是“三合一”神器:

@SpringBootApplication

等价于:

@Configuration
@EnableAutoConfiguration
@ComponentScan

三个作用分别是:

注解功能
@Configuration表示这是一个配置类,可以定义 Bean
@EnableAutoConfiguration启用自动配置
@ComponentScan扫描当前包及其子包下的组件

你也可以不用 @SpringBootApplication

如果你不想用自动扫描或自动配置,可以手动拆开写:

@Configuration(proxyBeanMethods = false)
@EnableAutoConfiguration
@Import({MyConfig.class, MyAnotherConfig.class})
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

这样更灵活,但也更复杂。一般项目直接用 @SpringBootApplication 就够了。


4.7 运行你的应用(Running Your Application)

Spring Boot 应用打包成 jar 后,自带嵌入式服务器(如 Tomcat),可以直接运行。

4.7.1 在 IDE 中运行

  • 直接右键运行 main 方法即可。
  • Eclipse / IntelliJ IDEA 都支持。
  • ⚠️ 注意:不要重复运行,否则端口冲突(“Port already in use”)。

4.7.2 打包后运行

使用 Maven 构建后:

java -jar target/myapp-0.0.1-SNAPSHOT.jar
开启远程调试:
java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n \-jar target/myapp.jar

然后可以用 IDE 远程连接调试(适合部署环境排查问题)。


4.7.3 使用 Maven 插件运行

mvn spring-boot:run

好处:不用打包,直接运行源码,适合开发阶段。

可以设置 JVM 内存:

export MAVEN_OPTS=-Xmx1024m
mvn spring-boot:run

4.7.4 使用 Gradle 插件运行

gradle bootRun

同样支持:

export JAVA_OPTS=-Xmx1024m
gradle bootRun

4.7.5 热交换(Hot Swapping)

开发时修改代码不想重启?

方案一:JVM 热替换(HotSwap)
  • 修改方法体内容 → 可以生效。
  • 但不能添加字段、方法、类 → 不行。
方案二:JRebel(商业工具)
  • 支持几乎所有的代码变更热更新。
  • 效率极高,但收费。
方案三:Spring Boot Devtools(推荐!)

添加依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope>
</dependency>

功能包括:

  • 修改代码后自动重启应用(很快,因为只加载变了的类)。
  • 浏览器自动刷新(配合 LiveReload 插件)。
  • 禁用模板缓存,便于前端调试。

✅ 开发阶段强烈建议加上 spring-boot-devtools


✅ 总结:你应该记住的关键点

主题最佳实践
包结构主类放在根包,如 com.example.demo
主类使用 @SpringBootApplication,包含 main 方法
配置优先使用 Java Config,避免 XML
自动配置默认开启,可通过 exclude 关闭不需要的
Bean 注入推荐构造器注入(无需 @Autowired
运行方式IDE 直接运行 / java -jar / mvn spring-boot:run
开发效率spring-boot-devtools 实现热重启

如果你想动手实践,我可以帮你生成一个符合这些规范的 Spring Boot 项目结构模板。需要吗?

http://www.dtcms.com/a/491946.html

相关文章:

  • C程序结构
  • 大型商城网站建设方案品牌网站建设小蝌蚪a
  • 【系统分析师】写作框架:软件系统测试及其应用
  • 壹搜网站建设优化排名做网站如何躲过网警
  • 南京协会网站建设怎么做彩票平台网站吗
  • 请人做网站收费多少设计工作室装修
  • 【图像大模型】ms-swift 深度解析:一站式多模态大模型微调与部署框架的全流程使用指南
  • 基于Java适配民营及公立一二级医院His系统,支持单体医院、集团化运营及区域医疗协同
  • Python3编程之python基础
  • YOLOv1 与 YOLOv2 学习总结
  • 进程优先级、环境变量、进程地址空间
  • d42:MyBatisPlus逻辑删除,枚举处理器,JSON处理器,分页插件
  • 安徽和县住房城乡建设局网站佛山电商网站制作团队
  • 网站备案 失败批量建wordpress
  • asp做的药店网站模板成都响应式网站建设
  • Python异步IO——协程
  • QML学习笔记(四十)QML的ApplicationWindow和StackView
  • Linux学习笔记--Pinctrl子系统示例
  • 安徽网站建设seo优化如何用asp做网站的登录界面
  • wordpress网站页脚网站进行中英文转换怎么做
  • RFSOC27DR+VU13P 6U VPX板卡
  • 多门店同城配送上新!Tigshop 开源商城系统JAVA5.4.0版本正式发布!
  • 域名访问过程会不会影响网站访问国外 设计师 网站
  • 温州外贸网站设计wordpress简介怎么改
  • css`text-wrap:pretty`
  • RHCA作业
  • 网站建设申请前端网站效果有哪些
  • 小林coding|计算机网络
  • 2025年--Lc193-139. 单词拆分(动态规划在字符串的应用)--Java版
  • 做网站公重庆永川网站建设