作用
可以在指定的某些类的某些方法的 前后或者 出现异常的时候,动态织入 指定的代码
概念术语
1. Aop
aspect object programming 面向切面编程
功能: 让关注点代码与业务代码分离!
2. 关注点
重复代码就叫做关注点;
3. 切面
关注点形成的类,就叫切面(类)!(把很多类中重复的代码抽取出来的类,叫切面类)
面向切面编程,就是指 对很多功能都有的重复的代码抽取,再在运行的时候往业务方法上动态织入“切面类代码”。
4. 切入点
执行目标对象方法,动态织入切面代码。
可以通过切入点表达式,指定拦截哪些类的哪些方法; 给指定的类或方法在运行的时候植入切面类代码。
aop编程步骤
1. 引入jar包
2. 引入命名空间,开启aop注解
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" 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/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!-- 开启注解扫描 --> <context:component-scan base-package="cn.shanglin.e_aop_anno"></context:component-scan> <!-- 开启aop注解方式 --> <aop:aspectj-autoproxy></aop:aspectj-autoproxy> </beans> 3. 定义切面类 @Component //加入IOC容器 @Aspect // 指定当前类为切面类,被织入的代码 public class Aop { /** * 指定切入点表达式: 拦截cn.shanglin.e_aop_anno包下的所有类的所有方法 * 第一个*表示:所有返回值类型 * 第二个*表示:该包下的所有类 * 第三个*(..)表示:所有的方法,参数不限;如果是*()表示无参方法;如果是*(*)表示只有一个参数的方法。 * 注意: * 这个切入点表达式,也可以写在每个注解的后面,这里这样统一写, * 下面的所有注解只需要引用方法名:pointCut_即可 */ @Pointcut("execution(* cn.shanglin.e_aop_anno.*.*(..))") public void pointCut_(){ } // 前置通知 : 在执行目标方法之前执行 @Before("pointCut_()") public void begin(){ System.out.println("开始事务"); } // 后置/最终通知:在执行目标方法之后执行 【无论是否出现异常最终都会执行】 @After("pointCut_()") public void after(){ System.out.println("提交事务"); } /** * 环绕通知:环绕目标方式执行,要么使用@Before("pointCut_()")和@After("pointCut_()"), * 要么就使用@Around("pointCut_()"),两个功能一样不要混合使用 */ @Around("pointCut_()") public void around(ProceedingJoinPoint pjp) throws Throwable{ System.out.println("环绕前,即执行目标方法之前执行...."); pjp.proceed(); // 执行目标方法 System.out.println("环绕后,即执行目标方法之后执行...."); } // 返回后通知: 在调用目标方法结束后执行 【出现异常不执行】 @AfterReturning("pointCut_()") public void afterReturning() { System.out.println("afterReturning()"); } // 异常通知: 当目标方法执行异常时候执行此关注点代码 @AfterThrowing("pointCut_()") public void afterThrowing(){ System.out.println("afterThrowing()"); } }