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图、我的饭票、我的抵扣券 影票 …

VSCODE 打开多个文件夹

1.打开vscode编辑器之后如果之前使用过&#xff0c;就会默认加载上次打开的文件以及文件夹。所以这个时候只需要点击顶部菜单栏之中的文件菜单项&#xff0c;然后点击将文件夹添加到工作区这个选项。 2.点击之后会打开一个文件夹目录&#xff0c;接着只需要在里面选择一个具有…

最新绿豆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;专门用在具有…

JS——日期字符串yyyymmdd转yyyy-mm-dd的两种方法

方法一&#xff1a;正则表达式 1、年月日转换 var oldDate "20111220"; var newDate oldDate.replace(/^(\d{4})(\d{2})(\d{2})$/, "$1-$2-$3"); console.log(newDate );//2011-12-20 2、年月日时分秒转换 var oldDate "20111220101010"…

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

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

Java设计原则和设计模式

目录 第一部分&#xff1a;设计原则 单一职责原则 (Single Responsibility Principle)开闭原则 (Open-Closed Principle)里氏替换原则 (Liskov Substitution Principle)接口隔离原则 (Interface Segregation Principle)依赖倒置原则 (Dependency Inversion Principle)合成/聚…

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

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

Python之字典

字典常用操作 import json d {"name":"zz","age":"100"} print(type(d)) # <class dict>s json.dumps(d) # 字典转字符串 print(s) # {"name": "zz", "age": "100"} print(type(s))…

力扣 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;…

9、信息打点——CDN绕过篇漏洞回链接口探针全网扫描反向邮件

文章目录 前置知识CDN配置判断CDNCDN绕过 前置知识 传统网站访问&#xff1a;用户访问域名——》解析服务器IP——》访问目标主机 普通CDN&#xff1a;用户访问域名——》CDN节点——》真实服务器IP——》访问目标主机 带WAF的CDN&#xff1a;用户访问域名——》CDN节点&#…

【用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 的书写形…

JavaScript中的短路表达式

JavaScript中的短路表达式是一种常见且有用的编程技巧。在本文中&#xff0c;我们将深入探讨什么是短路表达式&#xff0c;并提供一些代码示例来帮助您更好地理解它。 什么是短路表达式&#xff1f; 短路表达式是指在逻辑运算中&#xff0c;如果第一个操作数已经能够确定整个表…

【TIDB】TiDB认证考试PTCA 练习题 题库

1.下列功能是由 TiKV 或 TiFlash 实现的为&#xff1f;&#xff08; 选 2 项 &#xff09; A. 根据集群中 Region 的信息&#xff0c;发出调度指令 B. 对于 OLAP 和 OLTP 进行业务隔离 C. 将关系型数据转化为 KV 存储进行持久化 D. 将 KV 存储转化为关系型数据返回给客户端…