八: 动态代理的几种实现方式及优缺点

  1. 动态代理

    在这里插入图片描述
    学的有点蒙,。。。。。后续再写吧。。。。。。

JDK 代码示例: 需求, user 实体类 值写入到数据库时, 校验name 长度不能小于1
无侵入性增强

  1. 有个接口 UserService
package com.enjoylearning.dynamic.proxy.jdk;

import com.enjoylearning.dynamic.proxy.User;

public interface UserService {
	
	void addUser(User user);

}
  1. 被增强的类必须要继承接口
package com.enjoylearning.dynamic.proxy.jdk;

import com.enjoylearning.dynamic.proxy.User;

public class UserServiceImpl implements UserService {

	@Override
	public final void addUser(User user) {
		System.out.println("用户数据入库成功,数据为:" + user.toString());
	}

}

3.拦截器

package com.enjoylearning.dynamic.proxy.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.logging.Logger;

import com.enjoylearning.dynamic.proxy.User;

public class UserServiceInterceptor implements InvocationHandler{

	private Object realObj;
	
	private static Logger logger = Logger.getLogger(UserServiceInterceptor.class.getName());
	
	public Object getRealObj() {
		return realObj;
	}

	public void setRealObj(Object realObj) {
		this.realObj = realObj;
	}


	public UserServiceInterceptor(Object realObj) {
		super();
		this.realObj = realObj;
	}


	public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
		if(args!=null && args.length>0 && args[0] instanceof User){
			User user = (User) args[0];
			if(user.getName().trim().length()<=1){
				throw new RuntimeException("用户姓名输入长度需要大于1!");
			}
		}
		Object ret = method.invoke(realObj, args);
		logger.info("数据库操作成功!");
		return ret;
	}
	
	

}

4.测试方法

package com.enjoylearning.dynamic.proxy.jdk;

import java.lang.reflect.Proxy;

import com.enjoylearning.dynamic.proxy.User;

public class Client {

	public static void main(String[] args) {
		User user = new User();
		user.setAddress("地址");
		user.setAge(20);
		user.setName("1ison");
		UserService us = new UserServiceImpl();
		UserServiceInterceptor usi = new UserServiceInterceptor(us);
		//1.类加载器
		//2. 服务接口信息
		//3. invocationhandler 本身
		UserService proxy = (UserService) Proxy.newProxyInstance(us.getClass().getClassLoader(), us.getClass().getInterfaces(), usi);
		//通过动态代理增强业务
		proxy.addUser(user);
//		System.out.println("---------------------");
//		System.out.println(proxy.hashCode());
	}
}

CGLIB 动态代理

在这里插入图片描述
1.被增强的 方法, 不需要继承接口

package com.enjoylearning.dynamic.proxy.cglib;

import com.enjoylearning.dynamic.proxy.User;

public class UserServiceImpl {
	


	public final void addUser(User user) {
		System.out.println("用户数据入库成功,数据为:"+user.toString());
	}

}

2.拦截器 实现intercept 方法

package com.enjoylearning.dynamic.proxy.cglib;

import java.lang.reflect.Method;
import java.util.logging.Logger;

import com.enjoylearning.dynamic.proxy.User;

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class UserServiceInterceptor implements MethodInterceptor {

	private static Logger logger = Logger.getLogger(UserServiceInterceptor.class.getName());

	public Object intercept(Object obj, Method method, Object[] args,MethodProxy proxy) throws Throwable {
		if(args!=null && args.length>0 && args[0] instanceof User){
			User user = (User) args[0];
			if(user.getName().trim().length() <= 1){
				throw new RuntimeException("用户姓名输入长度需要大于1!");
			}
		}
		Object ret = proxy.invokeSuper(obj, args);
		logger.info("数据库操作成功!");
		return ret;
	}

}

  1. 测试类
package com.enjoylearning.dynamic.proxy.cglib;

import com.enjoylearning.dynamic.proxy.User;

import net.sf.cglib.proxy.Enhancer;

public class Client {
	
	public static void main(String[] args) {
		User user = new User();
		user.setAddress("地址");
		user.setAge(20);
		user.setName("lison");
		Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(UserServiceImpl.class);
        enhancer.setCallback(new UserServiceInterceptor());
        UserServiceImpl usi1 = (UserServiceImpl) enhancer.create();
        usi1.addUser(user);
//		System.out.println("---------------------");
//		System.out.println(usi.hashCode());
        
//        UserServiceImpl us = new UserServiceImpl();
//        enhancer.setCallback(new UserServiceDelegateInterceptor(us));
//        UserServiceImpl usi2 = (UserServiceImpl) enhancer.create();
//        usi2.addUser(user);
	}

}

在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值