Spring-IOC-FactoryBean机制(难点且重点)

1、第一个案例

 1.1、Book.java

package com.atguigu.ioc;
import lombok.Data;
@Data
public class Book {private String bid;private String bname;
}

 1.2、Book2.java

package com.atguigu.ioc;
import lombok.Data;
@Data
public class Book2 extends Book {private String coffee;@Overridepublic String toString() {return "Book2{" +super.toString()+"coffee='" + coffee + '\'' +'}';}
}

1.3、applicationContext.html

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="p01" class="com.atguigu.ioc.Person"></bean><!--下面这个b01,IOC容器管理的是Book的实例对象,是bean的真实类型--><bean id="bo1" class="com.atguigu.ioc.Book"><property name="bid" value="boo1"/><property name="bname" value="Java从入门到放弃"/></bean><!--现在我想要Book的加强版--><!--常规情况下,IOC容器会根据class属性通过反射技术调用它的无参构造方法现在,因为class指定的类型实现了FactoryBean机制。那么IOC容器会通过反射技术调用getObject()将返回值纳入IOC--><bean id="b02" class="com.atguigu.ioc.BookFactoryBean"></bean></beans>

1.4、BookFactoryBean.java

package com.atguigu.ioc;
import org.springframework.beans.factory.FactoryBean;
public class BookFactoryBean implements FactoryBean<Book> {@Overridepublic Book getObject() throws Exception {Book2 book2 = new Book2();book2.setBid("b002");book2.setBname("钢铁是怎么炼成的");book2.setCoffee("酱香拿铁");return book2;}@Overridepublic Class<?> getObjectType() {return Book.class;}
}

1.5、Test

    @Testpublic void test11() {BeanFactory beanFactory = new ClassPathXmlApplicationContext("applicationContext.xml");System.out.println(beanFactory.getBean("b02"));//Book2{Book(bid=b002, bname=钢铁是怎么炼成的)coffee='酱香拿铁'}}

Spring-IOC(Inversion of Control,控制反转)是Spring框架的核心功能之一,它通过将对象的创建和依赖关系管理交给容器来实现松耦合的设计。而Spring中IOC容器提供的FactoryBean机制则是一种创建和管理Bean的途径。它允许开发者在获取Bean时,先获取一个特定的工厂Bean,然后再由工厂Bean来生成需要的最终Bean对象。

使用FactoryBean机制,主要有以下几个步骤:

1.编写自定义的FactoryBean实现类,该实现类需要实现Spring提供的 FactoryBean接口 ,重写其中的getObject()方法和getObjectType()方法。

2.在Spring容器的配置文件中,将自定义的 FactoryBean 注册 到容器中。

3.在需要使用Bean对象的地方,通过容器获取自定义的FactoryBean对象。

4.通过调用自定义FactoryBean的getObject()方法,返回需要的Bean对象。

举个例子,假设我们有一个自定义的DataSourceFactoryBean,用于创建数据源DataSource对象。那么,在Spring的配置文件中,我们可以这样配置:

<bean id="dataSource" class="com.example.DataSourceFactoryBean"/>

在程序中,如果我们需要获取DataSource对象,可以这样:

DataSourceFactoryBean dataSourceFactoryBean = (DataSourceFactoryBean) applicationContext.getBean("dataSource");
DataSource dataSource = dataSourceFactoryBean.getObject();

FactoryBean机制在一些场景中非常有用,例如:

1.在创建Bean时需要进行一些定制化操作,比如为Bean对象设置默认属性、开启/关闭某些特性等。

2.当需要实现延迟加载、缓存等特殊需求时,FactoryBean机制可以更好地实现。

总之,FactoryBean机制是Spring框架中一个非常重要的组成部分,它提供了一种更加灵活的Bean管理方式,适用于各种不同的场景。

+---------------------------------------------------------------------+
|                                Client                               |
+---------------------------------------------------------------------+|                     || 通知IOC容器加载配置文件 ||---------------------||                     |
+---------------------------------------------------------------------+
|                             IOC容器                                |
+---------------------------------------------------------------------+|                     || 创建FactoryBean实例  ||---------------------||                     || 将FactoryBean实例注册到IOC容器中 ||---------------------||                     |
+---------------------------------------------------------------------+
|                          FactoryBean                               |
+---------------------------------------------------------------------+|                     || 从配置文件中获取Bean定义 ||---------------------||                     || 创建Bean实例         ||---------------------||                     || 返回Bean实例         ||---------------------||                     |
+---------------------------------------------------------------------+
|                                Client                               |
+---------------------------------------------------------------------+|                     || 获取FactoryBean实例 ||---------------------||                     || 调用FactoryBean.getObject()方法获取Bean实例 ||---------------------||                     || 使用Bean实例         ||---------------------||                     |

在这个流程中,客户端通过IOC容器获取自定义的FactoryBean实例,然后调用其getObject()方法获取最终的Bean实例。而在IOC容器中,FactoryBean实例和最终的Bean实例都被注册到容器中,由容器统一管理和维护,使得整个过程变得更加灵活和便于扩展。

2、第二个案例

 2.1、ApplicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--这个Bean标签中class属性指定的是HappyFactoryBean,但是将来从这里获取的bean是HappyMachine对象--><bean id="happyMachine" class="com.atguigu.ioc.HappyFactoryBean"><!--property标签仍然可以通过setXxx()方法给属性赋值--><property name="machineName" value="iceCreamMachine"/></bean></beans>

2.2、HappyFactoryBean.java

package com.atguigu.ioc;
import org.springframework.beans.factory.FactoryBean;
//实现FactoryBean接口时需要指定泛型
//泛型类型就是当前工厂要生产的对象的类型
public class HappyFactoryBean implements FactoryBean<HappyMachine> {private String machineName;public String getMachineName() {return machineName;}public void setMachineName(String machineName) {this.machineName = machineName;}@Overridepublic HappyMachine getObject() throws Exception {//方法内部模拟创建、设置一个对象的复杂过程HappyMachine happyMachine = new HappyMachine();happyMachine.setMachineName(this.machineName);return happyMachine;}@Overridepublic Class<?> getObjectType() {//返回要生产的对象的类型return HappyMachine.class;}
}class HappyMachine {private String machineName;public String getMachineName() {return machineName;}public void setMachineName(String machineName) {this.machineName = machineName;}
}

2.3、Test

    @Testpublic void testExperiment() {ApplicationContext iocContainer = new ClassPathXmlApplicationContext("applicationContext.xml");//注意:直接根据声明FactoryBean的id,获取的是getObject方法返回的对象HappyMachine happyMachine = iocContainer.getBean("happyMachine", HappyMachine.class);System.out.println("happyMachine = " + happyMachine);//如果想要获取FactoryBean对象,直接在id前添加&符号即可!  这是一种固定的约束Object bean = iocContainer.getBean("&happyMachine");System.out.println("bean = " + bean);}//happyMachine = com.atguigu.ioc.HappyMachine@4d02f94e//bean = com.atguigu.ioc.HappyFactoryBean@2b48a640

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/156738.shtml

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

相关文章

软件测试银行面试项目经验讲解

前言 业务&#xff1a; 银行类app具体模块业务讲解&#xff1a; 掌上生活&#xff08;消费/理财&#xff09; 消费&#xff1a; 与电商平台业务类似 饭票&#xff1a;GPS定位城市服务、饭票购买消费、餐厅查询、代金券、周三五折、banner图、我的饭票、我的抵扣券 影票 …

最新绿豆APP源码苹果CMS影视插件版本/原生JAVA源码+反编译开源+免授权

源码简介&#xff1a; 最新绿豆APP源码苹果CMS影视插件版本&#xff0c;它是原生JAVA源码反编译开源免授权&#xff0c;绿豆影视对接苹果CMS&#xff0c;它可以支持多功能自定义DIY页面布局。 1、新版绿豆视频APP视频6.1插件版反编译指南及教程 2、后端插件开源&#xff0c;可…

[C++] STL_stack queue接口的模拟实现

文章目录 1、stack1.1 stack的介绍1.2.1 stack的构造1.2.2 进、出栈等接口的模拟实现 2、queue2.1 queue的介绍2.2 queue的使用2.2.1 queue构造2.2.2 入、出队等接口的模拟实现 1、stack 1.1 stack的介绍 stack的文档介绍 1. stack是一种容器适配器&#xff0c;专门用在具有…

数字化转型导师坚鹏:数字化时代银行网点厅堂营销5大痛点分析

数字化时代银行网点厅堂营销存在以下5大痛点&#xff1a; 1、业务办理时间较长。目前很多银行业务办理时间仍然较长&#xff0c;可能的原因包括银行业务办理流程比较复杂、柜员操作技能不够熟练、银行系统的稳定性欠佳、网点某段时间客户比较多等。 2、现场提交材料太多。银行…

玩转大模型行业应用,且看盘古大模型全栈工程能力展身手【云驻共创】

AI技术在金融和工业领域的应用不断扩展&#xff0c;促进了金融行业的数字化转型和产业升级。AI提供了专属财富管家和工业范式的解决方案&#xff0c;在金融领域的应用包括风险评估和投资建议&#xff0c;而在工业领域的应用则涵盖了数据分析和机器人操作。与此同时&#xff0c;…

力扣 hot100 最长连续序列 哈希去重 双指针

128. 最长连续序列 ⭐ AC code class Solution {public int longestConsecutive(int[] nums) {if (nums.length 0)// 特判为空的数组&#xff0c;返回0return 0; // set实现去重HashSet<Integer> set new HashSet<>();for (int x : nums)set.add(x);Object[] a…

MyBatis使用注解操作及XML操作

文章目录 1. 注解操作1.1 打印日志1.2 参数传递1.3 增&#xff08;Insert&#xff09;注意1&#xff1a;重命名注意2&#xff1a;返回主键 1.4 删&#xff08;Delete&#xff09;1.5 改&#xff08;Update&#xff09;1.6 查&#xff08;Select&#xff09;1. 配置&#xff0c;…

【用unity实现100个游戏之15】开发一个类保卫萝卜的Unity2D塔防游戏3(附项目源码)

文章目录 先看本次实现的最终效果前言绘制炮塔UI炮塔转向敌人生成炮弹旋转我们的子弹对敌人造成伤害&#xff0c;回收子弹自动发射子弹添加攻击间隔显示伤害字体设计通用泛型单例创建更多炮塔升级增加伤害升级缩短攻击间隔添加货币杀死敌人获取金币源码完结 先看本次实现的最终…

el-checkbox 对勾颜色调整

对勾默认是白色 改的时候一直在试着改color人&#xff0c;其实不对。我用的是element ui 的复选框 /* 对勾颜色调整 */ .el-checkbox__inner::after{/* 是改这里的颜色 */border: 2px solid #1F7DFD; border-left: 0;border-top: 0;}

ssm+vue的药店药品信息管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的药店药品信息管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结…

无法安装ensp ?各种报错解决方案(virtualbox无法运行,启动AR失败,错误代码40等)

安装eNSP。发现软件中路由器无法启动。 VirtualBox是华为eNSP使用的必须运行环境&#xff0c;它提供虚拟网卡设备作为服务器为软件提供运行环境。 1. 提示出现VirtualBox Oracle无法在此项目运行。 我根据百度上的方法&#xff0c;重新还原系统。无果。 之前计算机中安装Vi…

基于混沌博弈算法优化概率神经网络PNN的分类预测 - 附代码

基于混沌博弈算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于混沌博弈算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于混沌博弈优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

【JavaEE初阶】 JavaScript基础语法——壹

文章目录 &#x1f38b;初识JavaScript&#x1f6a9;JavaScript 是什么&#x1f6a9;JavaScript 和 HTML 和 CSS 之间的关系&#x1f6a9;JavaScript 运行过程&#x1f6a9;JavaScript 的组成 &#x1f38d;前置知识&#x1f6a9;第一个JS程序&#x1f6a9;JavaScript 的书写形…

Linux JumpServer 堡垒机远程访问

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f516;系列专栏&#xff1a; C语言、Linux、Cpolar ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 前言1. 安装Jump server2. 本地访问jump server3. 安装 cpolar内网穿透软件4. 配置Jump server公网访问地址5.…

VMware——WindowServer2012R2环境安装mysql5.7.14解压版_主从复制(图解版)

目录 一、服务器信息二、192.168.132.33主服务器上安装mysql&#xff08;主&#xff09;2.1、环境变量配置2.2、安装2.2.1、修改配置文件内容2.2.2、初始化mysql并指定超级用户密码2.2.3、安装mysql服务2.2.4、启动mysql服务2.2.5、登录用户管理及密码修改2.2.6、开启远程访问 …

Redis 9 数据库

4 设置键的生存时间或过期时间 通过EXPIRE命令或者PEXPIRE命令&#xff0c;客户端可以以秒或者毫秒精度为数据库中的某个键设置生存时间&#xff08;TimeToLive&#xff0c;TTL&#xff09;&#xff0c;在经过指定的秒数或者毫秒数之后&#xff0c;服务器就会自动删除生存时间…

SPASS-时间序列预测

时间序列的建立和平稳化 填补缺失值 时间序列分析中的缺失值不能采用通常删除的办法来解决&#xff0c;因为这样会导致原有时间序列周期性的破坏&#xff0c;而无法得到正确的分析结果。按“转换→替换缺失值”打开“替换缺失值”对话框。 定义日期变量 展示效果如下

Vue3 customRef自定义ref 实现防抖

防抖就是防止在input 框中每输入一个字符就要向服务器请求一次&#xff0c;只要在用户输入完成过一段时间再读取用户输入的内容就能解决这个问题&#xff0c;减小服务器的压力。 1. 自定义ref是一个函数&#xff0c;可以接受参数。 比如我们自定义一个myRef&#xff1a; setu…

全网最全jmeter接口测试/接口自动化测试看这篇文章就够了:跨线程组传递jmeter变量及cookie的处理

setUp线程组 setUp thread group&#xff1a; 一种特殊类型的线程组&#xff0c;用于在执行常规线程组之前执行一些必要的操作。 在 setup线程组下提到的线程行为与普通线程组完全相同。不同的是执行顺序--- 它会在普通线程组执行之前被触发&#xff1b; 应用场景举例&#xf…

转录组学习第三弹-下载SRR数据并转成fastq

下载数据 前面已经安装好了需要的软件&#xff0c;那么我们现在需要下载我们练习需要用到的sra数据。从 SRA 数据库下载数据有多种方法。可以用ascp快速的来下载 sra 文件&#xff0c;也可以用wget或curl等传统命令从 FTP 服务器上下载 sra 文件。另外sra-tools的prefetch也支…