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。 首先,我们需要定义一个接口,这个接口将代表我们要进行代理的目标对象的行为。例如,我们可以创建一个名为`Service`的接口: ```java public interface Service { ...
标题"Spring_0300_JDKProxy"暗示我们将讨论Spring如何使用JDK的Proxy类来实现动态代理。在Spring中,`org.springframework.aop.framework.ProxyFactoryBean`或`org.springframework.aop.framework.ProxyFactory`可以...
针对标题"mybatis_jdk_proxy.zip",我们可以推断这是一个关于MyBatis框架使用Java JDK代理(JDK Proxy)的相关学习资料。下面将详细解释这个主题。 MyBatis是一个流行的持久层框架,它允许开发者通过简单的XML或...
自己写的小例子,供学习参考。 public class StaticProxy implements Hello{ private HelloSpecker helloSpecker; public StaticProxy() { } public StaticProxy(HelloSpecker helloSpecker) { ...
JDK动态代理,全称为Java Dynamic Proxy,是Java标准库提供的一种强大且灵活的机制,允许我们在运行时创建代理类来实现指定的接口。这种机制主要用于实现AOP(面向切面编程)或为已有接口提供额外的功能,如日志、...
:JDK Proxy 使用 Java 反射机制,而 CGLib 使用字节码生成技术。 4. 什么是深克隆和浅克隆?:深克隆是完全复制对象,而浅克隆是只复制对象的引用。 5. 如何实现深克隆?:可以使用对象的 clone() 方法或序列化机制...
在Spring AOP中,如果目标对象实现了至少一个接口,那么Spring会选择使用JDK Proxy。以下是一个简单的示例: ```java public interface MyService { void doSomething(); } public class MyServiceImpl ...
在Java中,我们可以使用JDK的动态代理(Proxy)来实现AOP的功能,这主要涉及到反射和接口编程。 **JDK动态代理的工作原理** JDK的Proxy类提供了一种机制,可以创建一个代理对象,该对象在调用方法时会执行自定义的...
在Java领域,我们可以使用Spring框架提供的AOP支持,但本实例主要讨论的是如何使用JDK自身的动态代理(Proxy)技术来实现AOP。 JDK的Proxy类提供了创建动态代理对象的能力,这个代理对象可以代表一个或多个实现了...
JDK代理适用于目标对象实现了接口的情况,而CGLIB代理则是在目标对象没有接口或者接口数量过多时使用,它通过字节码技术创建一个目标对象的子类来实现代理。 在Spring的源码中,`org.springframework.aop.framework...
使用Nginx作为代理服务器,HTTP的接口代理没有问题,HTPPS的接口代理Java后台总是报错,主要是因为项目使用的JDK1.6,不支持TLS1.2导致握手失败。通过BouncyCastle的第三方jar包可以解决这个问题。也可以使用Nginx的...
本示例"JDKProxy"着重于对比两种常见的动态代理技术:JDK的接口代理和CGLIB的类代理。这两种代理方式在Java应用程序中都有广泛的应用,例如在AOP(面向切面编程)框架如Spring中。 首先,我们来深入了解一下JDK的...
4. **动态代理增强**:通过java.lang.reflect.Proxy类,JDK6支持接口方法的默认实现,使得动态代理更加灵活。 5. **脚本语言支持**:JDK6通过JSR 223引入了对JavaScript和其他脚本语言的支持,使得Java平台可以嵌入...
4. **动态代理**:在JDK 1.6中,Java引入了Java.lang.reflect.Proxy类,允许创建动态代理对象,这对于实现AOP(面向切面编程)等设计模式非常有用。 5. **NIO.2**:Java NIO (Non-blocking Input/Output) 在1.6版本...
- **动态代理类**:在Java 1.6中,可以使用`java.lang.reflect.Proxy`类创建动态代理类,用于实现接口的动态方法调用。 - **改进的内存管理**:垃圾回收器进行了优化,提高了内存管理效率,降低了应用暂停时间。 ...
3. **创建动态代理对象**:使用`Proxy.newProxyInstance`方法创建动态代理对象,传入ClassLoader、接口数组和上一步骤创建的InvocationHandler实例。 4. **调用代理对象的方法**:当调用代理对象的方法时,会自动...
"使用说明.txt"文件可能包含关于如何配置环境变量、启动Java应用程序或使用特定工具的详细步骤。务必仔细阅读并按照说明进行操作,以确保Java开发环境的正确配置。 总的来说,Java JDK 1.6对于当时的开发者来说是一...
Proxy 类是 JDK 中的动态代理类,是动态代理的核心类,其作用类似于代理模式中的代理。Proxy 类中包含的全是静态的方法和成员变量,这是一个纯粹的工具类,因此其源代码中含有一个私有的构造器,在某种意义上可以看...
- **只能代理实现了接口的类**:这是JDK动态代理的一个限制,如果目标对象没有实现任何接口,则无法使用JDK动态代理。 - **性能开销**:虽然这种开销通常很小,但在高并发场景下可能会成为瓶颈。 通过上述分析,...