Aop的理解

1.什么是AOP:
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
2. 什么是目标类,额外功能,代理类?
目标类:就是我们的核心代码,业务逻辑。
额外功能(也就是AOP的功能):日志处理、事务处理、异常处理、性能分析等。
目标类 + 额外功能 = 代理类
3.AOP的原理就是java的动态代理机制。
4.AOP的四种增强方式
(1)配置增强类的bean

    <!-- 前置增强功能 -->
	<bean id="myBeforeAdvice" class="com.gxy.aop.MyBeforeAdvice"></bean>
	<!-- 后置增强 -->
	<bean id="myAfterAdvice" class="com.gxy.aop.MyAfterAdvice"></bean>
	<!-- 异常增强 -->
	<bean id="myThrowsAdvice" class="com.gxy.aop.MyThrowsAdvice"></bean>
	<!-- 环绕增强 -->
	<bean id="myInterceptor" class="com.gxy.aop.MyInterceptor"></bean>

(2)前置增强,在核心功能之前执行的额外功能

package com.gxy.aop;

import java.lang.reflect.Method;
import org.springframework.aop.MethodBeforeAdvice;

public class MyBeforeAdvice implements MethodBeforeAdvice {

	@Override
	public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable {
		System.out.println("前置增强");
		//获取目标方法名称
		String method = arg0.getName();
		System.out.println("the method:"+method);
		//获取目标方法参数的实参列表
		for (int i = 0; i < arg1.length; i++) {
			System.out.println("the arg1:"+arg1[i]);
		}
		//获取目标类的类路径
		System.out.println("the arg2:"+arg2.getClass());
	}
}

(3)后置增强,在核心功能之后执行的额外功能

package com.gxy.aop;

import java.lang.reflect.Method;

import org.springframework.aop.AfterReturningAdvice;

public class MyAfterAdvice implements AfterReturningAdvice{

   @Override
   public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable {
   	System.out.println("后置增强");
   	//获取反参参数的类型
   	System.out.println("the arg0:"+arg0.getClass());
   	//获取目标方法名称
   	System.out.println("the arg1:"+arg1.getName());
   	//获取目标方法参数的实参列表
   	for (int i = 0; i < arg2.length; i++) {
   		System.out.println("the arg2:"+arg2[i]);
   	}
   	//获取目标类的类路径
   	System.out.println("the arg3:"+arg3.getClass());
   }
}

(4)异常增强,在核心功能发生异常时执行的额外功能

package com.gxy.aop;

import java.lang.reflect.Method;

import org.springframework.aop.ThrowsAdvice;

public class MyThrowsAdvice implements ThrowsAdvice{
   
   public void afterThrowing(Method method, Object[] args, Object target,Exception ex) throws Throwable {
   	System.out.println(target+"里面的"+method.getName()+"产生了"+ex.getMessage());
   }
}

(5)环绕增强,在核心功能之前以及之后执行的额外功能

package com.gxy.aop;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class MyInterceptor implements MethodInterceptor {

	@Override
	public Object invoke(MethodInvocation arg0) throws Throwable {
		System.out.println("环绕增强");
		//获取目标实现类对象
		String actionClass = arg0.getThis().getClass().toString();
		System.out.println("arg0.getThis():"+actionClass);
		//获取目标方法名称
		String methodName = arg0.getMethod().getName();
		System.out.println("arg0.getMethod():"+methodName);
		//获取目标方法参数的实参列表
		Object[] arg = arg0.getArguments();
		for (int i = 0; i < arg.length; i++) {
			System.out.println("arg0.getArguments():"+arg[i]);
		}
		//由于启动了环绕增强,目标类的方法将不会执行,而被.proceed取代,并返回目标类的反参
		//执行目标方法
		Object object = arg0.proceed();
		return object;
	}
}

更详细的请点击 谈谈对Spring AOP的理解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值