代理可以分为静态代理和动态代理,前者由开发人员自己编写,后者由工具生成。
在具体实现时,又有实现接口方式和继承方式的区别。
以下对这2种组合共4种方式做个简单说明:
1。静态代理,实现接口方式。即GoF的Proxy parttern。
通过代理对象和被代理的对象实现同一接口来实现。
例如
java 代码
- public interface BookDao {
-
- List queryByName(String bookName);
-
- Book getByIsdn(String isdn);
- }
java 代码
- public class BookDaoImpl implements BookDao {
-
- public Book getByIsdn(String isdn) {
-
- return null;
- }
-
- public List queryByName(String bookName) {
-
- return null;
- }
-
- }
java 代码
- public class BookDaoLogProxy implements BookDao{
- private Logger logger=Logger.getLogger("BookDaoLogProxy");
-
- private BookDao bookDao;
- public void setBookDao(BookDao bookDao) {
- this.bookDao = bookDao;
- }
-
- public Book getByIsdn(String isdn) {
- logger.info("getByIsdn: "+isdn);
- return bookDao.getByIsdn(isdn);
- }
-
- public List queryByName(String bookName) {
- logger.info("queryByName: "+bookName);
- return bookDao.queryByName(bookName);
- }
-
- }
BookDaoLogProxy是代理类,在使用时,把BookDaoImpl的对象注入到BookDaoLogProxy的实例中即可。
这种方式大家都比较熟悉。
2。动态代理,实现接口的方式。
在JDK1.3起,java就支持动态代理的创建,但是对被代理的对象有一个要去就是必须实现了接口。
java 代码
- import java.lang.reflect.InvocationHandler;
- import java.lang.reflect.Method;
- import java.lang.reflect.Proxy;
-
- public class LogProxyFactory implements InvocationHandler {
- private static Logger logger = Logger.getLogger("TransactionProxyFactory");
-
- private Object target = null;
-
- private LogProxyFactory(Object target) {
- this.target = target;
- }
-
- public Object invoke(Object proxy, Method method, Object[] args)
- throws Throwable {
- logger.info("<invoke></invoke> " + target.getClass().getName() + ": "
- + method.toGenericString());
- Object rv = null;
- rv = method.invoke(target, args);
- return rv;
- }
-
- public static Object getProxy(Object target) {
- InvocationHandler handler = new LogProxyFactory(target);
-
- Object proxy = Proxy.newProxyInstance(target.getClass()
- .getClassLoader(), target.getClass().getInterfaces(), handler);
- return proxy;
- }
- }
LogProxyFactory是一个动态代理的工厂,只需调用getProxy(bookDaoImpl)即可得到BookDaoImpl的动态代理(bookDaoImpl是BookDaoImpl的实例)。
关于动态代理,更多的资料请看相关的文档或者书籍。
3。静态代理,继承方式。
通过继承被代理的对象并覆盖它的方法来实现代理的目的。
例如:
java 代码
- public class BookDao {
-
- public Book getByIsdn(String isdn) {
-
- return null;
- }
-
- public List queryByName(String bookName) {
-
- return null;
- }
-
- }
java 代码
- public class BookDaoLogProxy extends BookDao {
- private Logger logger=Logger.getLogger("BookDaoLogProxy");
-
- public Book getByIsdn(String isdn) {
- logger.info("getByIsdn: "+isdn);
- return super.bookDao.getByIsdn(isdn);
- }
-
- public List queryByName(String bookName) {
- logger.info("queryByName: "+bookName);
- return super.bookDao.queryByName(bookName);
- }
-
- }
这样的实现方式不需要代理类和被代理的对象实现任何接口,且代理类可以使用被代理对象的保护资源。但是代理类和被代理的对象有紧密的耦合。
4。动态代理,继承方式。
这种方式需要字节码生成的第三方工具来实现,原理即通过覆盖父类的方法来实现代理。
Hibernate对PO就是使用了这样的方式来使在PO的数据改变时,Hibernate能对数据库中的数据进行更新。
字节码生成我也没玩过,这里就不举例子了。
总结一下,
通过实现接口的方式,优点是代理类和被代理的对象耦合度比较低,而且遵循面向接口编程的原则。
通过继承方式的优点则是不需要实现接口,且能使用被代理的对象的资源,但是耦合紧密。
动态代理相对于静态代理来说,减少了代码的重复。
以上即实现代理的四种方式,说的不是很详细,如果有不对的地方,请指正。
分享到:
相关推荐
本篇文章将深入探讨Spring AOP的四种常见实现方式。 一、基于接口的代理(Interface-Based Proxy) 这是Spring AOP最基础的实现方式,适用于目标对象实现了特定接口的情况。Spring会创建一个代理对象,该对象实现...
Spring 框架提供了四种方式来实现Aspect-Oriented Programming(AOP),分别是经典的基于代理的 AOP、@AspectJ 注解驱动的切面、纯 POJO 切面和注入式 AspectJ 切面。下面将详细介绍这四种方式。 一、AOP 概念 在...
本篇文章将详细探讨Spring实现AOP的四种主要方法:基于代理的方式、基于AspectJ的注解方式、基于XML的AOP配置以及基于Java的AOP配置。 1. 基于代理的实现 Spring的AOP支持两种代理类型:JDK动态代理和CGLIB代理。...
**Java 动态代理**是Java标准库提供的另一种实现AOP的方式,主要针对接口。它允许我们创建一个代理类,该类在调用目标接口方法之前和之后执行自定义逻辑。这在处理基于接口的切面时非常有用。 ```java interface ...
本文将详细介绍Spring实现AOP的四种方式,包括基于代理的经典方式、@AspectJ注解驱动、纯POJO切面以及注入式AspectJ切面。 首先,理解AOP的基本概念: 1. **通知(Advice)**:通知定义了切面在何时执行,Spring支持...
下面我们将详细探讨Spring实现AOP的四种主要方式。 1. **基于注解的AOP** Spring框架自2.5版本开始支持基于注解的AOP,这种方式无需XML配置,更加简洁直观。开发者可以在方法上使用`@Aspect`、`@Before`、`@After`...
本篇文章将详细讲解Spring AOP的四种常见实现方式,以帮助开发者更好地理解和运用这一功能。 一、基于接口的代理(Interface-Based Proxy) 这是Spring AOP的默认实现方式,适用于目标对象实现了接口的情况。Spring...
#### 三、四层与七层反向代理的实现方式 **3.1 实现技术** - **常用工具**: - **Nginx/Apache**:适合实现七层反向代理,支持复杂的路由规则和HTTP头处理。 - **LVS**:主要用于四层反向代理,能够高效处理大量...
Java 实现的代理服务器是一种网络通信工具,它允许客户端通过该服务器作为中介与目标服务器进行交互,从而隐藏了客户端的真实身份或提供了额外的安全性。在本项目中,我们主要关注的是实现了 SOCKS4 和 SOCKS5 协议...
#### 四、HTTP 代理服务器实现细节 1. **剥离域名/IP**:根据题目描述,在代理服务器接收到 IE 发送的 HTTP 请求时,需要移除请求中的目标服务器域名或 IP 地址,然后再将请求转发给目标服务器。这是因为某些网站...
SLB还可以实现四层代理和七层代理两种方式的负载均衡。 三、nginx 和SLB结合测试 在实际应用中,我们可以将nginx 和SLB结合使用,以实现更加灵活和可靠的负载均衡。我们的测试结果表明,nginx 可以作为SLB的反向...
第四种方式:基于类的代理 这种方式适用于不使用接口的情况。在类上直接使用 @Transactional 注解,Spring 会创建基于类的代理,但是这种方式可能导致一些问题,例如:无法通过子类覆盖父类的方法来改变事务属性。 ...
AOP的四种配置方式主要包括:注解驱动、XML配置、编程式和自动代理。下面我们将详细讨论这四种方式。 1. **注解驱动**: 使用Java注解是最常见的AOP配置方式。在Spring中,我们可以在切面类上使用`@Aspect`注解...
Spring的自动代理功能,特别是`BeanNameAutoProxyCreator`,为我们提供了一种灵活的方式,能够在不改动原有业务代码的基础上增强服务功能。通过合理地配置和使用,可以极大地提升代码的可维护性和复用性。在实际开发...
#### 四、利用Java动态代理实现AOP的具体步骤 1. **定义业务接口**:首先定义一个业务接口`BusinessInterface`,该接口包含需要被代理的方法。 ```java public interface BusinessInterface { void ...
根据给定的信息,本文将详细解析如何使用 Delphi 实现 IE 代理服务器设置程序的关键技术点,包括 ...这种方式不仅可以帮助用户方便地管理 IE 的代理设置,而且也为开发者提供了一种有效的方法来扩展应用程序的功能。
静态代理是通过手动编写代理类来实现代理的,而动态代理则是通过使用代理工厂或代理类生成器来生成代理对象。 二、静态代理 静态代理是通过手动编写代理类来实现代理的。例如,我们可以创建一个MathProxy类,它...
以下是对这四种方式的详细说明: 1. **Activity跨进程调用**: - 通过Intent对象,特别是通过指定Action(字符串ID)来启动其他应用的公开Activity。比如,Intent.ACTION_CALL常量用于启动拨打电话的Activity。 -...
第四种方式是完全绕过Struts,直接使用Spring MVC框架。Spring MVC是Spring框架的一部分,提供了一套完整的MVC实现,包括控制器、视图解析器、表单标签库等。相比于Struts,Spring MVC提供了更简洁的代码结构和更...