Spring的通知类型:
org.aopalliance.intercept.MethodInterceptor(环绕通知):
在目标方法执行前后实施增强,用于日志、事务管理等。
org.springframework.aop.MethodBeforeAdvice(前置通知):
在目标方法执行前实施增强,用于权限管理等。
org.springframework.aop.AfterReturning.Advice(后置通知):
用于执行后实施增强,用于关闭流、上传删除等功能。
org.springframework.aop.ThrowsAdvice(异常抛出通知):
方法抛出异常后实施增强,用于处理异常记录日志等功能。
org.springframework.aop.IntroductionInterceptor(引介通知):
在目标类中添加新方法和属性,用于修改低版本的程序。
ProxyFactoryBean:负责为其他Bean创建代理实例
通过案例演示ProxyFactoryBean创建AOP代理的过程
案例开始之前需要导入如下依赖包:
此处通知为环绕通知。
创建接口UserDao:
package cn.edu.gues.jdkAOP;
public interface UserDao {
public void addUser();
public void deleteUser();
}
创建userDaoImpl类,实现userDao接口:
package cn.edu.gues.jdkAOP;
public class UserDaoImpl implements UserDao {
//目标类
@Override
public void addUser() {
System.out.println("添加用户");
}
@Override
public void deleteUser() {
System.out.println("删除用户");
}
}
创建切面类MyAspect:
package cn.edu.proxyFac;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
//切面类
public class MyAspect implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation method) throws Throwable {
//前置增强
check_Permissions();
//执行目标方法
Object obj = method.proceed();
//后置增强
log();
return obj;
}
public void check_Permissions() {
System.out.println("模拟检查权限...");
}
public void log(){
System.out.println("模拟记录日志...");
}
}
创建配置文件applicationContext.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-4.3.xsd">
<!--1.目标类 -->
<bean id="userDao" class="cn.edu.gues.jdkAOP.UserDaoImpl"></bean>
<!--2.切面类 -->
<bean id="myAspect" class="cn.edu.proxyFac.MyAspect"></bean>
<!--3.使用spring代理工厂定义一个名为userDaoProxy代理对象 -->
<bean id="userDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!--3.1指定代理实现的接口 -->
<property name="proxyInterfaces" value="cn.edu.gues.jdkAOP.UserDao"></property>
<!--3.2指定目标对象-->
<property name="target" ref="userDao"></property>
<!--3.3指定切面,织入环绕通知 -->
<property name="interceptorNames" value="myAspect"></property>
<!--3.4指定代理方式,true使用cglib,false使用jdk动态代理 -->
<property name="proxyTargetClass" value="true"></property>
</bean>
</beans>
创建测试类:ProxyFactoryBeanTest:
package cn.edu.proxyFac;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.edu.gues.jdkAOP.UserDao;
public class ProxyFactoryBeanTest {
public static void main(String[] args) {
String xmlpath="cn/edu/proxyFac/applicationContext.xml";
ApplicationContext applicationContext=new ClassPathXmlApplicationContext(xmlpath);
//从spring容器获得内容
UserDao userDao=(UserDao) applicationContext.getBean("userDaoProxy");
//执行方法
userDao.addUser();
userDao.deleteUser();
}
}
运行结果图:
本博客仅供个人学习,请勿用于商业用途。