news 2026/4/3 3:04:46

(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/3/26 20:22:42

Flex-Algo

文章目录为什么需要Flex-AlgoFlex-Algo是如何定义的Flex-Algo的算法示例Flex-Algo是如何工作的Flex-Algo是用户可以自主在IGP中创建单独拓扑并计算路径的灵活算法&#xff0c;目前主要在SR网络中使用。Flex-Algo提供了分离路由平面、约束TE路径、低延迟路由的简易解决方案&…

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

【钓鱼攻防】浅谈CobaltStrike钓鱼手法集锦

我其实不是好胜&#xff0c;我只是不想把这么美好的世界留给那帮傻子。 前言 网络安全技术学习&#xff0c;承认⾃⼰的弱点不是丑事&#xff0c;只有对原理了然于⼼&#xff0c;才能突破更多的限制。 拥有快速学习能力的安全研究员&#xff0c;是不能有短板的&#xff0c;有的只…

作者头像 李华
网站建设 2026/4/2 23:17:10

冯·诺依曼计算机原理:现代计算机的“大脑蓝图”

冯诺依曼计算机原理&#xff1a;现代计算机的“大脑蓝图”在我们每天使用的手机、电脑、智能手表甚至汽车中&#xff0c;都藏着一个看不见却无处不在的“大脑”——计算机。而这个“大脑”的基本工作方式&#xff0c;早在80年前就被一位天才科学家清晰地描绘出来。他就是约翰冯…

作者头像 李华
网站建设 2026/3/17 11:37:48

AsyncHttpClient WebSocket终极指南:从零构建高性能实时应用

AsyncHttpClient WebSocket终极指南&#xff1a;从零构建高性能实时应用 【免费下载链接】async-http-client Asynchronous Http and WebSocket Client library for Java 项目地址: https://gitcode.com/gh_mirrors/as/async-http-client 在现代Web开发中&#xff0c;实…

作者头像 李华
网站建设 2026/3/29 1:56:15

Electron应用发布终极指南:5分钟快速部署自动更新服务器

Electron应用发布终极指南&#xff1a;5分钟快速部署自动更新服务器 【免费下载链接】electron-release-server A fully featured, self-hosted release server for electron applications, compatible with auto-updater. 项目地址: https://gitcode.com/gh_mirrors/el/elec…

作者头像 李华