Spring_AOP

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 />
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值