动态代理
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