Bean的四种实例化方式以及BeanFactory和FactoryBean的区别

news2024/12/23 0:31:38

2023.11.8

        Spring为Bean提供了多种实例化方式,通常包括4种方式。

  • 第一种:通过构造方法实例化
  • 第二种:通过简单工厂模式实例化
  • 第三种:通过factory-bean实例化
  • 第四种:通过FactoryBean接口实例化

通过构造方法实例化

创建一个bean:

package spring6.beans;

public class User {
    public User() {
        System.out.println("User类的无参构造方法执行");
    }
}

配置xml文件:

<bean id="UserBean" class="spring6.beans.User"/>

测试代码:

    @Test
    public void testConstructor(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        User user = applicationContext.getBean("UserBean", User.class);
        System.out.println(user);
    }

运行结果:

通过简单工厂模式实例化

        先介绍一下简单工厂模式和工厂方法模式:

简单工厂模式:

        客户端程序不需要关心对象的创建细节,需要哪个对象时,只需要向工厂索要即可,初步实现了责任的分离。客户端只负责“消费”,工厂负责“生产”。生产和消费分离。

缺点:

  • 工厂类集中了所有产品的创造逻辑,形成一个无所不知的全能类,有人把它叫做上帝类。显然工厂类非常关键,不能出问题,一旦出问题,整个系统瘫痪。

  • 不符合OCP开闭原则,在进行系统扩展时,需要修改工厂类。

Spring中的BeanFactory就使用了简单工厂模式。

工厂方法模式:

        工厂方法模式为每一个对象都创建一个工厂,既保留了简单工厂模式的优点,同时又解决了简单工厂模式的缺点。

优点:

  • 一个调用者想创建一个对象,只要知道其名称就可以了。
  • 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
  • 屏蔽产品的具体实现,调用者只关心产品的接口。

缺点:

  • 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。

第一步:定义一个Bean

package spring6.beans;

public class student {
}

第二步:编写简单工厂模式当中的工厂类

package spring6.beans;

public class personFactory {
    public static student get(){
        return new student();
    }
}

 第三步:在Spring配置文件中指定创建该Bean的方法(使用factory-method属性指定)

<bean id="student" class="spring6.beans.personFactory" factory-method="get"/>

第四步:编写测试程序

    @Test
    public void testSimpleFactory(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        student student = applicationContext.getBean("student", student.class);
        System.out.println(student);
    }

运行结果:

 通过factory-bean实例化

        这种方式本质上是:通过工厂方法模式进行实例化。

第一步:定义一个Bean

package spring6.beans;

public class dog {
}

第二步:定义具体工厂类,工厂类中定义实例方法

package spring6.beans;

public class dogFactory {
    public dog get(){
        return new dog();
    }
}

 第三步:在Spring配置文件中指定factory-bean以及factory-method

    <bean id="dogFactory" class="spring6.beans.dogFactory"/>
    <bean id="dog" factory-bean="dogFactory" factory-method="get"/>

第四步:编写测试程序

    @Test
    public void testSelfFactoryBean(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        dog dog = applicationContext.getBean("dog", dog.class);
        System.out.println(dog);
    }

运行结果:

通过FactoryBean接口实例化

        在上面那种方式中,factory-bean是我们自定义的,factory-method也是我们自己定义的。

        在Spring中,当你编写的类直接实现FactoryBean接口之后,factory-bean不需要指定了,factory-method也不需要指定了。

        FactoryBean在Spring中是一个接口。被称为“工厂Bean”。“工厂Bean”是一种特殊的Bean。所有的“工厂Bean”都是用来协助Spring框架来创建其他Bean对象的。

        factory-bean会自动指向实现FactoryBean接口的类,factory-method会自动指向getObject()方法。

第一步:定义一个Bean

package spring6.beans;

public class cat {
}

第二步:编写一个类实现FactoryBean接口

package spring6.beans;

import org.springframework.beans.factory.FactoryBean;

public class catFactory implements FactoryBean<cat> {

    @Override
    public cat getObject() throws Exception {
        return new cat();
    }

    @Override
    public Class<?> getObjectType() {
        return null;
    }
}

第三步:在Spring配置文件中配置FactoryBean

<bean id="cat" class="spring6.beans.catFactory"/>

测试程序:

    @Test
    public void testFactoryBean(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        cat cat = applicationContext.getBean("cat", cat.class);
        System.out.println(cat);
    }

运行结果:

BeanFactory和FactoryBean的区别

BeanFactory:

        BeanFactory是工厂,是Spring IoC容器的顶级对象,被翻译为“Bean工厂”,在Spring的IoC容器中,“Bean工厂”负责创建Bean对象。

FactoryBean:

在Spring中,Bean可以分为两类:

  • 第一类:普通Bean
  • 第二类:工厂Bean(工厂Bean也是一种Bean,只不过这种Bean比较特殊,它可以辅助Spring实例化其它Bean对象。) 

FactoryBean是一个Bean,是一个能够辅助Spring实例化其它Bean对象的一个Bean。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1185574.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL基础操作

注:mysql是大小写不敏感的. 1.数据库基础操作(展示) //1.展示当前数据库 show databases;//2.创建数据库 create database 数据库名;//3.使用数据库 use 数据库名;//4.删除数据库 drop database 数据库名;2.SQL中基本类型 2.1 数值类型(整数和浮点型) 注:decimal和numeric…

cortex-A7核IIC实验--采集温湿度传感器的值

1.IIC总线---同步串行半双工 1&#xff09;一根数据线SDA--PF15&#xff0c;一根时钟线SCL--PF14 2&#xff09;传输速率&#xff1a;低速&#xff1a;100K 中速&#xff1a;400K 全速&#xff1a;3.4M 3&#xff09;外接两个上拉电阻的作用&#xff1a;总线空闲状态时&am…

浅谈顺序表基本操作

&#x1f937;‍♀️&#x1f937;‍♀️&#x1f937;‍♀️ 今天给大家带来的是数据结构——顺序表的实现(增删查改)。 清风的CSDN博客主页 &#x1f389;欢迎&#x1f44d;点赞✍评论❤️收藏 &#x1f61b;&#x1f61b;&#x1f61b;希望我的文章能对你有所帮助&#xff…

刷题笔记day14-二叉树01

前序遍历 前序遍历的方式是&#xff1a;根节点、左节点、右节点。 /*** Definition for a binary tree node.* type TreeNode struct {* Val int* Left *TreeNode* Right *TreeNode* }*/ import "container/list"func preorderTraversal(root *TreeNode…

如何高效处理IT中的突发事件?

在当今快节奏的商业环境中&#xff0c;IT中的重大事件可能会意外发生&#xff0c;从而影响生产力和客户满意度。无论哪个行业&#xff0c;制定恢复计划并建立ITSM事件管理对于在危机时期确保业务连续性至关重要。 让我们来看一下某航空公司的运营&#xff0c;航空公司的运营很…

Alphago Zero的原理及实现:Mastering the game of Go without human knowledge

近年来强化学习算法广泛应用于游戏对抗上&#xff0c;通用的强化学习模型一般包含了Actor模型和Critic模型&#xff0c;其中Actor模型根据状态生成下一步动作&#xff0c;而Critic模型估计状态的价值&#xff0c;这两个模型通过相互迭代训练&#xff08;该过程称为Generalized …

YOLOv8-Seg推理详解及部署实现

目录 前言一、YOLOv8-Seg推理(Python)1. YOLOv8-Seg预测2. YOLOv8-Seg预处理3. YOLOv8-Seg后处理4. YOLOv8-Seg推理 二、YOLOv8-Seg推理(C)1. ONNX导出2. YOLOv8-Seg预处理3. YOLOv8-Seg后处理4. YOLOv8推理 三、YOLOv8-Seg部署1. 源码下载2. 环境配置2.1 配置CMakeLists.txt2.…

JavaScript 作用域链(Scope Chain)是什么?有什么作用?

结论先行&#xff1a; 当在函数内部访问一个变量的时候&#xff0c;&#xff08;JS 引擎&#xff09;程序会先在当前作用域中查找&#xff08;是否存在该变量&#xff09;&#xff0c;如果找到了就直接使用。否则就会向上层作用域逐级查找&#xff0c;直到找到全局作用域为止。…

高等数学教材重难点题型总结(一)函数与极限

强化阶段的另一个专题&#xff0c;本专题主要总结高数课本上的经典例题与课后题&#xff0c;尤其一部分加*标的题目&#xff0c;对于冲击高分的同学来说&#xff0c;必须熟练掌握。 &#xff08;蓝色代表难点&#xff0c;红色代表重点&#xff0c;紫色代表重难点&#xff09; …

Origin2023绘制双轴

在水文气象研究中&#xff0c;经常是把降水右轴并在顶部。具体操作如下&#xff1a; 1.先绘制径流曲线图 2.再添加一个图层&#xff0c;insert→new layer→Top-X-Right-Y 3.图层设置&#xff0c;添加降水序列&#xff0c;样式为柱状图 4.设置右轴的标注为600到0(保证倒立)&am…

没有接口文档如何进行接口测试(超详细~)

前言 在进行接口测试之前&#xff0c;一般开发会提供接口文档&#xff0c;给出一些接口参数和必要熟悉&#xff0c;便于我们编写接口脚本。但如果没有提供接口开发文档的请求下&#xff0c;我们该如何编写接口测试脚本呢&#xff1f;在编写测试脚本前要做哪些必要的准备呢&…

网络原理---拿捏网络层:IP协议

文章目录 IP协议4位版本4位首部长度、选项8位服务类型&#xff08;TOS&#xff09;16位总长度16位标识、3位标志、13位片偏移8位生存时间&#xff08;TTL&#xff09;8位协议16位首部校验和32位源IP地址、32位目的IP地址解决IP地址不够用的问题动态分配IP地址NAT机制&#xff0…

好消息,微信消费者投诉工具升级,可以直接回复用户、处理投诉了。。。

大家好&#xff0c;我是小悟 兄弟们&#xff0c;阅读本文之前&#xff0c;建议先阅读【连夜干出来一个自动处理【微信消费者投诉管理系统】&#xff0c;支持多商户】。 为了使工具更好用&#xff0c;也为帮助商户更好地处理消费者投诉&#xff0c;提升用户满意度&#xff0c;…

谷歌提出 AGI 完整路线图:目前 ChatGPT 只处于 AGI 的第一阶段

本心、输入输出、结果 文章目录 谷歌提出 AGI 完整路线图:目前 ChatGPT 只处于 AGI 的第一阶段前言谷歌 DeepMind 发布 AGI 分级框架发展 AGI 必须遵循6个基本原则什么是AGI图灵测试详解六大原则AGI 的五大发展过程阶段原文参考弘扬爱国精神谷歌提出 AGI 完整路线图:目前 Cha…

Fabric区块链浏览器搭建

目录 一、创建区块链浏览器相关目录二、配置docker-compose三、配置区块链浏览器四、启动区块链浏览器 书接这一回 Fabric二进制建链&#xff0c;在建好链之后&#xff0c;将为这条链部署一个区块链浏览器。 Hyperledger Fabric区块链浏览器地址&#xff1a;https://github.co…

计网----数据库(一)

计网----数据库&#xff08;一&#xff09; 一.什么是数据库 数据库是”按照数据结构来组织、存储和管理数据的仓库“。是一个长期储存在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。 二.数据库的特点 1.规范化的本地存储 2.加密 3.共享 三.数据库的好处…

[动态规划] (十四) 简单多状态 LeetCode LCR 091.粉刷房子

[动态规划] (十四) 简单多状态 LeetCode LCR 091.粉刷房子 文章目录 [动态规划] (十四) 简单多状态 LeetCode LCR 091.粉刷房子题目解析解题思路状态表示状态转移方程初始化和填表顺序返回值 代码实现总结 LCR 091. 粉刷房子 题目解析 (1) 一排房子&#xff0c;共有n个 (2) 染…

【电路笔记】-基尔霍夫电路定律

基尔霍夫电路定律 文章目录 基尔霍夫电路定律1、框架和定义2、基尔霍夫电流定律3、基尔霍夫电压定律4、基尔霍夫定律应用5、基尔霍夫定律的局限性6、总结 在本文中&#xff0c;将介绍最基本、最重要的电路定律之一。 这些法律由德国医生古斯塔夫基尔霍夫 (Gustav Kirchoff) 于 …

java数据结构--双端队列

一.概念 双端队列的意思是可以在头部和尾部添加和删除元素&#xff0c;更一般的单向链表队列比起来更加的灵活&#xff0c;下面我们用双向循环带哨兵链表和数组来分别实现 二.定义接口Dequeue /*** 双端队列*/ public interface Dequeue<E> {//队头添加元素boolean off…

MSSQL 配置ORACLE ​链接服务器

在有些场景&#xff0c;我们需要整合其他异构数据库的数据。我们可以使用代码去读取&#xff0c;经过处理后&#xff0c;再将数据保存到MSSQL数据库中。如果数据量比较大&#xff0c;但处理的逻辑并不复杂的情况下&#xff0c;这种方式就不是最好的办法。这时可以使用使用链接服…