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;

    @Override
    public 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> {
    @Override
    public Book getObject() throws Exception {
        Book2 book2 = new Book2();
        book2.setBid("b002");
        book2.setBname("钢铁是怎么炼成的");
        book2.setCoffee("酱香拿铁");
        return book2;
    }
    @Override
    public Class<?> getObjectType() {
        return Book.class;
    }
}

1.5、Test

    @Test
    public 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;
    }

    @Override
    public HappyMachine getObject() throws Exception {
        //方法内部模拟创建、设置一个对象的复杂过程
        HappyMachine happyMachine = new HappyMachine();
        happyMachine.setMachineName(this.machineName);
        return happyMachine;
    }
    @Override
    public 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

    @Test
    public 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SocketIo的使用和基于SocketIO的聊天室

Socket.IO 是一个库&#xff0c;可以在客户端和服务器之间实现 低延迟, 双向 和 基于事件的 通信。 一、Socket.IO的特点 以下是 Socket.IO 在普通 WebSockets 上提供的功能&#xff1a; 1、HTTP 长轮询回退 如果无法建立 WebSocket 连接&#xff0c;连接将回退到 HTTP 长轮…

文化传承与数字技术的完美结合:十八数藏的新纪元

在这数字化的时代&#xff0c;十八数藏犹如一座连接过去与未来的桥梁&#xff0c;展现出文化传承与数字技术完美结合的新纪元。十八数藏以其独特的视角&#xff0c;将传统文化注入现代数字技术的脉络&#xff0c;呈现出一幅文化传承的全新画卷。 十八数藏的文化传承并不是简单的…

C++进阶篇5-哈希

一、unordered系列关联式容器 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可达到log_2N&#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;当树中的节点非常多时&#xff0c;查询效率也不理想。最优的查询是&#xff0…

Linux—简介安装常用命令系统中软件安装项目部署

目录 1. 前言1.1 什么是Linux1.2 为什么要学Linux1.3 学完Linux能干什么 2. Linux简介2.1 主流操作系统2.2 Linux发展历史2.3 Linux系统版本 3. Linux安装3.1 安装方式介绍3.2 安装VMware3.3 安装Linux3.4 网卡设置3.5 安装SSH连接工具3.5.1 SSH连接工具介绍3.5.2 FinalShell安…

leetcode:1773. 统计匹配检索规则的物品数量(python3解法)

难度&#xff1a;简单 给你一个数组 items &#xff0c;其中 items[i] [typei, colori, namei] &#xff0c;描述第 i 件物品的类型、颜色以及名称。 另给你一条由两个字符串 ruleKey 和 ruleValue 表示的检索规则。 如果第 i 件物品能满足下述条件之一&#xff0c;则认为该物…

Softing TCS:高效的诊断模拟解决方案

| Softing TCS——高效的仿真模拟ECU或整车解决方案 现代诊断模拟Softing TCS是当相应的测试物还没有或不再可用时的解决方案。这种情况通常出现在早期阶段的组件和车辆工程、测试仪回归测试中或在对教学设施进行功能验证时&#xff0c;因为它们需要对多种不同的测试对象进行验…

Python之pyc文件的生成与反编译

目录 1、什么是pyc文件 2、手动生成pyc文件 3、pyc文件的执行 4、pyc文件的反编译 1、什么是pyc文件 pyc文件&#xff08;PyCodeObject&#xff09;是Python编译后的结果。当python程序运行时&#xff0c;编译的结果是保存于PyCodeObject&#xff0c;程序运行结束后&#x…

linux基本指令以及热键

基本指令 ♥clear ♥whoami ♥who ♥pwd ♥ls指令&#xff08;重点&#xff09; ls -a&#xff1a; ls -l ♥mkdir ♥cd指令 ♥touch指令 ♥stat指令 ♥rmdir指令 && rm 指令 ♥man指令 ♥nano指令 ♥cp指令 ♥mv指令 ♥cat指令 &#x1f5e1;输出/输出重定向 &#x1…

速锐得解码匹配驾培驾考吉利几何E萤火虫数据应用智能评判系统

随着国内新能源车的不断发展和渗透&#xff0c;在驾培驾考领域通过新能源车进入到驾驶员培训领域的车型越来越多&#xff0c;这里边包括了特斯拉、宝马、通用、沃尔沃、岚图、江淮、蔚来、比亚迪、吉利、奇瑞、大众等多家车企的车型。 之前我们做过像奇瑞艾瑞泽、江淮IEV7、大…

大华智能物联综合管理平台readpic接口任意文件读取漏洞复现 [附POC]

文章目录 大华智能物联综合管理平台readpic接口任意文件读取漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 大华智能物联综合管理平台readpic接口任意文件读取漏洞复现 [附POC] 0x01 前言 免责…

微信小程序知识付费平台,公众号App+SAAS+讲师端,多端部署

三勾知识付费系统基于thinkphp8element-plusuniapp打造的面向开发的知识付费系统&#xff0c;方便二次开发或直接使用&#xff0c;可发布到多端&#xff0c;包括微信小程序、微信公众号、QQ小程序、支付宝小程序、字节跳动小程序、百度小程序、android端、ios端。 功能包含直播…

2022最新版-李宏毅机器学习深度学习课程-P49 GPT的野望

GPT→类似于Transformer Encoder 训练任务&#xff1a;Predict Next Token 使用MASK-attention&#xff0c;不断预测“下一个token”。 可以用GPT生成文章。 How to use GPT? 给出描述和例子 给出前半段&#xff0c;补上后半段 In-context Learning(no GD) 结果 目前看起…

竞赛 题目:基于深度学习的图像风格迁移 - [ 卷积神经网络 机器视觉 ]

文章目录 0 简介1 VGG网络2 风格迁移3 内容损失4 风格损失5 主代码实现6 迁移模型实现7 效果展示8 最后 0 简介 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习卷积神经网络的花卉识别 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c…

初步设计报告(框架)

前言 &#xff08;简述初步设计报告编制的背景、过程及其它有关情况&#xff09;&#xff08;内容可根据项目的实际建设内容进行选择&#xff09; 编制单位资质证明

el-checkbox 对勾颜色调整

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

CAD文件转奥维 转shapefile

之前写过一篇CAD转ArcGIS 其实万变不离其宗&#xff0c;都是经纬度知识的应用。 背景是当我们拿到一份带有坐标的CAD文件如何转换为矢量文件。 首先我们要明白XY坐标系的含义。 X—real X-500000 为近距离标准经线的距离。 y 为距离赤道的距离。 X 429174.3048 Y 32313…

太累了,是时候让AI数字人来帮我干活了(走,上教程)

阿酷TONY&#xff0c;原创文章&#xff0c;长沙&#xff0c;2023.11.21 关 键 词&#xff1a;AI数字人&#xff0c;生成式AI&#xff0c;智能数字分身适用场景&#xff1a;培训数字人&#xff0c;演讲授课数字人&#xff0c;直播带货数字人特别说明&#xff1a;教程用的是国内…

后端-锁专题:synchronized(java对象结构、锁的类型、锁升级流程...)

文章目录 对象的结构以及大小内存换算java的常见数据类型以及所占字节数分析对象总共占多少字节&#xff0c;各项占多少字节对象头结构 锁类型锁升级流程 对象的结构以及大小内存换算 java的常见数据类型以及所占字节数 String&#xff1a;8字节 64位 int&#xff1a;4字节 …

竞赛选题 车位识别车道线检测 - python opencv

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习 机器视觉 车位识别车道线检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) …

阵列 MEMS-IMU的解算系统

使用飞速发展的硅半导体工艺制成的微机械电子系统&#xff08;Micro Electro Mechanical System&#xff0c;MEMS&#xff09;具有体积小、成本低、重量轻、低功耗等诸多优势。MEMS-IMU&#xff08;Inertial Measurement Unit, IMU&#xff09;构成的捷联惯导系统可以应用到无人…