AOP通知类型以及基于代理类的AOP实现

在Spring中默认使用JDK 动态代理实现AOP编程。使用org.spring.framework.aop.framework.ProxyFactoryBean创建代理是SpringAOP实现的基本方式。

通知类型
  1. 环绕通知
    环绕通知(org.aopalliance.intercept.MethodInterceptor)是在目标方法执行前和执行后实施增强,可应用于日志记录、事务处理等功能。
  2. 前置通知
    前置通知(org.springframework.aop.MethodBeforeAdvice)是在目标方法执行前实施增强,可应用于权限管理等功能。
  3. 后置返回通知
    后置返回通知(org.springframework.aop.AfterReturningAdvice)是在目标方法成功执行后实施增强,可应用于关闭流、删除临时文件等功能。
  4. 后置(最终)通知
    后置通知(org.springframework.aop.AfterAdvice)是在目标方法执行后实施增强,与后置返回通知不同的是,不管是否发生异常都要执行该类通知,该类通知可应用于释放资源。
  5. 异常通知
    异常通知(org.springframework.aop.ThrowsAdvice)是在方法抛出异常后实施增强,可应用于处理异常、记录日志等功能。
  6. 引入通知
    引入通知(org.springframework.aop.IntroductionInterceptor)是在目标类中添加一些新的方法和属性,可应用于修改目标类(增强类)。
ProxyFactoryBean

ProxyFactoryBean是org.springframework.beans.factory.FactoryBean接口的实现类,FactoryBean负责实例化一个Bean实例,ProxyFactoryBean 负责为其他Bean实例创建代理实例

常用属性

属性描述
target代理的目标对象
proxyInterfaces代理需要实现的接口列表,如果有多个接口,则使用List标签 赋值
interceptorNames需要织入的通知,即定义的切面类
proxyTargetClass是否对类代理而不是接口,默认值为false,使用JDK动态代理;当为true时,使用CGLIB动态代理
singleton返回代理实例是否为单例,默认为true
演示(以环绕通知为例)

导入相关的jar包

  1. spring-aop.jar
  2. aopalliance.jar

创建切面类MyAspect ,实现环绕通知的接口MethodInterceptor

package gzc.aopalliance.proxyfactorybean;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
//基于代理类的AOP实现
//切面类  
public class MyAspect implements MethodInterceptor {
	@Override
	public Object invoke(MethodInvocation arg0) throws Throwable {
		//增强方法
		check();
		except();
		Object obj = arg0.proceed();
		log();
		// 返回目标方法的返回值
		return obj;
	}
	public void check() {
		System.out.println("模拟权限控制");
	}
	public void except(Exception e) {
		System.out.println("模拟异常处理:" + e.getMessage());
	}
	public void log() {
		System.out.println("模拟日志记录");
	}
}

目标类TestDaoImpl

package gzc.dao.impl;
import org.springframework.stereotype.Repository;
import gzc.dao.TestDao;
public class TestDaoImpl implements TestDao {
	@Override
	public void save() {
		// TODO Auto-generated method stub
		// int a = 100 / 0;
		System.out.println("保存...");
	}
	@Override
	public void delete() {
		// TODO Auto-generated method stub
		System.out.println("删除...");
	}
}

配置

 <bean id="myTestDao" class="gzc.dao.impl.TestDaoImpl"/>
<!-- 配置代理类实现AOP -->
<!-- 配置切面类bean -->
<bean id="myAspect" class="gzc.aopalliance.proxyfactorybean.MyAspect" /> 
<!-- 使用Spring代理工厂定义一个名为testDaoProxy的代理对象 -->
<bean id="testDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean"> 
	<!-- 指定代理实现的接口-->
	<property name="proxyInterfaces" value="gzc.dao.TestDao" />  
	<!-- 指定目标对象 -->
	<property name="target" ref="myTestDao" /> 
	<!-- 指定切面,织入环绕通知-->
	<property name="interceptorNames" value="myAspect"/>  
	<!-- 指定代理方式,true指定CGLIB动态代理,false指定JDK动态代理 -->
	<property name="proxyTargetClass" value="true"/>
</bean>   

测试

public class Test {
	public static void main(String[] args) {
	
		ApplicationContext appCon = new ClassPathXmlApplicationContext("applicationContext.xml");
		// 基于代理类的AOP实现 环绕通知
		TestDao testAdvice = (TestDao) appCon.getBean("testDaoProxy");
		testAdvice.save();
		System.out.println("=============================");
		testAdvice.delete();
	}
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值