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("安全校验...");
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hudie.

不要打赏!不要打赏!不要打赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值