地基Spring框架中的​​IOC 、AOP ​​ 和 ​​DI

在 Spring 框架中,​​IOC(控制反转)、AOP(面向切面编程)​​ 和 ​​DI(依赖注入)​​ 是三个核心概念,它们解决的问题和实现方式不同,但共同构成了 Spring 的基石。以下是它们的区别和联系:


​1. IOC(控制反转,Inversion of Control)​

  • ​定义​​:一种设计模式,将对象的创建、生命周期管理和依赖关系的控制权从应用程序代码转移到框架(容器)中。
  • ​目的​​:解耦代码,避免硬编码依赖,让代码更灵活、可维护。
  • ​实现方式​​:通过 ​​IOC 容器​​(如 ApplicationContext)管理 Bean。
  • ​关键点​​:
    • ​谁控制谁​​:框架(容器)控制对象的创建和依赖关系,而不是开发者手动 new 对象。
    • ​解决了什么问题​​:对象之间的紧耦合问题。

​2. DI(依赖注入,Dependency Injection)​

  • ​定义​​:​​DI 是 IOC 的一种具体实现方式​​,通过外部(容器)将依赖对象注入到目标对象中。
  • ​目的​​:实现对象之间的解耦,让依赖关系由容器动态配置。
  • ​实现方式​​:
    • ​构造函数注入​​:通过构造方法传递依赖。
    • ​Setter 注入​​:通过 Setter 方法传递依赖。
    • ​字段注入​​:直接通过 @Autowired 注解注入字段(不推荐)。
  • ​关键点​​:
    • ​依赖关系由容器管理​​,而不是在代码中硬编码。
    • ​DI 是 IOC 的子集​​:IOC 是一个更广泛的概念,DI 是实现 IOC 的手段。

​3. AOP(面向切面编程,Aspect-Oriented Programming)​

  • ​定义​​:一种编程范式,通过横向切割关注点(如日志、事务、权限),将通用功能从业务代码中分离出来。
  • ​目的​​:解决代码重复和横切关注点(Cross-Cutting Concerns)的问题。
  • ​实现方式​​:
    • ​动态代理​​:Spring AOP 使用 JDK 动态代理或 CGLIB 生成代理对象。
    • ​切面(Aspect)​​:通过 @Aspect 注解定义切面类。
    • ​通知(Advice)​​:定义在切入点(如方法执行前、后)执行的逻辑(如 @Before@After@Around)。
  • ​关键点​​:
    • ​与 IOC 的关系​​:AOP 依赖 IOC 容器管理代理对象。
    • ​解决了什么问题​​:业务逻辑与非功能性代码(如日志、事务)的耦合问题。

​三者的区别总结​

​概念​​核心思想​​解决的问题​​实现方式​​相互关系​
​IOC​控制权反转给容器对象创建和依赖管理的耦合通过容器管理 BeanDI 是 IOC 的具体实现方式
​DI​依赖由外部注入对象间的直接依赖硬编码构造函数、Setter、字段注入依赖 IOC 容器实现
​AOP​横向切割关注点代码重复和横切逻辑耦合动态代理和切面编程依赖 IOC 管理代理对象,与 DI 互补

​协同工作示例​

假设有一个用户服务类 UserService

  1. ​IOC 容器​​负责创建 UserService 实例。
  2. ​DI​​ 将 UserRepository 依赖注入到 UserService 中。
  3. ​AOP​​ 在 UserService 的方法执行前后添加事务管理和日志记录。
@Service
public class UserService {
    private final UserRepository userRepository;

    // DI 通过构造函数注入
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    // AOP 会在此方法执行前后添加事务和日志
    @Transactional
    public void saveUser(User user) {
        userRepository.save(user);
    }
}

​总结​

  • ​IOC​​ 是设计模式,​​DI​​ 是实现 IOC 的手段,​​AOP​​ 是解耦横切逻辑的工具。
  • ​IOC/DI​​ 管理对象及其依赖关系,​​AOP​​ 管理横切关注点。
  • 三者共同协作,使 Spring 成为一个灵活、可扩展的框架。

扩展:

1、 地基spring注解部分一-CSDN博客

(望各位潘安、各位子健/各位彦祖、于晏不吝赐教!多多指正!🙏)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值