/**
* 代理模式:
* 主题:接口,公共对外方法,代理类也会实现该主题
* 原主题实现:被代理实现的业务逻辑
* 代理主题:封装原主题实现与代理实现。
* Client:拼装原主题与代理主题
*/
/**
* 主题
*/
interface IDBQuery {
String request();
}
/**
* 原主题实现
*/
class DBquery implements IDBQuery{
@Override
public String request() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "request....";
}
}
/**
* 代理主题
*/
class DbQueryProxy implements IDBQuery{
/**
* 采用组合
* 持有被代理对象与实现统一主题接口
*/
private DBquery dbQuery;
@Override
public String request() {
//延迟加载
if(dbQuery==null)
dbQuery = new DBquery();
return dbQuery.request();
}
public DBquery getDbQuery() {
return dbQuery;
}
public void setDbQuery(DBquery dbQuery) {
this.dbQuery = dbQuery;
}
}
public class ProxyClient {
public static void main(String[] args) {
IDBQuery idbQuery = new DbQueryProxy();
idbQuery.request()
}
}
动态代理: JDKProxy,CGLib,Javassist,ASM。
JDKProxy
/**
* JdkProxy
* 实现 InvocationHandler
*/
public class JdkDbQueryHandler implements InvocationHandler {
//被代理对象
private IDBQuery idbQuery;
public IDBQuery getIdbQuery() {
return idbQuery;
}
public void setIdbQuery(IDBQuery idbQuery) {
this.idbQuery = idbQuery;
}
/**
* 1:代理 做日志
* 2:方法增强
* 3:简化操作
* 4:改变返回实际类型
* @param proxy 不需要关注
* @param method 代理方法名,都会执行 如果只代理某个注意判断
* @param args 原对象调用传递参数,这里可以做更改
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if(idbQuery==null)
idbQuery = new DBquery();
return idbQuery.request();
}
/**
* 得到代理对象
*/
public static IDBQuery getIdbQueryProxy(){
IDBQuery jdkProxy = (IDBQuery)Proxy.newProxyInstance(
ClassLoader.getSystemClassLoader(),
IDBQuery.class.getInterfaces(),new JdkDbQueryHandler()
);
return jdkProxy;
}
}
CGlib:
博客介绍了动态代理相关内容,涉及JDKProxy、CGLib、Javassist和ASM等技术。动态代理在信息技术领域有重要应用,这些不同的代理方式各有特点。

394

被折叠的 条评论
为什么被折叠?



