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

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"/>

测试代码:

    @Testpublic 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"/>

第四步:编写测试程序

    @Testpublic 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"/>

第四步:编写测试程序

    @Testpublic 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> {@Overridepublic cat getObject() throws Exception {return new cat();}@Overridepublic Class<?> getObjectType() {return null;}
}

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

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

测试程序:

    @Testpublic 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.hqwc.cn/news/164994.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文掌握 Apache SkyWalking

Apache SkyWalking SkyWalking是一个开源可观测平台&#xff0c;用于收集、分析、聚合和可视化来自服务和云原生基础设施的数据。SkyWalking 提供了一种简单的方法来保持分布式系统的清晰视图&#xff0c;甚至跨云。它是一种现代APM&#xff0c;专为云原生、基于容器的分布式系…

大厂面试题-b树和b+树的理解

为了更清晰的解答这个问题&#xff0c;从三个方面来回答&#xff1a; a.了解二叉树、AVL树、B树的概念 b.B树和B树的应用场景 1.B树是一种多路平衡查找树&#xff0c;为了更形象的理解&#xff0c;我们来看这张图。 二叉树&#xff0c;每个节点支持两个分支的树结构&#xff…

2023年11月数据库流行度最新排名

点击查看最新数据库流行度最新排名&#xff08;每月更新&#xff09; 2023年11月数据库流行度最新排名 TOP DB顶级数据库索引是通过分析在谷歌上搜索数据库名称的频率来创建的 一个数据库被搜索的次数越多&#xff0c;这个数据库就被认为越受欢迎。这是一个领先指标。原始数…

四种常见分布式限流算法实现!

转载&#xff1a;四种常见分布式限流算法实现&#xff01; - 知乎 大家好&#xff0c;我是老三&#xff0c;最近公司在搞年终大促&#xff0c;随着各种营销活动“组合拳”打出&#xff0c;进站流量时不时会有一个小波峰&#xff0c;一般情况下&#xff0c;当然是流量越多越好&…

为什么HTTP用得很好的,开始普及HTTPS呢?

显而易见&#xff0c;现在的HTTP早已不安全&#xff0c;当我们在浏览各个网站时会发现HTTP前面都会显示不安全&#xff0c;因为HTTP是明文传输&#xff0c;一旦电脑被植入了木马&#xff0c;木马程序就会主动周期性发消息给Internet的控制终端&#xff0c;这样NAT小洞会一直敞开…

前端瀑布流怎么布局

假设你需要把页面搭建成这样&#xff0c;有两列元素&#xff0c;每个元素宽度一定&#xff0c;高度不一定。如何实现&#xff1f; 这种瀑布流布局有很多实现方式&#xff0c;比如Grid布局。 什么是Grid布局 Grid布局是一种很灵活的布局方式&#xff0c;他把你的页面划分成了很…

BeanUtils.copyProperties浅拷贝的坑你得知道?

今天想写一篇文章&#xff0c;主要关于深拷贝和浅拷贝相关的&#xff0c;主要是最近写代码的时候遇到一个BUG&#xff0c;刚好涉及到浅拷贝导致的问题。 问题背景 现在有一个需要是需要修改门店信息&#xff0c;门店也区分父门店和子门店&#xff0c;父门店被编辑更新是需要通过…

【Leetcode】【数据结构】【C语言】判断两个链表是否相交并返回交点地址

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode *tailAheadA;struct ListNode *tailBheadB;int count10;int count20;//分别找尾节点&#xff0c;并顺便统计节点数量&#xff1a;while(tailA){tailAtailA->next;c…

CSS 浮动

目标target✓ 能够说出来为什么需要浮动能够说出来浮动的排列特性能够说出来三种最常见的布局方式能够说出来为什么需要清除浮动,能够至少写出两种清楚浮动的方法能够利用Photoshop实现基本的切图能够利用Photoshop插件实现切图能够完成学成在线的页面布 传统网页布局的三种模…

ONLYOFFICE:让办公触手可及,随时随地释放创造力

本文目录 前言一、不限开发潜能&#xff0c;各种语言轻松上手二、适合多种用途&#xff0c;随时随地部署应用三、上手简单轻松&#xff0c;更快更好的体验感总结 前言 各位开发铁铁&#xff0c;今天给大家推荐一款非常实用的专用办公神器–ONLYOFFICE。 使用ONLYOFFICE解锁办…

kubernetes helm

一、helm Helm是Kubernetes 应用的包管理工具&#xff0c;主要用来管理 Charts&#xff0c;类似Linux系统的yum。Helm Chart 是用来封装 Kubernetes 原生应用程序的一系列 YAML 文件。可以在你部署应用的时候自定义应用程序的一些 Metadata&#xff0c;以便于应用程序的分发。…

【服务器使用】vscode winscp进行服务器容器连接(含修改初始密码)

1&#xff1a;获取docker的登陆信息 例如节点&#xff08;host&#xff09;、端口&#xff08;port&#xff09;、密码&#xff08;passwd&#xff09;等信息&#xff0c;这个自己找组内的前辈获取即可 2&#xff1a;配置config文件 找到vscode里面ssh处的config文件 人工找…