Spring框架|动态代理之JDK代理


一、JDK代理图解

在这里插入图片描述

二、基于接口的JDK动态代理

  • 提供者:JDK 官方的 Proxy 类。

  • 要求:被代理类最少实现一个接口。

  • 动态代理特点:字节码随用随创建,随用随加载。

  • 代理模式:代理对象代理真实对象,达到增强真实对象功能的目的。

三、JDK代理演示

在这里插入图片描述

(1)接口

package com.gql.dao;
import com.gql.staticproxy.User;
/**
 * 类说明:
 *		接口
 * @guoqianliang1998.
 */
public interface UserDao {
	void save(User user);
}

(2)目标类

package com.gql.dao;
import com.gql.staticproxy.User;
/**
 * 类说明:
 *		目标类
 * @guoqianliang1998.
 */
public class UserDaoImpl implements UserDao {

	@Override
	public void save(User user) {
		//安全校验+日志记录
		System.out.println("保存用户成功...");
	}
}

(3)事务类/拦截器

package com.gql.jdkproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

import com.gql.transaction.MyTransaction;

/**
 * 类说明:
 *		事务类/拦截器
 * @guoqianliang1998.
 */
public class MyInterceptor implements InvocationHandler{
	private Object target;//目标类
	private MyTransaction myTransaction;//事务类(切面)
	private Logger log;
	private Security security;
	
	public MyInterceptor(Object target, MyTransaction myTransaction, Logger log, Security security) {
		super();
		this.target = target;
		this.myTransaction = myTransaction;
		this.log = log;
		this.security = security;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		myTransaction.begin();
		log.log();
		security.safe();
		method.invoke(target, args);
		return null;
	}

}

(4)JDK代理类

package com.gql.jdkproxy;
import java.lang.reflect.Proxy;
import com.gql.dao.UserDao;
import com.gql.dao.UserDaoImpl;
import com.gql.staticproxy.User;
import com.gql.transaction.MyTransaction;
import com.sun.xml.internal.bind.v2.runtime.unmarshaller.IntArrayData;

/**
 * 类说明:
 *		JDK代理测试
 * @guoqianliang1998.
 */
public class JDKProxyTest {
	public static void main(String[] args) {
		//目标类
		UserDao userDao = new UserDaoImpl();
		//事务类
		MyTransaction myTransaction = new MyTransaction();
		//日志类
		Logger log = new Logger();
		//安全校验类
		Security security = new Security();
		//创建拦截器对象
		MyInterceptor myInterceptor = new MyInterceptor(userDao,myTransaction,log,security);
		//创建代理对象
		UserDao userDaoProxy = (UserDao)Proxy.newProxyInstance(userDao.getClass().getClassLoader(), userDao.getClass().getInterfaces(), myInterceptor);
		userDaoProxy.save(new User());
	}
}

(5)日志类

package com.gql.jdkproxy;
/**
 * 类说明:
 *		日志类
 * @guoqianliang1998.
 */
public class Logger {
	public void log(){
		System.out.println("日志记录...");
	}
}

(5)安全校验类

package com.gql.jdkproxy;
/**
 * 类说明:
 *		安全校验类
 * @guoqianliang1998.
 */
public class Security {
	public void safe(){
		System.out.println("安全校验...");
	}
}
发布了385 篇原创文章 · 获赞 1033 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/weixin_43691058/article/details/104123863
今日推荐