AOP(Aspect-Oriented Programming, 面向切面编程): 是一种新的方法论, 是对传统 OOP(Object-Oriented Programming, 面向对象编程) 的补充。
AOP 的主要编程对象是切面(aspect), 而切面是把横切关注点模块化!
在应用 AOP 编程时, 需要定义公共功能, 但可以明确的定义这个功能在哪里应用, 并且不必修改需要使用公共功能的类。 这样以来横切关注点就被模块化到特殊的对象(切面)里.
每个事物逻辑位于一个位置, 代码不分散, 便于维护和升级
业务模块更简洁, 只包含核心业务代码。
连接点描述的是程序执行的某个特定位置。如一个类的初始化前、初始化后,或者类的某个方法调用前、调用后、方法抛出异常后等等。一个类或一段程序代码拥有一些具有边界性质的特定点,这些特定点就称为连接点。连接点用来定义在目标程序的哪里通过AOP加入新的逻辑。
Spring仅支持方法的连接点,即仅能在方法调用前、方法调用后、方法抛出异常时以及方法调用前后这些程序执行点织入增强。
连接点由两个信息确定:第一是用方法表示的程序执行点;第二是用相对点表示的方位。
执行点:即程序执行流程中的某个点。如执行某个语句或者语句块、执行某个方法、装载某个类、抛出某个异常……
例如 :UserService#add() 方法执行之前,这个连接点。执行点为 UserService#add()方法本身; 方位为该方法执行前的位置。
切入点是一个连接点的过滤条件,AOP 通过切点定位到特定的连接点。每个类都拥有多个连接点:例如 UserService类中的所有方法实际上都是连接点,即连接点是程序类中客观存在的事物。类比:连接点相当于数据库中的记录,切点相当于查询条件。切点和连接点不是一对一的关系,一个切点匹配多个连接点,切点通过 org.springframework.aop.Pointcut 接口进行描述,它使用类和方法作为连接点的查询条件。
xml配置方式:
<aop:config>
<aop:pointcut id="myPointcut" expression="execution(* com.kaka.spring.aop.aspect.service.UserService.*(..))"/>
aop:config>
切面在某个具体的连接点采取的行为或行动,称为通知。切面的核心逻辑代码都写在通知中,有人也称之为增强或者横切关注点。通知是切面功能的具体实现,通常是业务代码以外的需求,如日志、验证等,这些被模块化的特殊对象。
常用的通知接口有
xml配置方式
<bean id="myMethodBeforeAdvice" class="com.kaka.spring.aop.advice.MyMethodBeforeAdvice"/>
<aop:config>
<aop:pointcut id="myPointcut" expression="execution(* com.kaka.spring.aop.aspect.service.UserService.*(..))"/>
<aop:advisor advice-ref="myMethodBeforeAdvice" pointcut-ref="myPointcut" />
aop:config>
MyMethodBeforeAdvice这个类,实现了MethodBeforeAdvice前置通知接口。
通知器由一个切入点(pointcut)和一个通知(Advice)组成。通知就是增强的那部分功能代码,如记录日志代码、控制权限代码。
<aop:advisor advice-ref="myMethodBeforeAdvice" pointcut-ref="myPointcut" />
与通知器(advisor)类似都是通知+切入点。区别在于,切面中的类无需实现通知接口,但需要在配置文件中指定类中的方法名;而通知器仅需指定类名即可,因为通知器中的类都实现了通知接口,很明确的知道通知方法是哪个。
xml配置方式
<bean id="myXmlAspect" class="com.kaka.spring.aop.aspect.MyXmlAspect"/>
<aop:config>
<aop:pointcut id="myPointcut" expression="execution(* com.kaka.spring.aop.aspect.service.UserService.*(..))"/>
<aop:aspect ref="myXmlAspect">
<aop:around method="aroundMethod" pointcut-ref="myPointcut"/>
aop:aspect>
aop:config>
MyXmlAspect类无需实现任何通知接口,只需定义一个aroundMethod方法即可,该方法名也可以自定义其他的。
可以理解为:切面就是自定定义的aop对象,通知就是配置中指定的该对象方法。
被通知的对象(方法)
向目标对象应用通知之后创建的对象