要求:使用Spring框架技术的面向切面编程方法,实现对目标方法的环绕通知。请以用户管理为例(简单模拟即可),实现对用户添加和用户删除方法的环绕通知,模拟在这些方法前进行校验操作,在这些方法之后进行日志处理操作。要求编写目标类、切面类和代理工厂等组件的实现代码和配置文件,编写测试程序,运行并查看结果。
需要建两个包,一个jdk包,一个aspect包
1、目标类接口UserDao
package com.tyut.jdk;
public interface UserDao {
public void addUser();
public void deleteUser();
}
2、UserDao的实现类
package com.tyut.jdk;
public class UserDaoImpl implements UserDao {
@Override
public void addUser() {
System.out.println("添加用户");
}
@Override
public void deleteUser() {
System.out.println("删除用户");
}
}
3、MyAspect切片类
package com.tyut.aspect;
public class MyAspect {//切面类
public void check_Permissions(){
System.out.println("模拟检查权限..");
}
public void log(){
System.out.println("模拟记录日志..");
}
}
4.Jdk代理工厂类JdkProxy
package com.tyut.jdk;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import com.tyut.aspect.MyAspect;
public class JdkProxy implements InvocationHandler{//代理工厂类
private UserDao userDao;
public Object createProxy(UserDao userDao){
this.userDao=userDao;
ClassLoader classLoader=JdkProxy.class.getClassLoader();
Class[] clazz=userDao.getClass().getInterfaces();
return Proxy.newProxyInstance(classLoader,clazz,this);
}
//实现了InvocationHandler中的invoke方法;
public Object invoke(Object proxy,Method method,Object[] args)
throws IllegalAccessException, IllegalArgumentException, InvocationTargetException{
MyAspect myAspect=new MyAspect();
myAspect.check_Permissions();
Object obj=method.invoke(userDao, args);
myAspect.log();
return obj;
}
}
5、测试类
package com.tyut.jdk;
public class JdkTest {
public static void main(String[] args){
JdkProxy jdkProxy=new JdkProxy();
UserDao userDao=new UserDaoImpl();
UserDao userDao1=(UserDao)jdkProxy.createProxy(userDao);
userDao1.addUser();
userDao1.deleteUser();
}
}
6、运行结果: