Spring、Spring MVC与Spring Boot框架深度解析
一、框架基础概念与关系
1. Spring框架
核心定位:轻量级的Java EE开发一站式解决方案框架,提供IoC容器和AOP实现。
核心模块:
- Spring Core:IoC容器基础
- Spring Context:应用上下文
- Spring AOP:面向切面编程
- Spring DAO:数据访问抽象
- Spring ORM:对象关系映射集成
- Spring Web:基础Web功能
2. Spring MVC
核心定位:基于Spring的Web MVC框架,实现Model-View-Controller设计模式。
核心组件:
- DispatcherServlet(前端控制器)
- HandlerMapping(处理器映射)
- Controller(处理器)
- ViewResolver(视图解析器)
3. Spring Boot
核心定位:Spring的约定优于配置解决方案,简化配置和部署。
核心特性:
- 自动配置(Auto-Configuration)
- 起步依赖(Starter Dependencies)
- 嵌入式服务器(Embedded Server)
- Actuator(生产级监控)
框架关系图
Spring Framework (基础)
├── Spring MVC (Web层解决方案)
└── Spring Boot (快速开发方案)
二、核心原理透析
1. Spring IoC原理
实现机制:
// 简化的IoC容器实现原理
public class BeanFactory {
private Map<String, Object> beanMap = new HashMap<>();
public Object getBean(String name) {
return beanMap.get(name);
}
public void registerBean(String name, Object bean) {
beanMap.put(name, bean);
}
}
工作流程:
- 解析配置(XML/注解)
- 创建Bean定义
- 实例化Bean
- 依赖注入
- 初始化回调
- 放入容器
2. Spring MVC请求处理流程
1. 用户请求 -> DispatcherServlet
2. 查询HandlerMapping -> 获取Handler
3. 调用HandlerAdapter -> 执行Controller
4. 返回ModelAndView
5. 解析View -> 渲染视图
6. 返回响应
3. Spring Boot自动配置原理
关键注解:
@SpringBootApplication
(复合注解)@EnableAutoConfiguration
(启用自动配置)@ComponentScan
(组件扫描)
实现机制:
// 简化的自动配置原理
@Configuration
@ConditionalOnClass(DataSource.class)
public class DataSourceAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder().build();
}
}
三、框架对比分析
特性 | Spring Framework | Spring MVC | Spring Boot |
---|---|---|---|
定位 | 综合框架 | Web MVC框架 | 快速开发解决方案 |
配置方式 | XML/注解 | XML/注解 | 约定优于配置 |
依赖管理 | 手动管理 | 手动管理 | 起步依赖 |
部署方式 | 需外部容器 | 需外部容器 | 嵌入式容器 |
学习曲线 | 陡峭 | 中等 | 平缓 |
适用场景 | 需要精细控制的场景 | 传统Web应用开发 | 微服务/REST API开发 |
四、实战案例演示
案例1:Spring基础IoC示例
// 1. 定义Bean
@Component
public class UserService {
public String getUser() {
return "Spring User";
}
}
// 2. 配置类
@Configuration
@ComponentScan
public class AppConfig {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
UserService service = ctx.getBean(UserService.class);
System.out.println(service.getUser());
}
}
案例2:Spring MVC控制器示例
@Controller
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public String getUser(@PathVariable Long id, Model model) {
model.addAttribute("user", userService.findById(id));
return "userDetail";
}
}
// 对应配置文件
@Configuration
@EnableWebMvc
@ComponentScan
public class WebConfig implements WebMvcConfigurer {
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
}
案例3:Spring Boot REST API示例
@SpringBootApplication
@RestController
public class DemoApplication {
@GetMapping("/hello")
public String hello() {
return "Hello Spring Boot!";
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
// application.properties
server.port=8081
spring.application.name=demo-app
五、进阶知识扩展
1. Spring Boot自动配置深度
条件注解:
@ConditionalOnClass
:类路径存在时生效@ConditionalOnMissingBean
:容器中不存在Bean时生效@ConditionalOnProperty
:配置属性匹配时生效
自定义Starter:
- 创建
autoconfigure
模块 - 添加
META-INF/spring.factories
- 定义
@Configuration
类 - 添加条件注解
2. Spring MVC异步处理
@GetMapping("/async")
public Callable<String> asyncRequest() {
return () -> {
Thread.sleep(1000);
return "Async Result";
};
}
// 或使用DeferredResult
@GetMapping("/deferred")
public DeferredResult<String> deferredRequest() {
DeferredResult<String> result = new DeferredResult<>();
asyncService.process(result);
return result;
}
3. Spring响应式编程
@SpringBootApplication
public class ReactiveApplication {
@Bean
public RouterFunction<ServerResponse> routes() {
return route(GET("/hello"),
request -> ok().body(Mono.just("Hello Reactive!")));
}
}
六、最佳实践建议
- Spring使用建议:
- 优先使用注解配置
- 合理划分Bean的作用域
- 善用AOP处理横切关注点
- Spring MVC优化:
- 使用RESTful风格设计API
- 合理使用拦截器
- 统一异常处理
- Spring Boot实践:
- 使用Profile管理环境配置
- 合理使用Actuator监控
- 自定义健康检查指标
通过以上对比分析和案例实践,可以清晰理解三个框架的定位差异和技术演进路线:Spring提供基础能力,Spring MVC解决Web层问题,而Spring Boot通过约定和自动配置大幅提升开发效率。