Spring IOC 和 AOP

Spring IoC

IoC(Inverse of Control:控制反转) 是一种设计思想,而不是一个具体的技术实现。IoC 的思想就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。不过, IoC 并非 Spirng 特有,在其他语言中也有应用。

为什么叫控制反转?

  • 控制 :指的是对象创建(实例化、管理)的权力
  • 反转 :控制权交给外部环境(Spring 框架、IoC 容器)

将对象之间的相互依赖关系交给 IoC 容器来管理,并由 IoC 容器完成对象的注入。这样可以很大程度上简化应用的开发,把应用从复杂的依赖关系中解放出来。 IoC 容器就像是一个工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。

在实际项目中一个 Service 类可能依赖了很多其他的类,假如我们需要实例化这个 Service,你可能要每次都要搞清这个 Service 所有底层类的构造函数,这可能会把人逼疯。如果利用 IoC 的话,你只需要配置好,然后在需要的地方引用就行了,这大大增加了项目的可维护性且降低了开发难度。

在 Spring 中, IoC 容器是 Spring 用来实现 IoC 的载体, IoC 容器实际上就是个 Map(key,value),Map 中存放的是各种对象。

Spring 时代我们一般通过 XML 文件来配置 Bean,后来开发人员觉得 XML 文件来配置不太好,于是 SpringBoot 注解配置就慢慢开始流行起来。

 AOP 

AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。

Spring AOP 就是基于动态代理的,如果要代理的对象,实现了某个接口,那么 Spring AOP 会使用 JDK Proxy,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候 Spring AOP 会使用 Cglib 生成一个被代理对象的子类来作为代理,如下图所示:

当然你也可以使用 AspectJ !Spring AOP 已经集成了 AspectJ ,AspectJ 应该算的上是 Java 生态系统中最完整的 AOP 框架了。

Spring AOP 和 AspectJ AOP 有什么区别?

Spring AOP 属于运行时增强,而 AspectJ 是编译时增强。 Spring AOP 基于代理(Proxying),而 AspectJ 基于字节码操作(Bytecode Manipulation)。

Spring AOP 已经集成了 AspectJ ,AspectJ 应该算的上是 Java 生态系统中最完整的 AOP 框架了。AspectJ 相比于 Spring AOP 功能更加强大,但是 Spring AOP 相对来说更简单,

如果我们的切面比较少,那么两者性能差异不大。但是,当切面太多的话,最好选择 AspectJ ,它比 Spring AOP 快很多。

### Spring IOC 原理 Spring IOC(Inversion of Control,控制反转)是一种设计模式,用于降低组件间的耦合度并提高系统的可扩展性。其实现主要基于依赖注入(Dependency Injection, DI),即由容器负责创建对象并将这些对象所需的依赖项传递给它们[^1]。 #### 核心概念 - **IOC 容器**:Spring 使用 IOC 容器来管理 Bean 的生命周期配置。容器的核心职责是实例化、配置以及组装对象。 - **BeanFactory**:这是最基础的容器接口,提供了框架级别的基础设施支持[^4]。 - **ApplicationContext**:这是一个更高级别的容器,面向开发者应用,具有更多的企业级功能,比如事件传播机制支持国际化资源绑定。 #### 实现细节 - **Java 反射**:通过 Java 反射 API 创建类的实例,并调用方法设置属性值。 - **依赖注入**:可以通过构造函数注入、Setter 方法注入或者字段注入等方式完成依赖关系的建立[^3]。 ```java // 构造函数注入示例 public class UserService { private final UserRepository userRepository; public UserService(UserRepository userRepository) { this.userRepository = userRepository; } } ``` --- ### Spring AOP 原理 Spring AOP(Aspect-Oriented Programming,面向切面编程)允许开发者将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来。它通过代理的方式实现了这一点,在运行时动态地拦截目标方法并执行附加的功能[^5]。 #### 核心概念 - **连接点(Join Point)**:程序执行过程中的某个特定位置,例如方法调用或异常抛出。 - **通知(Advice)**:定义了在连接点处要执行的操作,分为前置通知、后置通知、环绕通知等。 - **切入点(Pointcut)**:指定一组连接点,通常通过正则表达式匹配方法名或其他条件。 - **切面(Aspect)**:将通知切入点组合在一起形成的一个模块化的单元。 #### 实现方式 - **JDK 动态代理**:适用于实现了一个或多个接口的目标对象。利用 `Proxy` 类生成代理对象,并在其上调用方法时触发相应的 Advice。 - **CGLIB 字节码增强**:当目标类未实现任何接口时使用 CGLIB 库生成子类以覆盖父类的方法实现。 ```java @Aspect @Component public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logMethodEntry(JoinPoint joinPoint) { System.out.println("Entering method: " + joinPoint.getSignature().getName()); } @AfterReturning(pointcut = "execution(* com.example.service.*.*(..))", returning = "result") public void logMethodExit(Object result) { System.out.println("Exiting with result: " + result); } } ``` --- ### 总结 Spring IOC AOP 是现代 Java 开发的重要组成部分。IOC 提供了一种优雅的方式来管理复杂的应用程序结构;而 AOP 则帮助我们处理那些跨越多层业务逻辑但仍需保持独立性的通用需求。两者共同作用下使得代码更加清晰易读且易于维护[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值