一、AOP的基本概念:
1、AOP概念:
AOP面向切面(方面)编程,扩展功能而不修改源代码时间
AOP采取横向抽取机制, 取代了传统纵向体系重复性代码
2、AOP操作术语:
(1)连接点(Joinpoint):类里面哪些方法可以被增强,这些方法称为连接点。
(2)切入点(Pointcut):在类里面可以有很多的方法被增强,实际增强的方法称为切入点。比如实际操作中,只是增强了类里面的add方法和update方法,则add方法和update称为切入点。
(3)通知/增强(Advice):增强的逻辑,称为增强,比如扩展日志功能,这个日志功能称为增强。
前置通知:在方法之前执行;
后置通知:在方法之后执行;
异常通知:在方法出现异常是执行;
最终执行:在后置通知之后执行;
环绕通知:在方法之前和之后执行。
(4)切面(Aspect):把增强应用到具体方法上面,过程称为切面,就是把增强用到切入点的过程。
(5)Introduction(引介)引介是一种特殊的通知,在不修改类代码的前提下,Introduction可以在运行期为类动态地添加一些方法和Field。
(6)Target(目标对象):代理的目标对象,即要增强的类。
(7)Weaving(织入):是把增强应用到目标的过程,把advice应用到target的过程。
(8)Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类。
3、使用aspectj实现aop有两种方式:
(1)基于aspectj的xml配置;
(2)基于aspectj的注解方式;
二、基于aspectj的xml配置:
(1)导入相关的AOP的jar包:
(2)创建Spring核心配置文件,导入aop的约束
(3)使用表达式配置切入点:
常用的表达式:
execution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>)
第一个*:表示所有的修饰类型。
举例:①execution(* com.zwp.aop.User.add(..))
②execution(* com.zwp.aop.User.*(..))
③execution(* *.*(..))
④匹配所有save开头的方法:execution(* save*(..))
(4)代码测试:
//原始方法:
public class MainTest {
public void text1(){
System.out.println("主方法....");
}
}
//增强的方法:
public class SecondText {
public void before1(){
System.out.println("前置增强");
}
public void after1(){
System.out.println("后置增强");
}
//环绕增强
public void round1(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
//方法之前:
System.out.println("方法之前...");
//执行方法:
proceedingJoinPoint.proceed();
//方法之后:
System.out.println("方法之后...");
}
}
spring的applicationContext.xml配置文件:
测试类:
public class Test2 {
@Test
public void test4(){
ApplicationContext context=
new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
MainTest mainTest = (MainTest) context.getBean("mainTest");
mainTest.text1();
}
}
运行结果:
三、基于aspectj的注解方式:
(1)导入与AOP相关的jar包:
(2)创建对象:
(3)开启Aop操作:
(4)在增强类使用注解@Aspect,在方法上使用注解完结增强配置。
测试代码:
//目标对象Target
public class Annoaop {
public void text1(){
System.out.println("基于aspecj的注解aop操作的主方法....");
}
}
在spring的applicationContext.xml文件配置中,创建对象与开启AOP操作:
//类说明:增强类
//3.1在增强类上面使用注解
@Aspect
public class Add {
//3.2 在方法上使用注解完成增强配置:
@Before(value="execution(* com.zwp.annoAop.Annoaop.*(..))")
public void before1(){
System.out.println("前置增强...");
}
}
public class Test2 {
@Test
public void test5(){
ApplicationContext context=
new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
Annoaop annoaop = (Annoaop) context.getBean("anno");
annoaop.text1();
}
}
运行结果: