1: 使用JDK Proxy 进行动态拦截某个类的方法执行, 此类必须实现某个接口.
2:例子如下:
package com.toon.mybatis.dao.monitor; import java.io.PrintWriter; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.sql.Connection; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; import java.util.logging.Logger; import javax.sql.DataSource; import com.jamonapi.proxy.MonProxyFactory; //import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy; public class MonitorDataSource implements DataSource { private static final String interceptMethodName = "getConnection"; private DataSource targetDataSource; public void setTargetDataSource(DataSource targetDataSource) { this.targetDataSource = targetDataSource; } private DataSource proxyDataSource; public MonitorDataSource() { this.proxyDataSource = (DataSource) Proxy.newProxyInstance(MonitorDataSource.class.getClassLoader(), new Class[] { DataSource.class }, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object retVal = method.invoke(targetDataSource, args); // 执行目标方法且得到返回值 if (interceptMethodName.equals(method.getName())) { return MonProxyFactory.monitor((Connection) retVal); } return retVal; } }); } // 以下是被代理的方法 @Override public <T> T unwrap(Class<T> iface) throws SQLException { return proxyDataSource.unwrap(iface); } @Override public boolean isWrapperFor(Class<?> iface) throws SQLException { return proxyDataSource.isWrapperFor(iface); } @Override public PrintWriter getLogWriter() throws SQLException { return proxyDataSource.getLogWriter(); } @Override public void setLogWriter(PrintWriter out) throws SQLException { proxyDataSource.setLogWriter(out); } @Override public void setLoginTimeout(int seconds) throws SQLException { proxyDataSource.setLoginTimeout(seconds); } @Override public int getLoginTimeout() throws SQLException { return proxyDataSource.getLoginTimeout(); } @Override public Logger getParentLogger() throws SQLFeatureNotSupportedException { return proxyDataSource.getParentLogger(); } @Override public Connection getConnection() throws SQLException { return proxyDataSource.getConnection(); } @Override public Connection getConnection(String username, String password) throws SQLException { return proxyDataSource.getConnection(username, password); } }
相关推荐
JdkProxy.java
使用jdk proxy实现aop机制的一个小例子,写着给新手看看而已,老手们莫见笑
自己写的小例子,供学习参考。 public class StaticProxy implements Hello{ private HelloSpecker helloSpecker; public StaticProxy() { } public StaticProxy(HelloSpecker helloSpecker) { ...
JDK动态代理proxy的基本工作原理代码!!
简单的动态代理实现代码!文档参考博文Spring学习(3)AOP初步—JDK动态代理
使用JDK中的Proxy技术实现AOP功能与使用CGLIB实现AOP功能
AOP_1.入门及使用JDK中的Proxy技术实现
使用Nginx作为代理服务器,HTTP的接口代理没有问题,HTPPS的接口代理Java后台总是报错,主要是因为项目使用的JDK1.6,不支持TLS1.2导致握手失败。通过BouncyCastle的第三方jar包可以解决这个问题。也可以使用Nginx的...
NULL 博文链接:https://countme.iteye.com/blog/1130188
学习资料共同分享。请教一下,当变量的地址改变,原地址是否会空出来给其他程序使用?也就是会不会释放内存地址!
之前我已经写过了关于动态代理的两篇文章,本来以为这块应该没啥问题,没...public final class proxy extends Proxy implements MyService { private static Method m1; private static Method m4; private stati
proxy,jdkproxy-transaction,jdkproxy-salary,day02-itheima11-spring-08-cglibproxy,day02-itheima11-spring-09-aop.xml,day02-itheima11-spring-10-aop.xml.advice,day02-itheima11-spring-11-aop.xml.exception等...
Spring框架的JDK代理模式底层代码。有助理解Spring的Aop模式的代理
package org.sg.sgg.mode.proxy.jdkProxy.trendProxy2; /** * java JDK实现动态代理 * @author * */ public class Test2 { public static void main(String[] args) { UserService userService = new ...
Jdk动态代理,基于接口的代理示例 InovactionHandler Proxy
用来理解jdk基于接口的动态代理和cglib基于类的代理的区别
jdk1.7 模块是命名一个后端服务器组,组名必须为后端服务器站点域名,内部可以写多台服务器ip和port,还可以设置跳转规则及权重等等 ip_hash;代表使用ip地址方式分配跳转后端服务器,同一ip请求每次都会访问同一台...
* * * * JDK动态代理 JDK动态代理 JDK动态代理是通过java.lang.reflect.Proxy 类来实现的,我们可以调用Proxy类的newProxyInstance()方法来创建代理对象。对于使用业务接口的类,Spring默认会使用JDK动态代理来实现...
Java 代理 代理模式 静态代理与动态代理 常见的动态代理实现 JDK Proxy CGLIB JDK Proxy 和 CGLIB 的对比 动态代理的实际应用 Spring AOP
有一天在用回调模版的时候,忽然间又想到jdk自带的Proxy类似乎不是怎么好用,为何不把其做成回调模版呢,可以将其改造称类似spring Aop 代码如下: package com.fjx.proxy.up.test; import ...