Spring_AOP
程序员文章站
2022-04-25 21:27:28
...
Spring_AOP
AOP:面向切面编程
AOP能够将与业务无关,却为业务模块所共有的代码抽离出来,由容器在运行期间,
动态的织入其中,便于减少重复代码,降低耦合度,提升系统可维护性。
Spring 中的AOP由动态代理实现
AOP当中最重要的概念:
1:切入点:在哪些类,哪些方法上进行切入
2:通知(增强):在方法的什么时候(之前,之后,异常)做什么(增强)
3:切面:切面等于切入点+通知(及,在什么地方,什么时间,做什么)
4:织入:把切面加入对象,并创建代理的过程(由Spring容器动态完成)
execution()
表达式:用来定义切入点:语法为execution(访问修饰符 全限定名 方法名(参数))
execution(* com.zhiyou100.test…*(…))
代表com.zhiyou100.test包下的所有类及子包的类中所有方法
各种不同的增强:
aop:before(前置增强):在方法执行之前执行增强;
aop:after-returning(后置增强):在方法正常执行完成之后执行增强(中间没有遇到任何异常);
aop:throwing(异常增强):在方法抛出异常退出时执行增强代码;
aop:after(最终增强):在方法执行之后执行,相当于在finally里面执行;可以通过配置throwing来获得拦截到的异常信息
aop:around(环绕增强):最强大的一种增强类型。 环绕增强可以在方法调用前后完成自定义的行为,环绕通知有两个要求,
1,方法必须要返回一个Object(返回的结果)
2,方法的第一个参数必须是ProceedingJoinPoint(可以继续向下传递的切入点)
使用注解配置AOP切面需要使用<aop:aspectj-autoproxy /> 开启Spring对AOP注解的支持
AOP测试类
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect //告诉容器,这个类是一个切面
public class Aop {
public final static String EDP="execution(* com.zhiyou100.test..*(..))";
@Before(EDP)
public void getUp(){
System.out.println("调用方法之前");
}
@AfterReturning(EDP)
public void eat(){
System.out.println("调用方法之后");
}
@AfterThrowing(EDP)
public void sleep(){
System.out.println("出现异常,方法崩溃");
}
//定义环绕增强的方法
@Around(EDP)
public Object doAop(ProceedingJoinPoint join){
System.out.println("调用方法之前");
Object ob = null;
try {
ob = join.proceed();
} catch (Throwable e) {
System.out.println("方法出现异常");
}
System.out.println("调用方法之后");
return ob;
}
}
Spring.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<bean id="user" class="com.zhiyou100.test.User"></bean>
<bean id="aop" class="com.zhiyou100.aop.Aop"></bean>
<bean id="u" class="com.zhiyou100.test.one.U"></bean>
<aop:config>
<aop:pointcut expression="execution(* com.zhiyou100.test..*(..))" id="op"/>
<aop:aspect ref="aop">
<!-- <aop:before method="getUp" pointcut-ref="op"/>
<!-- 最终后置增强 :无论什么情况都会执行-->
<!-- <aop:after method="eat" pointcut-ref="op"/> -->
<!-- 普通后置增强:只有在方法正常结束才执行 -->
<!-- <aop:after-returning method="eat" pointcut-ref="op"/> -->
<!-- 异常后置增强:只有在方法出现异常才执行 -->
<!-- <aop:after-throwing method="eat" pointcut-ref="op"/> -->
<!-- 环绕增强:就是 前后增强的结合体 -->
<aop:around method="doAop" pointcut-ref="op"/>
</aop:aspect>
</aop:config>
</beans>
<bean id="user" class="com.zhiyou100.test.User"></bean>
<bean id="aop" class="com.zhiyou100.aop.Aop"></bean>
<bean id="u" class="com.zhiyou100.test.one.U"></bean>
<!-- 开启Spring对AOP注解的支持 -->
<aop:aspectj-autoproxy />
推荐阅读