基于代理类的AOP实现
Posted 花式编程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于代理类的AOP实现相关的知识,希望对你有一定的参考价值。
前言
通过前面的两篇文章,相信大家对Spring中两种模式已经有了一定的了解。实际上,Spring中的AOP代理默认就是使用JDK动态代理的方式来实现的。在Spring中,使用ProxyFactoryBean是创建AOP代理的最基本方法,接下来我会对Spring中基于代理类的AOP实现的相关进行详细详解。
Spring的通知类型
1.org.aopalliance.intercept.Methodinterceptor(环绕通知)
在目标方法执行前后实施增强,可以应用于日志,事务管理等功能
2.org.aopalliance.intercept.MethodBeforeAdvice(前置通知)
在目标方法执行前实施增强,可以应用于权限管理等功能
3.org.aopalliance.intercept.AfterReturingAdvice(后置通知)
在目标方法执行后实施增强,可以应用于关闭流,上传文件,删除临时文件等功能
4.org.aopalliance.intercept.ThrowsAdvice(异常通知)
在方法抛出异常后实施增强,可以应用于处理异常记录日志等功能
5.org.aopalliance.intercept.IntroductionInterceptor(引介通知)
在目标方法添加一些新的方法和属性,可以应用于修改老版本程序(增强类)
ProxyFactoryBean类中的常用可配置属性
实战
1.引入依赖
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
此处aop的依赖省略
1.创建接口UserDao类
package com.aop.jdk;
public interface UseDao {
public void addUser();
public void deleteUser();
}
2.创建目标类UserDaoImpl实现UserDao接口
package com.aop.jdk;
import com.ioc.UserDao;
//目标类
public class UserDaoImpl implements UseDao {
@Override
public void addUser() {
System.out.println("添加用户");
}
@Override
public void deleteUser() {
System.out.println("删除用户");
}
}
3.创建切面类
public class MyAspect implements MethodInterceptor{
@Override
public Object invoke(MethodInvocation mi) throws Throwable {
check_Permission();
//执行目标方法
Object obj = mi.proceed();
log();
return obj;
}
public void check_Permission(){
System.out.println("模拟检查权限。。。");
}
public void log(){
System.out.println("模拟记录日志。。。");
}
}
4.factorybean.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
"
default-lazy-init="false">
<!--目标类-->
<bean id="userDao" class="com.aop.factorybean.UserDaoImpl"></bean>
<!--切面类-->
<bean id="myAspect" class="com.aop.factorybean.MyAspect"></bean>
<bean id="userDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!--指定代理实现的接口-->
<property name="proxyInterfaces" value="com.aop.factorybean.UseDao"></property>
<!--指定目标对象-->
<property name="target" ref="userDao"></property>
<!--指定切面,植入环绕通知-->
<property name="interceptorNames" value="myAspect"></property>
<!--指定代理方式,rtue:使用cglib,false(默认):使用jdk动态代理-->
<property name="proxyTargetClass" value="true"></property>
</bean>
</beans>
5.创建测试类
public class ProxyFactoryBeanTest {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("factorybean.xml");
UserDaoImpl userDao = (UserDaoImpl) applicationContext.getBean("userDaoProxy");
userDao.addUser();
userDao.deleteUser();
}
}
运行结果
推荐阅读:
如果看了有所帮助,转发,点赞,分享给那些还在迷茫的人吧。
喜欢记得来个赞
也可点击后台来撩我添加小编微信
以上是关于基于代理类的AOP实现的主要内容,如果未能解决你的问题,请参考以下文章