关于JDk动态代理的使用过程

・动态代理实现spring面向切面编程的基础。

・JDK的动态代理使用的是接口方式实现。

・掌握JDK动态代理编程过程非常重要。

        下面将把创建 过程完整呈现。

 ※ 全部手敲实测,转载请注明出处。

   ①引入spring 的5个核心组件(虽然本例不全用)



org.springframework
spring-core
4.3.6.RELEASE



org.springframework
spring-beans
4.3.6.RELEASE



org.springframework
spring-context
4.3.6.RELEASE



org.springframework
spring-expression
4.3.6.RELEASE



commons-logging
commons-logging
1.2

 

②创建目标接口并实现目标接口

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

================================================================

※转载,请注明出处。

 

你可能感兴趣的:(关于JDk动态代理的使用过程)