1.aop概念
1)aop:面向切面(方面)编程,扩展功能不用修改源代码
2)Aop采取横行抽取机制
2.aop操作术语
1) Joinpoint 连接点:类里面能被增强的方法,这些方法成为连接点
2) Pointcut切入点:在类里面可以有很多方法能被增强,实际增强的方法称为切入点
3) Advice 通知或增强:增强的逻辑,例,扩展日志功能,该日志功能称为增强
通知:前置通知, 后置通知, 异常通知,最终通知,环绕通知
4) Aspect切面:把增强应用到具体方法上面的过程称为切面
3.在spring中进行aop操作,使用aspectj实现
aspectj实现aop的两种方式:1)基于aspectj的xml配置,
2)基于aspectj的注解
一.以下介绍关于xml的配置
操作准备:1)基本的jar包,和aop相关的jar包
2)xml配置文件中导入aop的约束
操作阶段:1) 创建类,然后建增强类
类Book:
public class Book { public void add(){ System.out.println("add................"); } }增强类:
public class myBook { public void before (){ System.out.println("前置增强"); } public void after(){ System.out.println("后置增强"); } //环绕通知 public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{ System.out.println("执行方法之前"); proceedingJoinPoint.proceed(); System.out.println("执行方法之后"); } }
2)使用表达式配置切入点
常用表达式:
execution(<访问修饰符>?<反回类型><方法名><参数><异常>)
(1)execution(* cn.cd.Book.add(..)) //*表示任意的 cn.cd.Book.add() 是Book类的add方法的全路径,add(..)括号中的..表示有参数也包含在内,*后面有空格,不能省略
(2)execution(* cn.cd.Book.*(..)) //对所有的方法增强
(3)execution(* *.*(..))
(4)execution(* save*(..)) //save开头的都增强
xml文件中配置
<bean id="book" class="com.Book.Book"/> <bean id="myBook" class="com.Book.myBook" /> <!-- 配置aop --> <aop:config> <!--配置切入点 --> <aop:pointcut expression="execution(* com.Book.Book.add())" id="pointcut"/> <!-- 配置 切面--> <aop:aspect ref="myBook"> <!-- <aop:before method="before" pointcut-ref="pointcut"/>//前置增强 <aop:after method="after" pointcut-ref="pointcut"/> //后置增强 --> <aop:around method="around" pointcut-ref="pointcut" /><!--环绕增强 --> </aop:aspect> </aop:config>
二:注解方式配置
1.首先在springMVC的配置文件中配置增强类和被增强类,在这两个bean的上面开启aop操作,输入如下代码开启:
<aop:aspectj-autoproxy />
2.在增强类上写注解,方法上也加上注解
@Aspect public class myBook { @Before(value="") public void before (){ System.out.println("前置增强"); }value的值为execution表达式
PS: @AfterReturning 后置通知
@Around 环绕通知
@AfterThrow 抛出通知
@After 最终通知,不管是否异常都会执行