实验目的:
1.了解AOP的概念和作用
2.理解AOP中切面以及通知
3.熟悉Spring中两种动态代理方式的区别
4.掌握基于代理类的AOP实现
实验任务1:创建项目,引入相关JAR包
实验任务2:创建目标接口和实现类
创建UserDao,在UserDao接口中编写添加和删除方法,代码如下。
package com.jianzhu.aop;
public interface UserDao {
public void addUser();
public void deleteUser();
}
创建UserDao接口的实现类UserDaoImpl,实现接口中的方法,代码如下。
package com.jianzhu.aop.impl;
import com.jianzhu.aop.UserDao;
import org.springframework.stereotype.Repository;
@Repository("userDao")
public class UserDaoImpl implements UserDao {
public void addUser() {
System.out.println("添加用户");
}
public void deleteUser() {
System.out.println("删除用户");
}
}
实验任务3:创建切面类
创建切面类MyAspect,在类中定义一个模拟权限检查的方法和一个模拟日志记录的方法,这两个就是切面中的通知,代码如下。
package com.jianzhu.aop;
public class MyAspect {
public void check_Permissions(){
System.out.println("模拟检查权限。。");
}
public void log(){
System.out.println("模拟记录日志。。");
}
}
实验任务4:创建代理类
创建代理类MyProxy,该类需要实现InvocationHandle接口设置代理类的调用处理程序。
在代理类中,通过newProxyInstance()生成代理方法,代码如下。
package com.jianzhu.aop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MyProxy implements InvocationHandler {
private UserDao userDao;
public Object createProxy(UserDao userDao){
this.userDao=userDao;
ClassLoader classLoader = MyProxy.class.getClassLoader();
Class[] classes = userDao.getClass().getInterfaces();
return Proxy.newProxyInstance(classLoader,classes,this);
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
MyAspect myAspect = new MyAspect();
myAspect.check_Permissions();
Object obj = method.invoke(userDao,args);
myAspect.log();
return obj;
}
}
实验任务5:创建测试类
创建测试类JDKTest,在该类中的main()方法中创建代理对象jdkProxy和目标对象userDao,从代理对象jdkProxy中获得对目标对象userDao增强后的对象userDao1,最后调用userDao1对象中的添加和删除方法,代码如下。
package com.jianzhu.aop;
import com.jianzhu.aop.MyProxy;
import com.jianzhu.aop.UserDao;
import com.jianzhu.aop.impl.UserDaoImpl;
public class JDKTest {
public static void main(String[] args) {
MyProxy jdkProxy = new MyProxy();
UserDao userDao=new UserDaoImpl();
UserDao userDao1 = (UserDao) jdkProxy.createProxy(userDao);
userDao1.addUser();
userDao1.deleteUser();
}
}
输出结果如图。