工厂方法在Spring框架中的运用

我们都知道Spring中IOC是使用的工厂模式,但是对于实现细节就一知半解了,今天这篇文章就带大家解读Spring中是如何使用工厂模式的。

在上篇文章中我们懂了什么是工厂模式,这篇文章就带着学过的概念深入到Spring的内部看看究竟是怎么使用该模式的。

在Spring中使用工厂方法的是BeanFactory和FactoryBean<>接口。

一、BeanFactory使用工厂方法

使用了Spring框架,我们就很少自己进行对象的创建了,而我们使用到的对象当然就是交给Spring的工厂模式来创建的了。

其中BeanFactory是Spring容器的顶层接口,也是Bean工厂最上层的接口,其会有很多工厂实现例如ClassPathXmlApplicationContext、XmlWebApplicationContext其中最常见的就是DefaultListableBeanFactory,我们可以把BeanFactory看成是一种工厂方法模式。

在工厂方法模式中有四个角色:

1、抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 createProduct() 来创建产品。

2、具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。

3、抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。

4、具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。

BeanFactory是角色中的抽象工厂,而getBean就相当于我们实例中的createProduct()方法,用于创建对象。

DefaultListableBeanFactory等实现的工厂类就是角色中的具体工厂。

产品就是在我们开发中加上注解的@Controller@Service@compent@Configuration的类,Spring会将他们当成产品使用工厂模式生成对象。

在我们createProduct方法中是直接创建的对象,Spring肯定不会这么的笨,我们接着看getBean方法的实现方法。

getBean方法中一系列链路最终调用到doGetBean方法用于创建对象,在doGetBean中创建对象使用的是设计模式中的代理模式。

二、FactoryBean<>使用工厂方法

讲完BeanFactory,再介绍另外一个工厂模式的应用FactoryBean<>,想必大家也经常会比较这俩。

实际上,这两个接口都是用于创建对象,都可以看做是工厂方法模式的实现。

FactoryBean<>工厂通过getObject()方法来创建并返回对象,我们可以通过实现FactoryBean<>来定制化自己需要的Bean对象。

既然FactoryBean<>是留个开发者实现的,我们就手动实现一个FactoryBean<>。

@Component
public class MyFactoryBean<> implements FactoryBean<><Product>, BeanNameAware {
    private String name;
    @Override
    public Product getObject() throws Exception {
        return new Product();
    }

    @Override
    public Class<?> getObjectType() {
        return Product.class;
    }

    @Override
    public boolean isSingleton() {
        return false;
    }

    @Override
    public void setBeanName(String s) {
        this.name = name;
    }
}

接着我们分别使用两种方式getBean。

public static void main(String[] args) {

    //测试FactoryBean<>
    ApplicationContext ac =new AnnotationConfigApplicationContext(MyFactoryBean<>.class);

    System.out.println(ac.getBean("myFactoryBean<>"));

    System.out.println(ac.getBean("&myFactoryBean<>"));

}

只是在获取Bean时加了一个&会出现两种情况。

cn.sky1998.create.methodFactory.Product@52a86356
cn.sky1998.create.methodFactory.MyFactoryBean<>@5ce81285

doGetBean里面进行了判断是否是FactoryBean<>的实现类。

Spring对FactoryBean<>的实现机制是当你获取一个Bean时,如果获取的Bean的类型是FactoryBean<>,并且其name中并没有&则调用bean的getObject方法获取FactoryBean<>实现类中提供bean,否则就是直接返回普通的bean类型。

当我们在引入其他框架整合Spring时,便会有很多桥接整合包,例如mybatis-spring等,其中就会有FactoryBean<>的实现,例如SqlSessionFactoryBean<>、MapperFactoryBean<>等,将需要整合的定制化Bean通过工厂方法的模式,加入进Spring容器中。

当我们整合Mybatis时无论是多么的Bean都能很好的处理,mybatis-spring中的FactoryBean<>正是将Mybatis的核心启动类给调用出来。

三、BeanFactory和FactoryBean<>的异同

BeanFactory是Spring的一个大工厂,创建着Spring框架运行过程中所需要的Bean;

而FactoryBean<>是一个定制化工厂,其会存在于BeanFactory创建对象的过程中,当有需要时,会通过FactoryBean<>去自定制个性化的Bean,从而Spring框架提高扩展能力。

这篇文章加深工厂方法的理解的同时,又进一步的深入了BeanFactory和FactoryBean<>的实现细节。

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • 详解Spring工厂特性

    一.饿汉式创建优势 工厂创建之后,会将Spring配置文件中的所有对象都创建完成(饿汉式). 提高程序运行效率.避免多次IO,减少对象创建时间.(概念接近连接池,一次性创建好,使用时直接获取) 二.生命周期方法 自定义初始化方法:添加"init-method"属性,Spring则会在创建对象之后,调用此方法. 自定义销毁方法:添加"destroy-method"属性,Spring则会在销毁对象之前,调用此方法. 销毁:工厂的close()方法被调用之后,Spring

  • Spring的实例工厂方法和静态工厂方法实例代码

    Spring的实例工厂方法和静态工厂方法都可以用来实例化bean,本文我们就来看看相关实例. 静态工厂方法:直接调用静态方法可以返回Bean的实例 package com.zhu.string.factory; import java.util.HashMap; import java.util.Map; public class StaticCarFactory { /** * 静态工厂方法:直接调用静态方法可以返回Bean的实例 * */ private static Map<String

  • Spring框架通过工厂创建Bean的三种方式实现

    工厂模式 Spring中bean的创建,默认是框架利用反射new出来的bean实例.有时候也会有一些复杂的情况. 假设有一个飞机,属性如下,现在需要造很多同型号的飞机,那么唯一需要改变的属性只有DriverName(机长姓名),此时可以使用工厂模式帮我们创建对象,有一个专门帮我们创建对象的类帮我们创建对象,这个类就叫工厂. public class AirPlane { private String DriverName;// 机长姓名 private String AirPlaneName;/

  • Spring实战之调用实例工厂方法创建Bean操作示例

    本文实例讲述了Spring实战之调用实例工厂方法创建Bean操作.分享给大家供大家参考,具体如下: 一 配置 <?xml version="1.0" encoding="GBK"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" x

  • Spring工厂方法创建(实例化)bean实例代码

    目标明确 简单叙述一下本文想要解决的问题:如何在Spring中不再使用Spring创建Bean实例,而是把Bean创建过程转移到开发者手中. 思路清晰 创建Bean实例的方式: 1) 通过构造器(有参或无参) 方式: <bean id="" class=""/> 2) 通过静态工厂方法 方式: <bean id="" class="工厂类" factory-method="静态工厂方法"/

  • Spring实战之使用静态工厂方法创建Bean操作示例

    本文实例讲述了Spring实战之使用静态工厂方法创建Bean操作.分享给大家供大家参考,具体如下: 一 配置 <?xml version="1.0" encoding="GBK"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" x

  • 使用SpringBoot 工厂模式自动注入到Map

    目录 SpringBoot 工厂模式自动注入Map 一.建立工厂类 二.两个实现类 三.注入到map里,测试 SpringBoot自动注入原理 一.自动配置原理 二.细节 SpringBoot 工厂模式自动注入Map 一.建立工厂类 public interface AnimalFactory { String food(); String animal(); } 二.两个实现类 @Service public class Cat implements AnimalFactory { @Over

  • 通过工厂模式返回Spring Bean方法解析

    工厂返回的可以是一个具体的对象,比如造一辆车,可以返回一个自行车对象,或者汽车对象. 但是在Spring 中需要工厂返回一个具体的Service,这就是一个抽象工厂了 一种方法是反射,个人觉得这种方式不好: 还有一种方法是巧妙的使用Map对象,工厂的一个优点就是可扩展,对于这种方式可以说是体现的淋漓尽致了,可以定义多个map,map里也可以扩充 假设现在有一个接口类:BingService 以及实现了这个接口的两个实现类: OneBingServiceImpl,TwoBingServiceImp

  • Springboot中实现策略模式+工厂模式的方法

    策略模式和工厂模式相信大家都比较熟悉,但是大家有没有在springboot中实现策略和工厂模式? 具体策略模式和工厂模式的UML我就不给出来了,使用这个这两个模式主要是防止程序中出现大量的IF ELSE IF ELSE.....接下来咱们直接实现,项目结构图: 工厂类FactoryStrategy负责创建策略的工厂,代码比较简单,比较关键的一点是AutoWired一个Map<String, Strategy> 这个会在初始化的时候将所有的Strategy自动加载到Map中,是不是很方便.使用c

  • 工厂方法在Spring框架中的运用

    我们都知道Spring中IOC是使用的工厂模式,但是对于实现细节就一知半解了,今天这篇文章就带大家解读Spring中是如何使用工厂模式的. 在上篇文章中我们懂了什么是工厂模式,这篇文章就带着学过的概念深入到Spring的内部看看究竟是怎么使用该模式的. 在Spring中使用工厂方法的是BeanFactory和FactoryBean<>接口. 一.BeanFactory使用工厂方法 使用了Spring框架,我们就很少自己进行对象的创建了,而我们使用到的对象当然就是交给Spring的工厂模式来创建

  • 设计模式在Spring框架中的应用汇总

    这篇文章主要介绍了设计模式在Spring框架中的应用汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在开始正文之前,请你先思考几个问题: 你项目中有使用哪些 GOF 设计模式 说一说 GOF 23 种设计模式的设计理念 说说 Spring 框架中如何实现设计模式 假设我是面试官问起了你这些面试题,你该如何回答呢,请先思考一分钟. 好的,我们开始进入正题.设计模式实践里面提供了许多经久不衰的解决方案和最佳方案.这里,GOF 设计模式主要分为三

  • Spring 框架中注入或替换方法实现

    无状态 Bean 的作用域是 singleton 单实例,如果我们向 singleton 的 Bean A 注入 prototype 的 Bean B,并希望每次调用 Bean A 的 getBeanB() 时都能返回一个新的 Bean B ,这样的要求使用传统的注入方式是无法实现的 . 因为 singleton 的 Bean 注入关联 Bean 的动作只发生一次,虽然 Bean B 的作用域是 prototype 类型,但通过 getBeanB() 返回的对象还是最开始注入的那个 bean B

  • 在Java Spring框架中使用的设计模式有哪些

    目录 1 简单工厂模式 2 工厂方法模式 3 单例模式 4 代理模式 好处 静态代理 动态代理 1 简单工厂模式 当A对象需要调用B对象的方法时,我们需要在A中new一个B的实例,我们把这种方式叫作硬编码耦合,缺点是一旦需求发生变化,比如需要使用C类来代替B时,就要改写A类的方法. 假如应用中有上千个类以硬编码的方式耦合了B,改就很头疼. 于是有了简单工厂模式,又叫静态工厂方法,就是由一个工厂类根据传入参数,动态决定应该创建哪个产品类. Spring中的BeanFactory就是简单工厂模式的体

  • Spring框架中IoC容器与DI依赖注入教程

    目录 一.Spring 是什么 1.1 什么是容器 1.2 什么是 IoC 二.理解 IoC 2.1 传统程序开发的问题 2.2 分析 2.3 控制反转式程序开发 2.4 对比总结规律 2.5 理解 Spring IoC 三.DI 概念说明 四.总结 一.Spring 是什么 我们通常所说的 Spring 指的是 Spring Framework (Spring 框架),它是⼀个开源框架,有着活跃而庞大的社区,这就是它之所以能长久不衰的原因.Spring ⽀持⼴泛的应⽤场景,它可以让 Java

  • 深入理解Java的Spring框架中的IOC容器

    Spring IOC的原型 spring框架的基础核心和起点毫无疑问就是IOC,IOC作为spring容器提供的核心技术,成功完成了依赖的反转:从主类的对依赖的主动管理反转为了spring容器对依赖的全局控制. 这样做的好处是什么呢? 当然就是所谓的"解耦"了,可以使得程序的各模块之间的关系更为独立,只需要spring控制这些模块之间的依赖关系并在容器启动和初始化的过程中将依据这些依赖关系创建.管理和维护这些模块就好,如果需要改变模块间的依赖关系的话,甚至都不需要改变程序代码,只需要将

  • Spring框架中 @Autowired 和 @Resource 注解的区别

    Spring框架中 @Autowired 和 @Resource 注解的区别 在 spring 框架中,除了使用其特有的注解外,使用基于 JSR-250 的注解,它包括 @PostConstruct, @PreDestroy 和 @Resource 注释. 首先,咱们简单了解 @PostConstruct 和 @PreDestroy 注释: 为了定义一个 bean 的安装和卸载,我们可以使用 init-method 和 destroy-method 参数简单的声明一下 ,其中 init-meth

  • Java的Spring框架中AOP项目的一般配置和部署教程

    0.关于AOP 面向切面编程(也叫面向方面编程):Aspect Oriented Programming(AOP),是软件开发中的一个热点,也是Spring框架中的一个重要内容.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. AOP是OOP的延续. 主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等. 主要的意图是:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过

  • 使用spring框架中的组件发送邮件功能说明

    Spring框架是由于软件开发的复杂性而创建的.Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Spring的用途不仅仅限于服务器端的开发.从简单性.可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益. 首先进入自己的QQ邮箱,在设置中修改账户信息 然后来至底部 点击开启,再用手机发送对应信息到指定号码,然后点击我已发送 获取授权码 注意提示: 到这里,相信你已经开通了SMTP服务,这样就可以在java code发送邮件了 接下来的是S

  • Spring框架中一个有用的小组件之Spring Retry组件详解

    1.概述 Spring Retry 是Spring框架中的一个组件, 它提供了自动重新调用失败操作的能力.这在错误可能是暂时发生的(如瞬时网络故障)的情况下很有帮助. 在本文中,我们将看到使用Spring Retry的各种方式:注解.RetryTemplate以及回调. 2.Maven依赖 让我们首先将spring-retry依赖项添加到我们的pom.xml文件中: <dependency> <groupId>org.springframework.retry</groupI

随机推荐