首页
技术小册
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 编程思想(下)
### 工厂方法模式(Factory Method)实现 在《Spring AOP 编程思想(下)》一书中,深入探讨Spring框架的高级特性及其背后的设计模式是不可或缺的章节。本章将聚焦于“工厂方法模式”(Factory Method Pattern)的实现与应用,该模式作为创建型设计模式的一种,旨在定义一个用于创建对象的接口,但让子类决定要实例化的类是哪一个。这种模式在Spring框架中得到了广泛的应用,特别是在Bean的创建和管理上,展现了其灵活性和解耦的优势。 #### 一、工厂方法模式概述 **1.1 定义与原理** 工厂方法模式是一种创建型设计模式,其核心在于定义一个创建对象的接口,但让子类决定实例化哪一个类。工厂方法让类的实例化推迟到子类中进行。这样,一个类的实例化就不会在编译时就确定下来,而是由运行时决定,从而实现了类的解耦和灵活配置。 **1.2 结构分析** - **Product(产品类)**:定义了产品的接口,是工厂方法模式所创建的对象的超类型,也就是产品对象的共同接口。 - **ConcreteProduct(具体产品类)**:实现了Product接口的具体类,被创建的对象,是此模式的核心。 - **Creator(创建者类)**:声明了工厂方法,该方法返回一个Product类型的对象。Creator也可以定义一个工厂方法的默认实现,用于创建Product类型对象的默认版本。 - **ConcreteCreator(具体创建者类)**:实现Creator接口,并具体实现工厂方法,返回一个ConcreteProduct实例。 **1.3 优点与缺点** - **优点**: - 用户只需要知道具体创建者的类名,就可以创建出所需的产品对象,而无须知道这些产品类是如何被创建、如何组织的。 - 有利于产品族的扩展。增加一个新的产品类,只需要增加一个具体的产品类和对应的具体创建者类,原有系统无须做任何修改,符合开闭原则。 - 提高了系统的灵活性和可扩展性。 - **缺点**: - 在类的层次结构中增加了复杂性,因为需要增加抽象层和接口层。 - 增加了系统的抽象性和理解难度。 #### 二、Spring中的工厂方法模式 在Spring框架中,工厂方法模式的应用主要体现在Bean的创建和管理上,尤其是通过FactoryBean接口和`@Bean`注解来实现。 **2.1 FactoryBean接口** `FactoryBean`是Spring提供的一个高级接口,允许用户自定义Bean的创建逻辑。当一个Bean实现了`FactoryBean`接口时,Spring容器不会直接返回该Bean的实例,而是返回该Bean的`getObject()`方法的返回值作为实际的Bean。 ```java public interface FactoryBean<T> { T getObject() throws Exception; Class<?> getObjectType(); boolean isSingleton(); } ``` - `getObject()`: 返回由FactoryBean创建的Bean实例。 - `getObjectType()`: 返回FactoryBean创建的Bean的类型。 - `isSingleton()`: 返回FactoryBean创建的Bean是否为单例。 使用`FactoryBean`可以灵活地控制Bean的创建过程,实现复杂的依赖关系和初始化逻辑。 **2.2 @Bean注解** 在Spring的Java配置中,`@Bean`注解提供了一种声明Bean的方法,允许在配置类中直接定义Bean的创建逻辑。这实际上也是工厂方法模式的一种应用,因为配置类扮演了创建者的角色,而`@Bean`注解标记的方法则相当于工厂方法。 ```java @Configuration public class AppConfig { @Bean public MyBean myBean() { return new MyBean(); } } ``` 在上面的例子中,`AppConfig`类是一个配置类,它使用`@Configuration`注解标记。`myBean()`方法通过`@Bean`注解被声明为一个Bean的工厂方法,Spring容器在启动时会自动调用这个方法并注册返回的`MyBean`实例作为Bean。 #### 三、工厂方法模式在Spring AOP中的应用 虽然工厂方法模式本身并不直接关联于AOP(面向切面编程),但Spring AOP的实现机制,特别是关于Advice(通知)、Pointcut(切入点)和Advisor(顾问)的创建和管理,都隐含了工厂方法模式的思想。 在Spring AOP中,`AspectJAutoProxyCreator`是一个关键的Bean后处理器(BeanPostProcessor),它负责为符合条件的Bean创建代理对象。这个过程可以看作是工厂方法模式的一个应用实例: - **Product(产品类)**:在这里,可以看作是目标对象(即需要被增强的Bean)。 - **ConcreteProduct(具体产品类)**:目标对象的具体实现。 - **Creator(创建者类)**:`AspectJAutoProxyCreator`作为创建者,定义了如何为目标对象创建代理对象的接口(即BeanPostProcessor接口)。 - **ConcreteCreator(具体创建者类)**:虽然`AspectJAutoProxyCreator`本身已经足够具体,但我们可以将其看作是一个具体的创建者类,它根据目标对象的配置和切面的定义,动态地创建代理对象。 在这个过程中,`AspectJAutoProxyCreator`通过检查目标对象的配置和切面的定义,决定是否需要为目标对象创建代理,以及如何创建代理(例如,JDK动态代理或CGLIB代理)。这种动态决策和创建过程正是工厂方法模式所倡导的。 #### 四、实践案例:自定义FactoryBean 为了更深入地理解工厂方法模式在Spring中的应用,我们可以实现一个简单的`FactoryBean`来创建特定的Bean实例。 ```java public class MyFactoryBean implements FactoryBean<MyProduct> { @Override public MyProduct getObject() throws Exception { // 复杂的创建逻辑,如读取配置文件、进行依赖注入等 return new MyProductImpl(); } @Override public Class<?> getObjectType() { return MyProduct.class; } @Override public boolean isSingleton() { // 根据实际情况返回是否为单例 return true; } } // 配置文件或Java配置类中使用 @Bean public FactoryBean<MyProduct> myProductFactoryBean() { return new MyFactoryBean(); } // 或者直接使用@Bean注解自动推断类型(需要Spring 4.3及以上版本) @Bean public MyProduct myProduct() { return new MyFactoryBean().getObject(); // 注意:这里通常不推荐直接调用getObject(),仅作为示例 } // 更推荐的方式是让Spring管理FactoryBean,并通过FactoryBean的ID来获取Bean ``` 在上面的例子中,我们定义了一个`MyFactoryBean`类来实现`FactoryBean`接口,用于创建`MyProduct`类型的Bean。然后,在配置类中,我们可以选择将`MyFactoryBean`本身注册为Bean,或者通过`@Bean`注解直接返回`MyProduct`实例(但这种方式通常不是`FactoryBean`的典型用法)。 #### 五、总结 工厂方法模式在Spring框架中得到了广泛的应用,特别是在Bean的创建和管理上。通过`FactoryBean`接口和`@Bean`注解,Spring提供了灵活且强大的Bean创建机制,使得开发者可以轻松地控制Bean的创建过程,实现复杂的依赖关系和初始化逻辑。同时,Spring AOP的实现机制也隐含了工厂方法模式的思想,通过动态代理技术为目标对象创建代理对象,实现面向切面的编程。理解并掌握工厂方法模式在Spring中的应用,对于深入理解Spring框架的底层原理和提高Spring应用的开发效率具有重要意义。
上一篇:
构建器模式(Builder)实现
下一篇:
原型模式(Prototype)实现
该分类下的相关小册推荐:
经典设计模式Java版
Java面试指南
Java必知必会-Maven高级
手把手带你学习SpringBoot-零基础到实战
Java语言基础3-流程控制
Java语言基础2-运算符
Java语言基础12-网络编程
Java语言基础14-枚举和注解
Mybatis合辑1-Mybatis基础入门
SpringBoot合辑-初级篇
Java语言基础7-Java中的异常
Java语言基础4-数组详解