欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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 />
相关标签: SpringAOP

推荐阅读