news 2026/4/15 20:19:44

(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/25 3:25:36

(17)注入自定义Date

我们前面说过&#xff0c;java.util.Date在Spring中被当做简单类型&#xff0c;简单类型在注入的时候可以直接使用value属性或value标签来完成。但我们之前已经测试过了&#xff0c;对于Date类型来说&#xff0c;采用value属性或value标签赋值的时候&#xff0c;对日期字符串的…

作者头像 李华
网站建设 2026/4/8 13:50:27

(18)Bean的生命周期

什么是Bean的生命周期 Spring其实就是一个管理Bean对象的工厂。它负责对象的创建&#xff0c;对象的销毁等。 所谓的生命周期就是&#xff1a;对象从创建开始到最终销毁的整个过程。 什么时候创建Bean对象&#xff1f; 创建Bean对象的前后会调用什么方法&#xff1f; Bean对象什…

作者头像 李华
网站建设 2026/4/12 9:25:41

ArcGIS大师之路500技---026shp格式数据简介

文章目录前言一、 什么是SHP文件&#xff1f;一个“组合套装”二、 SHP文件能做什么&#xff1f;三种基本形态三、 为什么SHP文件如此经久不衰&#xff1f;四、 它的局限性&#xff1a;英雄亦有短板五、 实战小技巧&#xff1a;在ArcGIS中与SHP文件共处总结前言 你是否曾好奇&…

作者头像 李华
网站建设 2026/4/15 3:40:25

2011-2023年中国老年社会追踪调查CLASS

数据简介 中国老年社会追踪调查&#xff08;China Longitudinal Aging Social Survey&#xff0c;CLASS&#xff09;是一个全国性、连续性、系统性、长期性的社会调查项目。通过定期、系统地收集中国老年人群社会、经济背景数据&#xff0c;掌握老年人在衰老过程中面临的各种问…

作者头像 李华
网站建设 2026/3/16 21:05:45

Ansible自动化运维入门:从手工到批量部署

本文介绍Ansible基础概念、安装配置、常用模块&#xff0c;以及实战批量部署案例。前言 管理1台服务器&#xff0c;手工操作没问题。 管理10台服务器&#xff0c;写脚本能应付。 管理100台服务器&#xff0c;必须用自动化工具。 Ansible是最流行的自动化运维工具之一&#xff0…

作者头像 李华