Spring框架的核心在于控制反转(IoC)和依赖注入(DI)。
一、Spring的核心原理
- 控制反转(IoC)
控制反转是Spring框架的核心概念之一。在传统的Java应用中,对象的创建和依赖关系往往由开发者手动编写,这在大型应用中会导致代码繁杂且难以维护。Spring的IoC容器通过自动管理对象的创建和依赖注入,极大地简化了开发流程。
-
依赖注入(DI):Spring通过构造函数、setter方法或者字段注入的方式,自动将依赖关系注入到对象中。
-
Bean定义:在Spring中,所有的对象都被视为Bean,通过配置文件或者注解来定义Bean及其属性。
**- IOC容器bean生命周期:
1.实例化(Instantiation):IOC容器通过反射或者克隆等方式创建Bean的实例。2.依赖注入(Dependency Injection):IOC容器设置Bean的依赖关系,即注入所需的属性或依赖。
3.初始化(Initialization):如果Bean实现了BeanNameAware, BeanFactoryAware, ApplicationContextAware等接口,IOC容器会调用这些接口的方法。
4.调用预处理器(Post-Processors):如果有Bean后处理器,它们会在初始化之前被调用。
5.执行初始化方法(Initialization callback):如果Bean实现了InitializingBean接口,其afterPropertiesSet方法会被调用。
6.调用自定义的初始化方法:如果在配置文件中定义了init-method属性,指定的方法会被调用。
7.使用Bean(In use by application):Bean现在可以被应用程序使用了。
8.销毁(Destruction):当容器关闭时,如果Bean实现了DisposableBean接口,其destroy方法会被调用。
- 面向切面编程(AOP)
AOP是Spring框架的另一个关键特性,它允许开发者在不修改源代码的情况下,对程序进行横向切割,以实现功能的增强。
Spring AOP 的原理
Spring AOP 的核心原理是通过动态代理机制实现的。当应用启动时,Spring 容器会自动为匹配的 bean 创建代理对象。这些代理对象在运行时对方法调用进行拦截,并插入相应的增强代码。
- JDK 动态代理:如果目标类实现了至少一个接口,Spring AOP 使用 JDK 提供的 Proxy 类和 InvocationHandler 接口来创建代理。
- CGLIB 代理:如果目标类没有实现任何接口,Spring AOP 使用 CGLIB 库来创建代理。
这两种代理方式在运行时都能够动态地为方法调用添加额外的行为。
- 切面(Aspect):它定义了切点(Pointcut)和通知(Advice),用于指定在哪些方法上应用增强功能。
- 切点表达式:通过表达式来指定哪些方法将被拦截。
- 通知类型:包括前置通知、后置通知、环绕通知等,以实现不同类型的方法增强。
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
@Aspect
@Component
public class AuthorizationAspect {
@Pointcut("execution(* com.it.controller.*.*(..))")
public void controllerMethods() {
// 切点定义
}
@Before("controllerMethods()")
public void validateAuthorizationHeader() {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (attributes != null) {
HttpServletRequest request = attributes.getRequest();
String authorizationHeader = request.getHeader("Authorization");
if (authorizationHeader == null || !authorizationHeader.startsWith("Bearer ")) {
throw new RuntimeException("Invalid or missing Authorization header");
}
}
}
}
二、Spring框架的主要模块
Spring框架包含了多个模块,每个模块都专注于不同的功能领域。
- Spring Core:提供了基础的功能,包括IoC和AOP。
- Spring Data:简化了数据访问层的开发,支持多种数据源。
- Spring MVC:用于构建Web应用程序,提供了请求映射、视图解析等功能。
- Spring Boot:自动化配置和部署,使得创建独立运行的Spring应用更加便捷。
- Spring Cloud:用于构建分布式系统,包括服务发现、配置中心、负载均衡等。
Spring中事务管理支持哪几种方式**
编程式事务管理
编程式事务管理允许开发者通过编码的方式手动控制事务的边界,提供了两种方式:
- 使用TransactionTemplate
声明式事务管理
声明式事务管理允许开发者通过声明的方式管理事务,无需编写事务管理的代码,支持以下几种方式:
- 使用@Transactional注解
通过在方法或类上添加@Transactional注解来声明事务边界。