news 2026/9/3 2:50:05

(16)Bean的实例化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
(16)Bean的实例化

Spring为Bean提供了多种实例化方式,通常包括4种方式。(也就是说在Spring中为Bean对象的创建准备了多种方案,目的是:更加灵活)

  • 第一种:通过构造方法实例化
  • 第二种:通过简单工厂模式实例化
  • 第三种:通过factory-bean实例化
  • 第四种:通过FactoryBean接口实例化
    注意:无论哪种实例化方法底层还是通过构造方法实现的

第一种:通过构造方法实例化

实际上我们前面学的都是通过第一种方法:通过构造方法实例化来使得Bean的实例化
第一步:定义一个Bean

packagecom.powernode.spring6.bean;/** * @author 动力节点 * @version 1.0 * @className Vip * @since 1.0 **/publicclassVip{}

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

packagecom.powernode.spring6.bean;/** * @author 动力节点 * @version 1.0 * @className VipFactory * @since 1.0 **/publicclassVipFactory{publicstaticVipget(){returnnewVip();}}

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

<beanid="vipBean"class="com.powernode.spring6.bean.VipFactory"factory-method="get"/>

第四步:编写测试程序

@TestpublicvoidtestSimpleFactory(){ApplicationContextapplicationContext=newClassPathXmlApplicationContext("spring.xml");Vipvip=applicationContext.getBean("vipBean",Vip.class);System.out.println(vip);}

第二种:通过简单工厂模式实例化

第一步:定义一个Bean

packagecom.powernode.spring6.bean;/** * @author 动力节点 * @version 1.0 * @className Vip * @since 1.0 **/publicclassVip{}

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

packagecom.powernode.spring6.bean;/** * @author 动力节点 * @version 1.0 * @className VipFactory * @since 1.0 **/publicclassVipFactory{publicstaticVipget(){returnnewVip();}}

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

<beanid="vipBean"class="com.powernode.spring6.bean.VipFactory"factory-method="get"/>

第四步:编写测试程序

@TestpublicvoidtestSimpleFactory(){ApplicationContextapplicationContext=newClassPathXmlApplicationContext("spring.xml");Vipvip=applicationContext.getBean("vipBean",Vip.class);System.out.println(vip);}

通过factory-bean实例化

这种方式本质上是:通过工厂方法模式进行实例化。
即告诉spring这个构造方法到底在哪里,底层还是通过构造方法实现的
第一步:定义一个Bean

packagecom.powernode.spring6.bean;/** * @author 动力节点 * @version 1.0 * @className Order * @since 1.0 **/publicclassOrder{}

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

packagecom.powernode.spring6.bean;/** * @author 动力节点 * @version 1.0 * @className OrderFactory * @since 1.0 **/publicclassOrderFactory{publicOrderget(){returnnewOrder();}}

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

<!--因为一种产品对应一个工厂,所以要将工厂也要实例化交给spring管理,即注册bean--><beanid="orderFactory"class="com.powernode.spring6.bean.OrderFactory"/><beanid="orderBean"factory-bean="orderFactory"factory-method="get"/>

第四步:编写测试程序

@TestpublicvoidtestSelfFactoryBean(){ApplicationContextapplicationContext=newClassPathXmlApplicationContext("spring.xml");OrderorderBean=applicationContext.getBean("orderBean",Order.class);System.out.println(orderBean);}

通过FactoryBean接口实例化

以上的第三种方式中,factory-bean是我们自定义的,factory-method也是我们自己定义的。
在Spring中,当你编写的类直接实现FactoryBean接口之后,factory-bean不需要指定了,factory-method也不需要指定了。
factory-bean会自动指向实现FactoryBean接口的类,factory-method会自动指向getObject()方法。
第一步:定义一个Bean

packagecom.powernode.spring6.bean;/** * @author 动力节点 * @version 1.0 * @className Person * @since 1.0 **/publicclassPerson{}

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

packagecom.powernode.spring6.bean;importorg.springframework.beans.factory.FactoryBean;/** * @author 动力节点 * @version 1.0 * @className PersonFactoryBean * @since 1.0 **/publicclassPersonFactoryBeanimplementsFactoryBean<Person>{@OverridepublicPersongetObject()throwsException{returnnewPerson();}@OverridepublicClass<?>getObjectType(){returnnull;}@OverridepublicbooleanisSingleton(){// true表示单例// false表示原型returntrue;}}

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

<beanid="personBean"class="com.powernode.spring6.bean.PersonFactoryBean"/>

测试程序:

@TestpublicvoidtestFactoryBean(){ApplicationContextapplicationContext=newClassPathXmlApplicationContext("spring.xml");PersonpersonBean=applicationContext.getBean("personBean",Person.class);System.out.println(personBean);PersonpersonBean2=applicationContext.getBean("personBean",Person.class);System.out.println(personBean2);}

面试题: BeanFactory和FactoryBean的区别

BeanFactory

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

FactoryBean

FactoryBean:它是一个Bean,是一个能够辅助Spring实例化其它Bean对象的一个Bean。
在Spring中,Bean可以分为两类:

  • 第一类:普通Bean
  • 第二类:工厂Bean(记住:工厂Bean也是一种Bean,只不过这种Bean比较特殊,它可以辅助Spring实例化其它Bean对象。)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 23:23:48

软件测试面试题,精选100 道,内附答案

精挑细选&#xff0c;整理了100道软件测试面试题&#xff0c;都是非常常见的面试题&#xff0c;篇幅较长&#xff0c;所以只放出了题目&#xff0c;答案在评论区&#xff01; 测试技术面试题 1、什么是兼容性测试&#xff1f;兼容性测试侧重哪些方面&#xff1f; 2、我现在有…

作者头像 李华
网站建设 2026/9/2 14:22:37

软件测试20个基础面试题及答案

什么是软件测试&#xff1f; 答案&#xff1a;软件测试是指在预定的环境中运行程序&#xff0c;为了发现软件存在的错误、缺陷以及其他不符合要求的行为的过程。 软件测试的目的是什么&#xff1f; 答案&#xff1a;软件测试的主要目的是保证软件的质量&#xff0c;并尽可能…

作者头像 李华
网站建设 2026/9/2 22:21:42

2025软件测试面试题-mysql

1.mysql中的group by和order by区别&#xff1f; order by作用就是排序&#xff0c;desc降序&#xff0c;osc升序&#xff0c;默认升序&#xff0c;order by 后面必须列出排序的字段名&#xff0c;跟多个字段名时&#xff0c;排序按就近原则依次而来。 group by作用就是聚合分…

作者头像 李华
网站建设 2026/9/2 9:43:02

sigar监控系统资源

下载sigar https://sourceforge.net/projects/sigar/ 解压 tar -zxvf hyperic-sigar-1.6.4.tar.gz java.library.path默认查询路径 /usr/java/packages/lib/amd64:/usr/lib/x86_64-linux-gnu/jni:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib/jni:/lib:/usr/lib…

作者头像 李华
网站建设 2026/9/2 10:25:29

Boss直聘时间显示插件深度调试实战指南

Boss直聘时间显示插件深度调试实战指南 【免费下载链接】boss-show-time 展示boss直聘岗位的发布时间 项目地址: https://gitcode.com/GitHub_Trending/bo/boss-show-time 在当今竞争激烈的招聘市场中&#xff0c;时间就是机会。Boss直聘时间显示插件作为求职者的得力助…

作者头像 李华
网站建设 2026/9/3 0:12:44

Synology M2卷配置终极指南:从零开始快速上手NAS存储优化

Synology M2卷配置终极指南&#xff1a;从零开始快速上手NAS存储优化 【免费下载链接】Synology_M2_volume Easily create an M.2 volume on Synology NAS 项目地址: https://gitcode.com/gh_mirrors/sy/Synology_M2_volume 还在为Synology NAS的存储性能发愁吗&#xf…

作者头像 李华