・动态代理实现spring面向切面编程的基础。
・JDK的动态代理使用的是接口方式实现。
・掌握JDK动态代理编程过程非常重要。
下面将把创建 过程完整呈现。
※ 全部手敲实测,转载请注明出处。
①引入spring 的5个核心组件(虽然本例不全用)
②创建目标接口并实现目标接口
package jdk;
public interface UserDao {
void adduser();
void deleteUser();
}
package jdk;
public class UserDaoImpl implements UserDao {
public void adduser() {
System.out.println("执行adduser方法 ");
}
public void deleteUser() {
System.out.println("执行deleteUser方法 ");
}
}
③创建切面类以及切面方法
package aspect;
public class Myspect {
public void beforeExcute() {
System.out.println("check");
}
public void afterExcute() {
System.out.println("over");
}
}
④创建动态代理类以及生成动态代理对象的方法 和动态代理对象执行的方法
package jdk;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import aspect.Myspect;
public class JdkProxy implements InvocationHandler {
private UserDao userDao;// 被代理的目标类
/**
* 创建代理对象
*
* @param userDao
* @return
*/
public Object createProxyObj(UserDao userDao) {
// 设置 为接受 的 被代理的目标类
this.userDao = userDao;
// 代理类的加载器
ClassLoader classLoader = JdkProxy.class.getClassLoader();
// 被代理的目标类的所有接口
Class[] clazz = userDao.getClass().getInterfaces();
return Proxy.newProxyInstance(classLoader, clazz, this);
}
/**
* 代理对象 执行后执行这个方法
*
* @param userDao
* @return
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 声明切面
Myspect myspect = new Myspect();
// 执行切面方法
myspect.beforeExcute();
// 执行目标方法
Object object = method.invoke(userDao, args);
// 执行切面方法
myspect.afterExcute();
return object;
}
}
⑤测试
package jdk;
public class JdkTest {
public static void main(String[] args) {
// 创建 目标对象
UserDao userDao = new UserDaoImpl();
// 创建代理类
JdkProxy jdkProxy = new JdkProxy();
// 从代理类中 获取目标对象的代理对象
UserDao userDaoProxy = (UserDao) jdkProxy.createProxyObj(userDao);
// 代理对象执行目标对象的方法会自动执行invoke方法。
userDaoProxy.adduser();
userDaoProxy.deleteUser();
}
}
⑥测试结果
check
执行adduser方法
over
check
执行deleteUser方法
over
================================================================
※转载,请注明出处。