谈谈Spring中的IOC和AOP概念

    IOC和AOP是Spring中的两个核心的概念,下面谈谈对这两个概念的理解。


1. IOC(Inverse of Control):控制反转,也可以称为依赖倒置。

        所谓依赖,从程序的角度看,就是比如A要调用B的方法,那么A就依赖于B,反正A要用到B,则A依赖于B。所谓倒置,你必须理解如果不倒置,会怎么着,因为A必须要有B,才可以调用B,如果不倒置,意思就是A主动获取B的实例:B b = new B(),这就是最简单的获取B实例的方法(当然还有各种设计模式可以帮助你去获得B的实例,比如工厂、Locator等等),然后你就可以调用b对象了。所以,不倒置,意味着A要主动获取B,才能使用B;到了这里,就应该明白了倒置的意思了。倒置就是A要调用B的话,A并不需要主动获取B,而是由其它人自动将B送上门来。
        形象的举例就是:
        通常情况下,假如你有一天在家里口渴了,要喝水,那么你可以到你小区的小卖部去,告诉他们,你需要一瓶水,然后小卖部给你一瓶水!这本来没有太大问题,关键是如果小卖部很远,那么你必须知道:从你家如何到小卖部;小卖部里是否有你需要的水;你还要考虑是否开着车去;等等等等,也许有太多的问题要考虑了。也就是说,为了一瓶水,你还可能需要依赖于车等等这些交通工具或别的工具,问题是不是变得复杂了?那么如何解决这个问题呢?
        解决这个问题的方法很简单:小卖部提供送货上门服务,凡是小卖部的会员,你只要告知小卖部你需要什么,小卖部将主动把货物给你送上门来!这样一来,你只需要做两件事情,你就可以活得更加轻松自在:
        第一:向小卖部注册为会员。
        第二:告诉小卖部你需要什么。

        这和Spring的做法很类似!Spring就是小卖部,你就是A对象,水就是B对象
        第一:在Spring中声明一个类:A
        第二:告诉Spring,A需要B

        假设A是UserAction类,而B是UserService类

<bean id="userService" class="org.leadfar.service.UserService"/>
<bean id="documentService" class="org.leadfar.service.DocumentService"/>
<bean id="orgService" class="org.leadfar.service.OrgService"/>

<bean id="userAction" class="org.leadfar.web.UserAction">
     <property name="userService" ref="userService"/>
</bean>

        在Spring这个商店(工厂)中,有很多对象/服务:userService,documentService,orgService,也有很多会员:userAction等等,声明userAction需要userService即可,Spring将通过你给它提供的通道主动把userService送上门来,因此UserAction的代码示例类似如下所示:

package org.leadfar.web;
public class UserAction{
     private UserService userService;
     public String login(){
          userService.valifyUser(xxx);
     }
     public void setUserService(UserService userService){
          this.userService = userService;
     }
}

         在这段代码里面,你无需自己创建UserService对象(Spring作为背后无形的手,把UserService对象通过你定义的setUserService()方法把它主动送给了你,这就叫依赖注入!),当然咯,我们也可以使用注解来注入。Spring依赖注入的实现技术是:动态代理

2. AOP:即面向切面编程

        面向切面编程的目标就是分离关注点。什么是关注点呢?就是你要做的事,就是关注点。假如你是个公子哥,没啥人生目标,天天就是衣来伸手,饭来张口,整天只知道玩一件事!那么,每天你一睁眼,就光想着吃完饭就去玩(你必须要做的事),但是在玩之前,你还需要穿衣服、穿鞋子、叠好被子、做饭等等等等事情,这些事情就是你的关注点,但是你只想吃饭然后玩,那么怎么办呢?这些事情通通交给别人去干。在你走到饭桌之前,有一个专门的仆人A帮你穿衣服,仆人B帮你穿鞋子,仆人C帮你叠好被子,仆人C帮你做饭,然后你就开始吃饭、去玩(这就是你一天的正事),你干完你的正事之后,回来,然后一系列仆人又开始帮你干这个干那个,然后一天就结束了!

        AOP的好处就是你只需要干你的正事,其它事情别人帮你干。也许有一天,你想裸奔,不想穿衣服,那么你把仆人A解雇就是了!也许有一天,出门之前你还想带点钱,那么你再雇一个仆人D专门帮你干取钱的活!这就是AOP。每个人各司其职,灵活组合,达到一种可配置的、可插拔的程序结构。

        从Spring的角度看,AOP最大的用途就在于提供了事务管理的能力。事务管理就是一个关注点,你的正事就是去访问数据库,而你不想管事务(太烦),所以,Spring在你访问数据库之前,自动帮你开启事务,当你访问数据库结束之后,自动帮你提交/回滚事务!

_____________________________________________________________________________________________________________________________________________________

-----乐于分享,共同进步!

-----更多文章请看:http://blog.csdn.net/eson_15
### AOP IOC概念及其实现 #### 一、AOP(面向切面编程) AOP 是一种编程范式,旨在通过分离横切关注点来提高代码的模块化程度。在 Spring 中,AOP 主要用于处理那些跨越多个类的功能需求,比如日志记录、安全性验证事务管理等[^2]。 - **核心功能** AOP 将这些横切逻辑封装到独立的模块中,称为“切面”。这样可以减少重复代码并增强系统的可维护性。 - **实现机制** Spring 使用代理模式实现了 AOP 功能。对于目标对象,Spring 可以动态地生成一个代理对象,在调用实际方法之前或之后执行额外的操作。这种操作通常被称为“通知”(Advice)。常见的通知类型有前置通知(Before Advice)、后置通知(After Advice)环绕通知(Around Advice)。 - **配置方式** AOP 配置可以通过 XML 或基于注解的方式完成。例如,`@Aspect` 注解定义了一个切面,而 `@Pointcut` 定义了切入点表达式,指定哪些方法需要应用特定的通知[^3]。 ```java import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @Aspect public class LoggingAspect { @Before("execution(* com.example.service.*.*(..))") public void logMethodCall() { System.out.println("Logging method call..."); } } ``` --- #### 二、IOC(控制反转) IOC 是一种设计原则,其主要目的是降低组件间的耦合度。它将对象的创建权交给了容器,而不是由程序员手动实例化对象[^1]。 - **核心思想** 在传统的应用程序中,开发者负责管理初始化所有的依赖项。而在 Spring 中,这一职责被转移到了 IoC 容器上。容器会自动解析依赖并将它们注入到相应的组件中。 - **实现方式** DI(依赖注入)是 IoC 的具体实现形式之一。Spring 提供了多种注入方式,包括构造函数注入、Setter 方法注入以及字段注入。 ```java @Component public class MyService { private final Dependency dependency; // 构造函数注入 public MyService(Dependency dependency) { this.dependency = dependency; } public void performAction() { dependency.execute(); } } @Component class Dependency { public void execute() { System.out.println("Dependency executed."); } } ``` - **优势** 使用 IoC 后,组件之间不再直接相互引用,而是通过接口或者抽象类间接通信。这不仅增强了灵活性,还方便了单元测试。 --- #### 三、AOP IOC 的区别 | 特性 | AOP | IOC | |-----------------|------------------------------------------|-------------------------------------------| | **目的** | 处理横切关注点 | 解决组件间耦合 | | **作用范围** | 跨越多个业务逻辑 | 单个组件及其依赖 | | **实现手段** | 切入点与通知 | 容器管理对象生命周期 | | **典型场景** | 日志记录、性能监控 | 数据库连接池、服务层依赖 | 尽管两者的目标不同,但在实际项目中经常配合使用。例如,利用 AOP 实现统一的日志记录,同时借助 IoC 管理复杂的依赖关系。 ---
评论 56
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值