当前位置: 首页 > news >正文

(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对象。)
http://www.cnnetsun.cn/news/41617.html

相关文章:

  • 软件测试面试题个人总结
  • OpenWrt智能路由终极指南:如何实现多线路带宽叠加
  • bibliometrix:科学文献分析的终极指南与快速上手教程
  • React JSON Schema Form终极指南:3步构建专业表单应用
  • 低价游陷阱专坑老年人?
  • Hazel引擎揭秘:如何用开源技术打造高性能2D/3D游戏开发平台
  • Spark-TTS方言合成实战:零样本实现普通话到多地域口音转换
  • cjdns网络服务发现机制深度解密:构建加密网络中的智能寻址系统
  • 【无标题】激活函数应该具有哪些特征
  • 深入解析Oracle SQL调优健康检查工具(SQLHC):从原理到实战优化
  • 5分钟上手shUnit2:Shell脚本单元测试终极指南
  • uni-app新手避坑指南:从零开始搭建跨平台应用
  • 深入浅出 ES Module
  • wangEditor处理ppt动画效果转网页兼容
  • 深度残差网络在智能垃圾分类中的技术实践与性能分析
  • wangEditor导入MathType公式保留矢量格式
  • Node.js BFF层实战:对接天远综合多头借贷/逾期/欺诈聚合接口
  • Day11 >> 150、逆波兰表达式求值 + 239、滑动窗口最大值 + 347、前K个高频元素
  • System Informer 终极指南:从零掌握Windows系统监控神器
  • 20、集群节点与实例的添加和删除操作指南
  • 5大React动画库生态对比:从入门到精通的全栈解决方案
  • 2、Oracle Real Application Clusters (RAC):特性、成本与效益解析
  • Phi-2模型完全攻略:让27亿参数的小巨人成为你的AI助手
  • 30分钟掌握Tauri:用Rust构建你的第一个桌面应用
  • WeChatTweak-macOS开源项目深度参与指南
  • NootRX:让AMD RDNA 2显卡在macOS上完美运行
  • DBeaver崩溃救星:3步紧急恢复SQL脚本的完整方案
  • 项目效率翻倍,做对了什么?
  • 少儿编程考试路径规划:考级与竞赛时间如何平衡?
  • 火星漫游车Rocker-Bogie悬挂系统核心技术深度解析与实战指南