首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
CGLIB AopProxy实现 - CglibAopProxy
AopProxyFactory配置管理器 - AdvisedSupport
Advisor链工厂接口与实现 - AdvisorChainFactory
目标对象来源接口与实现 - TargetSource
代理对象创建基础类 - ProxyCreatorSupport
AdvisedSupport事件监听器 - AdvisedSupportListener
ProxyCreatorSupport标准实现 - ProxyFactory
ProxyCreatorSupport IoC容器实现 - ProxyFactoryBean
ProxyCreatorSupport AspectJ实现 - AspectJProxyFactory
IoC容器自动代理抽象 - AbstractAutoProxyCreator
IoC容器自动代理标准实现
IoC容器自动代理 AspectJ 实现 - AspectJAwareAdvisorAutoProxyCreator
AOP Infrastructure Bean接口 - AopInfrastructureBean
AOP上下文辅助类 - AopContext
代理工厂工具类 - AopProxyUtils
AOP工具类 - AopUtils
AspectJ Enable模块驱动实现 - @EnableAspectJAutoProxy
AspectJ XML配置驱动实现 -
AOP配置Schema-based 实现 -
Aspect Schema-based实现 -
Pointcut Schema-based实现 -
Around Advice Schema-based实现 -
Before Advice Schema-based实现 -
After Advice Schema-based实现 -
After Returning Advice Schema-based实现 -
After Throwing Advice Schema-based实现 -
Adviser Schema-based实现 -
Introduction Schema-based实现 -
作用域代理Schema-based实现 -
抽象工厂模式(Abstract factory)实现
构建器模式(Builder)实现
工厂方法模式(Factory method)实现
原型模式(Prototype)实现
单例模式(Singleton)实现
适配器模式(Adapter)实现
组合模式(Composite)实现
装饰器模式(Decorator)实现
享元模式(Flyweight)实现
代理模式(Proxy)实现
模板方法模式(Template Method)实现
责任链模式(Chain of Responsibility)实现
观察者模式(Observer)实现
策略模式(Strategy)实现
命令模式(Command)实现
状态模式(State)实现
Spring AOP在 Spring 事件(Events)
Spring AOP在Spring 事务(Transactions)理论基础
Spring AOP在Spring 事务(Transactions)源码分析
Spring AOP在Spring 缓存(Caching)
Spring AOP在Spring本地调度(Scheduling)
当前位置:
首页>>
技术小册>>
Spring AOP 编程思想(下)
小册名称:Spring AOP 编程思想(下)
### 原型模式(Prototype)实现 在深入探讨Spring AOP(面向切面编程)的高级特性之前,理解设计模式中的原型模式(Prototype)对于拓宽我们的编程视野、增强系统灵活性和可扩展性具有重要意义。原型模式是一种创建型设计模式,它允许通过复制现有的实例来创建新的对象,而不是通过类的实例化过程。这种方式在性能优化、避免大量初始化开销、或者需要动态创建大量相似对象时尤为有用。 #### 一、原型模式概述 ##### 1.1 定义与动机 原型模式定义了一个用于创建对象的接口,让子类决定实例化哪一个类。原型模式允许一个对象再创建另外一个可定制的对象,无需知道如何创建的细节。在Java等面向对象语言中,克隆(Cloning)是实现原型模式的关键技术。 动机主要源于两个方面:一是直接创建对象的开销可能很大,如对象初始化需要消耗大量资源或时间;二是系统中经常需要创建具有相同属性但又不完全相同的大量对象。 ##### 1.2 结构与角色 - **Prototype(抽象原型类)**:声明一个克隆自身的接口。 - **ConcretePrototype(具体原型类)**:实现一个克隆操作,该操作返回对象的一个拷贝。 - **Client(客户类)**:通过复制原型来创建新的对象实例。 #### 二、Java中的原型模式实现 在Java中,实现原型模式主要有两种方式:浅拷贝(Shallow Copy)和深拷贝(Deep Copy)。 ##### 2.1 浅拷贝 浅拷贝只复制对象本身和对象中的基本数据类型字段的值,而对象中的引用类型字段则复制引用,不复制引用的对象。这意味着,如果原型对象中的引用字段指向了某个对象,那么克隆出的对象中的相应引用字段也会指向同一个对象。 Java中,实现浅拷贝的一种简单方式是让类实现`Cloneable`接口并重写`Object`类的`clone()`方法。但需要注意的是,`clone()`方法保护级别是`protected`,因此它只能在类的内部或其子类中被调用。 ```java public class ShallowPrototype implements Cloneable { private int number; private List<String> strings = new ArrayList<>(); // 省略构造方法、getter和setter @Override protected ShallowPrototype clone() throws CloneNotSupportedException { return (ShallowPrototype) super.clone(); } // 示例方法,向列表添加字符串 public void addString(String str) { strings.add(str); } } // 使用 ShallowPrototype original = new ShallowPrototype(); original.addString("Hello"); try { ShallowPrototype cloned = original.clone(); cloned.addString("World"); // 这将影响original对象的strings列表 System.out.println(original.getStrings()); // 输出可能包含"Hello, World" } catch (CloneNotSupportedException e) { e.printStackTrace(); } ``` ##### 2.2 深拷贝 深拷贝则不仅复制对象本身和对象中的基本数据类型字段的值,还复制对象中的引用类型字段所指向的对象。这样,原对象和克隆对象中的引用字段将指向不同的对象。 实现深拷贝通常需要编写更多的代码,特别是当对象图中包含复杂的数据结构时。一种常见的做法是序列化和反序列化对象,但这要求对象及其所有子对象都实现了`Serializable`接口。 ```java import java.io.*; public class DeepPrototype implements Serializable { // 假设与ShallowPrototype相同结构和数据 // 使用序列化实现深拷贝 public DeepPrototype deepClone() throws IOException, ClassNotFoundException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(this); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return (DeepPrototype) ois.readObject(); } // 省略其他方法 } // 使用 DeepPrototype original = new DeepPrototype(); original.addString("Hello"); try { DeepPrototype cloned = original.deepClone(); cloned.addString("World"); // 这不会影响original对象的strings列表 System.out.println(original.getStrings()); // 输出"Hello" } catch (Exception e) { e.printStackTrace(); } ``` #### 三、原型模式在Spring中的应用 虽然Spring框架本身并不直接提供对原型模式实现的直接支持(如通过注解或XML配置直接声明一个Bean为原型),但Spring的依赖注入(DI)和IoC(控制反转)容器能够很好地与原型模式结合使用,实现类似的功能。 在Spring中,可以通过设置Bean的作用域为`prototype`来模拟原型模式的行为。每次从Spring容器中请求该Bean时,都会创建一个新的实例。 ```xml <!-- Spring XML配置 --> <bean id="myPrototypeBean" class="com.example.MyPrototypeClass" scope="prototype"/> ``` 或者使用Java配置: ```java @Configuration public class AppConfig { @Bean @Scope("prototype") public MyPrototypeClass myPrototypeBean() { return new MyPrototypeClass(); } } ``` 这样,每当需要一个新的`MyPrototypeClass`实例时,都可以通过`ApplicationContext`的`getBean`方法获取,而无需担心对象间的状态干扰。 #### 四、原型模式与Spring AOP的结合 虽然原型模式与Spring AOP的直接联系可能不那么直观,但了解原型模式对于在Spring应用中合理使用AOP非常重要。例如,当AOP切面(Aspect)应用于原型作用域的Bean时,需要特别注意切面的行为。因为每次请求原型Bean时都会创建一个新实例,如果切面中有状态信息(如计数器、缓存等),这些状态信息可能不会按预期跨实例共享或累积。 此外,在设计基于Spring的应用时,理解原型模式可以帮助开发者更好地规划Bean的作用域,从而优化应用的性能和资源使用。例如,对于需要频繁创建但又不需要持久化状态的组件,使用原型模式可以显著提高性能。 #### 五、总结 原型模式是一种强大的设计模式,它通过复制现有对象来创建新对象,从而避免了重复初始化的开销。在Java中,可以通过实现`Cloneable`接口并重写`clone()`方法来实现浅拷贝,或者通过序列化和反序列化实现深拷贝。Spring框架虽然不直接提供原型模式的实现,但通过其IoC容器和Bean作用域的概念,可以方便地模拟原型模式的行为。将原型模式与Spring AOP结合使用时,需要特别注意切面的作用域和状态管理,以确保应用的行为符合预期。通过深入理解原型模式及其在Spring中的应用,我们可以构建出更加灵活、高效和可扩展的Java应用。
上一篇:
工厂方法模式(Factory method)实现
下一篇:
单例模式(Singleton)实现
该分类下的相关小册推荐:
Java语言基础11-Java中的泛型
Java高并发秒杀入门与实战
java源码学习笔记
Java语言基础7-Java中的异常
深入拆解 Java 虚拟机
Java面试指南
Java语言基础14-枚举和注解
Java语言基础16-JDK8 新特性
深入理解Java虚拟机
SpringBoot合辑-高级篇
Java语言基础12-网络编程
JAVA 函数式编程入门与实践