(五)Spring 用aspectJ 开发AOP

0. aop的相关术语

1. aop 的操作准备

2.使用表达式配置切入点

3.aop的前置/后置/环绕 增强的实现


 AOP:扩展某个类A的方法时,不需要通过继承重写。而是创建另一个类B,用B的方法加在A的方法上。


0.   aop 的相关术语

aop的作用:A类中的某方法需要扩展功能时,可以通过B类的某方法扩展,即把B类的某方法加入到A类的某方法中。

(1)连接点(Joinpoint)

表示程序执行到的某个特定位置,在Spring中表示某个(类的方法)。每个程序类都有多个连接点,如一个拥有2个方法的类,即拥有了2个连接点


(2)通知/增强

增强的逻辑称为增强。比如扩展日志功能,这个日志功能称为增强

增强有几种:

前置通知/增强:在方法之前执行

后置通知/增强:在方法之后执行

异常通知/增强:方法出现异常时执行

最终通知/增强:在后置之后执行

环绕通知/增强:在方法之前和之后执行


(3)切点

类中可以有多个方法可以被增强,而实际增强的方法 为切入点


(4)切面

把增强应用到具体方法上面,过程称为切面。



1. aop 操作准备

(1).除了有基本的 spring jar包外,还需要导入 aop 相关的 jar包



(2).在配置文件中导入 aop 约束

同样也是在 spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html 中寻找:

在 xsd-configuration 中 查找 标题:the aop schema ,红框处就是要使用的约束


<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- bean definitions here -->

</beans>


接着:


即可完成 aop 操作的准备工作



2.使用表达式配置切入点

切入点:实际增强的方法

常用的表达式:

execution(<访问修饰符>  <返回类型><方法名>(参数)<异常>)

访问修饰符:如public,private 等,可以用 * 表示所有修饰符。


若要增强 com.zje 包中Book类中的 fun()方法,有以下几种常用写法:

(1)execution(*  com.zje.Book.fun(..))//fun(..) 中的 .. 表示方法的参数。

(2)execution(*  com.zje.Book.*(..))//增强com.zje.Book 中的所有方法

(3)execution(* *.*(..))//增强所有类中的所有方法



3.aop的 前置/后置/环绕 增强的实现:

目录树:



1.Book.java(需要被增强的类)

package com.zje;

public class Book {
	/*连接点(被增强时为切入点)*/
	public void fun(){
		System.out.println("fun......");
	}
}

2.MyBook.java(用于增强Book类的类)

package com.zje;

import org.aspectj.lang.ProceedingJoinPoint;

public class MyBook {
	/*前置增强*/
	public void before1(){
		System.out.println("前置增强......");
	}
	/*后置增强*/
	public void after1(){
		System.out.println("后置增强.......");
	}
	/*环绕增强*/
	//ProceedingJoinPoint 表示切入点
	public void around1(ProceedingJoinPoint pjd) throws Throwable{
		System.out.println("环绕增强-----方法之前");	//被增强方法(切入点)运行之前所运行的代码
		pjd.proceed();								//运行被增强方法(切入点)
		System.out.println("环绕增强-----方法之后");	//被增强方法(切入点)运行之后所运行的代码
	}
}
   

3.Bean1.xml:


如上图所示,编写 aop 操作:

1.配置切入点和增强的对象

2.配置切入点:制定切入点,并起一个切入点的id

3.配置切面:制定是前置?后置?还是环绕增强


运行结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值