Spring和Spring Boot是Java生态广泛使用的两个框架,它们之间有密切的关系,但也有明显的区别
一、定位和目标
- Spring
- Spring是一个轻量级的、模块化的Java开发框架,旨在简化企业级应用开发
- 它提供了全面的基础设施支持,包括依赖注入(DI)、面向切面编程(AOP)、事务管理、数据访问、Web开发等
- Spring的核心思想是“约定大于配置”,但开发者需要手动配置很多内容
- Spring Boot
- Spring Boot是Spring的扩展,旨在简化Spring应用的开发和部署
- 它通过自动配置和约定大于配置的原则,减少了开发者的配置工作量
- Spring Boot的目标是快速创建独立的、生产级别的Spring应用
二、项目初始化
Spring项目初始化
- 需要手动创建Maven/Gradle项目
- 手动添加Spring相关依赖(如spring-core、spring-web、spring-mvc等)
- 需要配置web.xml和DispatcherServlet
示例:SpringMVC项目初始化
1、web.xml配置:
<web-app>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
2、applicationContext.xml配置
<beans>
<context:component-scan base-package="com.example" />
<mvc:annotation-driven />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
3、Maven依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.20</version>
</dependency>
Spring Boot项目初始化
- 使用 Srping Initializr快速生成项目
- 自动配置依赖和项目结构
- 无需配置web.xml和DispatcherServlet
1、使用Spring Initializr
- 选择依赖(如Spring Web、Spring Data JPA)
- 下载生成的项目
2、Maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
3、主类
@SpringBootApplication
public class MyApp {
public static void main(String[] args) {
SpringApplication.run(MyApp.class, args);
}
}
三、配置方式
Spring
- 需要大量的XML配置或Java注解配置
- 开发者需要手动配置数据源、事务管理器、视图解析器等
- 配置复杂,适合对Spring有深入理解的开发者
1、XML配置
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mydb" />
<property name="username" value="root" />
<property name="password" value="password" />
</bean>
2、Java注解配置
@Configuration
public class AppConfig {
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
dataSource.setUsername("root");
dataSource.setPassword("password");
return dataSource;
}
}
3、数据源、事务管理、视图解析器
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--配置数据源-->
<property name="dataSource" ref="dynamicDataSource" />
</bean>
<!--配置事务-->
<tx:advice id="txAdvice">
<tx:attributes>
<!--如果是查询的方式配置为只读状态的事务,提高效率-->
<tx:method name="get*" read-only="true" propagation="SUPPORTS" rollback-for="Exception" />
<tx:method name="find*" read-only="true" propagation="SUPPORTS" rollback-for="Exception"/>
<tx:method name="query*" read-only="true" propagation="SUPPORTS" rollback-for="Exception"/>
<tx:method name="select*" read-only="true" propagation="SUPPORTS" rollback-for="Exception"/>
<tx:method name="*" />
</tx:attributes>
</tx:advice>
上面是一个配置事务的方式,总之spring阶段什么都要自己配
Spring Boot
- 采用”约定大于配置“的原则,提供了大量的默认配置
- 通过自动配置(Auto-Configuration)机制,减少了手动配置的工作量
- 支持基于application.properties或application.yml的外部配置
1、application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
2、自动配置
Spring Boot 会根据配置文件自动创建 DataSource Bean。
四、依赖管理
Spring
- 需要手动管理依赖库的版本,可能会遇到依赖冲突问题
- 开发者需要显式映引入所需的Spring模块(如Spring-core、Spring-web等)
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.20</version>
</dependency>
Spring Boot
- 提供了Spring-boot-stater系列依赖,简化了依赖管理
- 提供了Spring-boot-starter-web、Spring-boot-starter-data-jpa等starter,可以快速引入常用功能
- 自动解决依赖冲突问题
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
(这里比较经典的就是starter是什么?怎么去手写一个starter?)
五、内嵌服务器
Spring
- 需要手动配置外部服务器(如Tomcat、jetty)
- 部署时需要将应用打包成WAR文件并部署到服务器中
spring打包
<packaging>war</packaging>
Spring Boot
- 内嵌了Tomcat、jetty或Undertow服务器,无需额外配置
- 可以直接将应用打包成可执行的JAR文件,通过java -jar命令运行
Spring Boot打包
<packaging>jar</packaging>
运行应用
java -jar myapp.jar
六、监控和管理
Spring
- 需要手动集成监控和管理功能(如Spring Actuator)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Spring Boot
- 内置了Spring Actuator,提供了开箱即用的监控和管理功能
- 可以轻松查看应用的健康状态、性能指标等信息
management.endpoints.web.exposure.include=*
访问端点:
http://localhost:8080/actuator/health
七、开发效率
Spring
- 开发效率较低,需要编写大量的配置代码
- 适合需要高度定制化的场景
Spring Boot
- 开发效率高,通过自动配置和Starter依赖,快速构建应用
- 适合快速原型开发和微服务架构
总结
特性 | Spring | Spring Boot |
---|---|---|
项目初始化 | 手动配置 | 使用 Spring Initializr 快速生成 |
配置方式 | XML 或 Java 配置 | 自动配置 + 外部化配置 |
Web 开发 | 手动配置 DispatcherServlet | 自动配置 DispatcherServlet |
内嵌服务器 | 需要外部服务器 | 内嵌服务器 |
依赖管理 | 手动管理 | Starter 依赖 + 自动依赖管理 |
监控和管理 | 需要手动集成 Actuator | 内置 Actuator |
Spring Boot
是 Spring
的进一步封装和优化,适合快速开发和现代应用架构。如果你需要快速构建应用,推荐使用 Spring Boot
;如果你需要高度定制化,可以选择 Spring
。