动态代理使用说明及应用

动态代理

Java反射API(Proxy InvocationHandler) 综合代理模式特点并加以优化 
实现一种特有接口实现的方式或控制对象业务的逻辑。

先决条件 必须有业务接口

1)代理接口 -> 动态代理类实现所有接口
2)代理对象 -> 

Mybatis框架原理解析 -> 培养(面向对象分析问题)意识形态

— 动态代理 (进一步解耦) 针对接口动态产生代理对象(隐式实现代理接口)

步骤:

1)必须声明接口(*)
2)动态代理类 实现接口 -> java.lang.reflect.InvocationHandler
3)明确代理目标 对象(AOP)还是接口 Class target->接口
4)代理对象实现业务
5)代理对象回调业务


对于接口实现

1.传统方式 -> 显示声明实现类
针对单个接口独立实现 复用性强
2.技巧方式 -> 匿名内部类
实现类在某一代码片段中使用
3.代理方式 -> 动态代理
针对业务类似一系列接口 统一管理

代码实现
App.java

package com.uplooking.app;

import java.lang.reflect.Method;
import com.uplooking.dao.UserMapper;
import com.uplooking.dao.proxy.MapperProxy;
import com.uplooking.pojo.Book;
import com.uplooking.pojo.User;

public class App {

	public static void main(String[] args) {
		
		try {
			System.out.println("----------------Class.forName(className)------------------------");
			
			String className = "com.uplooking.dao.BookMapper";
			
			Class clazz = Class.forName(className);
			
			MapperProxy mapperProxy = new MapperProxy(clazz);
			
			Object proxy = mapperProxy.getProxyInstance();
			
			Method method = clazz.getMethod("insert", Book.class);
			
			Book book = new Book("书籍1","作者1");
			
			System.out.println(method.invoke(proxy, book));
			
			System.out.println("----------------Class.forName(className)------------------------");
			
			className = "com.uplooking.dao.UserMapper";
			
			clazz = Class.forName(className);
			
			mapperProxy = new MapperProxy(clazz);
			
			proxy = mapperProxy.getProxyInstance();
			
			method = clazz.getMethod("insert", User.class);
			
			User user = new User("zhangsan", "a123123");
			
			System.out.println(method.invoke(proxy, user));
			
			
			System.out.println("-------------new MapperProxy(UserMapper.class)---------------------");
			
			mapperProxy = new MapperProxy(UserMapper.class);
			
			proxy = (UserMapper) mapperProxy.getProxyInstance();
			
			System.out.println(((UserMapper) proxy).findAll());
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

动态代理类MapperProxy.java

package com.uplooking.dao.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

//动态代理类	-> 代理容器[代理公司]
public class MapperProxy implements InvocationHandler {

	//代理接口 -> 实现接口一种编码方式 耦合低
	private Class target;
	
	//接受接口代理
	public MapperProxy(Class target) {
		super();
		this.target = target;
	}
	
	//产生代理对象  
	//->代理容器 根据 代理接口产生代理对象 (系统动态产生实现接口的实体类的对象) | 代理公司根据代理业务委派代理人
	public Object getProxyInstance(){
		//this.getClass().getClassLoader() 类加载器 工厂 根据Java源码(系统产生 用户编写)产生字节码
		//new Class[]{target} 代理接口
		//this -> MapperProxy 代理容器
		return Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[]{target}, this);
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		//业务回调
		//代理接口 	->业务实现
		//代课对象	->业务重写
		System.out.println("动态代理业务实现");
		System.out.println("代理对象:"+proxy.getClass().getName());
		System.out.println("代理业务:"+method.getName());
		System.out.println("业务参数:"+Arrays.toString(args));
		//根据代理相关参数 对不同业务进行处理
		return null;
	}

}

dao层接口:UserMapper.java 和 BookMapper.java

package com.uplooking.dao;

import java.util.List;

import com.uplooking.pojo.User;

public interface UserMapper {
	Integer insert(User user);
	List<User> findAll();
}

package com.uplooking.dao;

import com.uplooking.pojo.Book;

public interface BookMapper {
	
	Integer insert(Book book);
	
	Book findById(int id);
	
}

实体类:Book.java 和 User.java

package com.uplooking.pojo;

public class Book {
	
	private String title;
	private String author;
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	public Book() {
		super();
	}
	public Book(String title, String author) {
		super();
		this.title = title;
		this.author = author;
	}
	@Override
	public String toString() {
		return "Book [title=" + title + ", author=" + author + "]";
	}
	
}

package com.uplooking.pojo;

public class User {
	private String uname;
	private String upwd;
	public String getUname() {
		return uname;
	}
	public void setUname(String uname) {
		this.uname = uname;
	}
	public String getUpwd() {
		return upwd;
	}
	public void setUpwd(String upwd) {
		this.upwd = upwd;
	}
	public User() {
		super();
	}
	public User(String uname, String upwd) {
		super();
		this.uname = uname;
		this.upwd = upwd;
	}
	@Override
	public String toString() {
		return "User [uname=" + uname + ", upwd=" + upwd + "]";
	}
	
}

运行结果:

----------------Class.forName(className)------------------------
动态代理业务实现
代理对象:com.sun.proxy.$Proxy0
代理业务:insert
业务参数:[Book [title=书籍1, author=作者1]]
null
----------------Class.forName(className)------------------------
动态代理业务实现
代理对象:com.sun.proxy.$Proxy1
代理业务:insert
业务参数:[User [uname=zhangsan, upwd=a123123]]
null
----------------new MapperProxy(UserMapper.class)------------------------
动态代理业务实现
代理对象:com.sun.proxy.$Proxy1
代理业务:findAll
业务参数:null
null
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

你不懂、、、

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值