Spring 4 IOC 相关内容 4.2 bean 实例化 3 实例工厂实例化

news/2024/5/19 13:57:04/文章来源:https://blog.csdn.net/weixin_44226181/article/details/127220392

Spring

【黑马程序员2022新版SSM框架教程_Spring+SpringMVC+Maven高级+SpringBoot+MyBatisPlus企业实用开发技术】

4 IOC 相关内容

文章目录

      • Spring
      • 4 IOC 相关内容
        • 4.2 bean 实例化
          • 4.2.5 实例工厂与FactoryBean
          • 4.2.6 bean 实例化小结

4.2 bean 实例化

4.2.5 实例工厂与FactoryBean

【第三种bean 的创建方式 → 实例工厂实例化】

【环境准备】

准备一个UserDao和UserDaoImpl类

package com.dingjiaxiong.dao;/*** ClassName: UserDao* date: 2022/9/16 14:04** @author DingJiaxiong*/public interface UserDao {public void save();
}
package com.dingjiaxiong.dao.impl;import com.dingjiaxiong.dao.UserDao;/*** ClassName: UserDaoImpl* date: 2022/9/16 14:05** @author DingJiaxiong*/public class UserDaoImpl implements UserDao {@Overridepublic void save() {System.out.println("user dao save ...");}
}

创建一个工厂类OrderDaoFactory并提供一个普通方法,注意此处和静态工厂的工厂类不一样的地方是方法不是静态方法

package com.dingjiaxiong.factory;import com.dingjiaxiong.dao.UserDao;
import com.dingjiaxiong.dao.impl.UserDaoImpl;/*** ClassName: UserDaoFactory* date: 2022/9/16 14:06** @author DingJiaxiong*/public class UserDaoFactory {public UserDao getUserDao(){return new UserDaoImpl();}
}

编写AppForInstanceUser运行类,在类中通过工厂获取对象

package com.dingjiaxiong;import com.dingjiaxiong.dao.UserDao;
import com.dingjiaxiong.factory.UserDaoFactory;/*** ClassName: AppForInstanceUser* date: 2022/9/16 14:08** @author DingJiaxiong*/public class AppForInstanceUser {public static void main(String[] args) {//创建实例工厂对象UserDaoFactory userDaoFactory = new UserDaoFactory();//通过实例工厂对象创建对象UserDao userDao = userDaoFactory.getUserDao();userDao.save();}
}

运行查看结果

在这里插入图片描述

问题来了,这种方式如何交给Spring 进行管理 → 实例工厂实例化

具体实现步骤为:

① 在spring的配置文件中添加以下内容:

<!--  第三种方式:使用实例工厂  -->
<!--  先造工厂的bean  -->
<bean id="userFactory" class="com.dingjiaxiong.factory.UserDaoFactory"/>
<!--  再造Dao的bean  -->
<bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>

实例化工厂运行的顺序是:

  1. 创建实例化工厂对象,对应的是第一行配置
  2. 调用对象中的方法来创建bean,对应的是第二行配置
    • factory-bean:工厂的实例对象
    • factory-method:工厂对象中的具体创建对象的方法名

对应关系

在这里插入图片描述

factory-mehod:具体工厂类中创建对象的方法名

在AppForInstanceUser运行类,使用从IOC容器中获取bean的方法进行运行测试

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) context.getBean("userDao");
userDao.save();

在这里插入图片描述

这就是第三种实例化方式,

在这里插入图片描述

配置的过程还是比较复杂,所以Spring为了简化这种配置方式就提供了一种叫FactoryBean的方式来简化开发。

【FactoryBean 的使用】【实用】

具体的使用步骤为:

① 创建一个UserDaoFactoryBean的类,实现FactoryBean接口,重写接口的方法

package com.dingjiaxiong.factory;import com.dingjiaxiong.dao.UserDao;
import com.dingjiaxiong.dao.impl.UserDaoImpl;
import org.springframework.beans.factory.FactoryBean;/*** ClassName: UserDaoFactoryBean* date: 2022/9/16 14:23** @author DingJiaxiong*/public class UserDaoFactoryBean implements FactoryBean<UserDao> {//代替原始实例工厂中创建对象的方法@Overridepublic UserDao getObject() throws Exception {return new UserDaoImpl();}//返回所创建类的Class对象@Overridepublic Class<?> getObjectType() {return UserDao.class;}
}

这样看起来好像并不简单,但是配置就可以简单了

② 在Spring的配置文件中进行配置

<!--  改进的工厂  -->
<bean id="userDao" class="com.dingjiaxiong.factory.UserDaoFactoryBean"/>

就行了

③ 直接运行

在这里插入图片描述

这种方式在Spring去整合其他框架的时候会被用到【务必掌握】

刚刚咱们实现接口时,其实有三个方法

分别是

T getObject() throws Exception;Class<?> getObjectType();default boolean isSingleton() {return true;
}

在这里插入图片描述

  • 方法一:getObject(),被重写后,在方法中进行对象的创建并返回
  • 方法二:getObjectType(),被重写后,主要返回的是被创建类的Class对象
  • 方法三:没有被重写,因为它已经给了默认值,从方法名中可以看出其作用是设置对象是否为单例

验证一下是不是单例

在这里插入图片描述

可以看到默认确实是单例的。

改成非单例

在这里插入图片描述

从结果中可以看出现在已经是非单例了,但是一般情况下咱们都会采用单例,也就是采用默认即可。所以isSingleton()方法一般不需要进行重写。

这就是“第四种”实例化bean 的方式

在这里插入图片描述

4.2.6 bean 实例化小结

【bean是如何创建的呢?】

构造方法

【Spring的IOC实例化对象的三种方式分别是】

  • 构造方法(常用)
  • 静态工厂(了解)
  • 实例工厂(了解)
    • FactoryBean(实用)

需要注意的一点是,构造方法在类中默认会提供,但是如果重写了构造方法,默认的就会消失,在使用的过程中需要注意,如果需要重写构造方法,最好把默认的构造方法也重写下。

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

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

相关文章

Python学习笔记(四)——字符串与文本处理2

目录 字符串函数大合集 两端删除函数strip() 删除空白字符 删除两端指定字符 右端删除函数rstrip() 左端删除函数 字符串对齐 返回指定宽度字符串center() 原字符串居中对齐、左对齐、右对齐 字符串开始或结束符判定startswith()、endswith() 内置函数eval()&#x…

web期末作业设计网页 html+css+js制作非物质文化遗产坝漆国漆 2页

&#x1f329;️ 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f482; 作者主页: 【进入主页—&#x1f680;获取更多源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;HTML5网页期末作业 (1000套…

鉴源论坛丨民用飞机机载软件是如何表明适航符合性的

作者 | 蔡喁 上海控安可信软件创新研究院副院长 版块 | 鉴源论坛 观擎 01 机载软件的基本特征 机载计算机在现代飞机各组成部分中占有举足轻重的位置&#xff0c;是现代航空电子系统的基础和核心&#xff0c;其研制、生产和应用水平已成为衡量飞机先进性的重要标志。机载计…

【面试题】Java基础 2

若你困于无风之地&#xff0c;我将为你奏响高空之歌 文章目录一、int 和 Integer 对象1. int 和 Integer 对象的区别2. 变量比较问题&#xff1a;二、反射1. 反射机制定义2. 反射的使用步骤3. 一个小栗子4. 反射的应用一、int 和 Integer 对象 1. int 和 Integer 对象的区别 …

css 特效实现方法

背景渐隐 通过 before 线性渐变遮盖掉一部分图片 视察滚动实现方式&#xff1a; 监听浏览器滚动事件改变各个层的top值 环形进度条 svg circlestroke-dasharray 环绕边框动画 四个单向运动的动画父框overflow: hidden;设置延迟可表现循环 一些旋转曲线的图形 inset背景扩…

一维无界的自由波动问题-达朗贝尔行波解

回顾 第一个例子 表示热能的扩散&#xff0c;在空间有不同的取值&#xff0c;随空间和时间而变化&#xff0c;左端是跟一个恒温为0的热源接触&#xff0c;我们表示为&#xff0c;这个叫恒温条件。右端我们跟一个绝热的材料接触&#xff0c;傅里叶发现了热传导规律,K叫做热传导…

Java学习笔记 --- 面向对象之多态

一、基本介绍 方法或对象具有多种形态&#xff0c;是面向对象的三大特征&#xff0c;多态是建立在封装和继承之上的 二、多态的具体体现 1、方法的多态&#xff1a; 重写和重载就体现多态 案例演示&#xff1a; package com.javase.poly_;public class PloyMethod {publi…

最新案例 | 昇思MindSpore携手信大网御推出中原AI反诈骗创新解决方案,为全民反诈筑牢防火墙

近日&#xff0c;河南信大网御科技有限公司的中原人工智能反诈骗创新解决方案与华为Atlas 800训练服务器和全场景AI框架昇思MindSpore完成兼容性测试。该方案基于昇腾AI基础软硬件平台&#xff0c;能够在短时间内对涉诈网址/APP进行识别&#xff0c;识别准确率高达99%。 据2021…

嵌入式开发为什么用C语言

有了解过嵌入式开发的人都会想要多去了解一些嵌入式方面的信息&#xff0c;那么既然是嵌入式开发肯定是要你会代码的&#xff0c;至于这些可能你还不是很了解&#xff0c;下面可以一起来了解下嵌入式开发为什么用C语言吧。 点击获取1V1嵌入式学习规划&#xff0c;现在还送100G精…

牛客网刷题-两个队列实现栈

✅作者简介&#xff1a;嵌入式入坑者&#xff0c;与大家一起加油&#xff0c;希望文章能够帮助各位&#xff01;&#xff01;&#xff01;&#xff01; &#x1f4c3;个人主页&#xff1a;rivencode的个人主页 &#x1f525;系列专栏&#xff1a;《牛客网刷题》 &#x1f4ac;推…

字节跳动测试岗面试挂在2面,我复盘总结了失败原因,决定再战一次

先说下我基本情况&#xff0c;本科不是计算机专业&#xff0c;现在是学通信&#xff0c;然后做图像处理&#xff0c;可能面试官看我不是科班出身没有问太多计算机相关的问题&#xff0c;因为第一次找工作&#xff0c;字节的游戏专场又是最早开始的&#xff0c;就投递了&#xf…

Chain of Responsibility(责任链模式)

责任链模式一、概述二、结构三、适用场景四、优缺点五、实例一、概述 描述&#xff1a;如组长不能处理的金额&#xff0c;需要向经理请求&#xff0c;经理不能请求的需要向老板请求&#xff0c;这样就现成了一条链&#xff0c;每个级别都能处理这金额。而不是直接组长向老板请…

LeetCode括号的分数(三种解法)

LeetCode括号的分数题目描述方法一&#xff1a;栈方法稍微优化方法二&#xff1a;递归方法三&#xff1a;计算每一部分的贡献率分析原因结语题目描述 这道题的题意还是比较好理解的&#xff0c;一个 &#xff08;&#xff09; 就是一分&#xff0c;外层再套有括号则分数翻倍。 …

【genius_platform软件平台开发】第七十四讲:IAP在线升级OTA原理

1. BootLoader知识 1.1 概述及其作用 BootLoader可以理解成是引导程序, 它的作用是启动正式的App应用程序.。换言之,BootLoader是一个程序, App也是一个程序, BootLoader程序是用于启动App程序的. 2. IAP知识 2.1 概述 IAP&#xff08;In-Application Programming&#xf…

python与Electron联合编程记录之六(Electron调试)

Pycharm调试Electron 程序的编写过程离不开调试&#xff0c;在刚开始编写Electron程序的时候我不懂怎么调试主进程&#xff0c;只会通过Chrome的Devtools调试渲染进程&#xff0c;所以程序编写过程非常苦恼。后来决定研究下怎么调试主进程&#xff0c;我使用的是Pycharm&#x…

WebDAV之葫芦儿·派盘 + Evermusic

Evermusic-iPhone或iPad的音乐播放器和下载器。音频均衡器,低音增强器,ID3标签编辑器,播放列表管理器。 支持最流行的音频格式:MP3,AAC,M4A,WAV,AIFF,M4R。有了这个程序,您可以创建自己的音乐流媒体服务。只需将您的音乐库移至云服务,然后直接从那里收听音乐。您现…

(附源码)计算机毕业设计SSM在线考试系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

正则量词 属性方法 使用技巧

n {1,正无穷} \w 0-9A-z_ var reg /\w/g;var str abcdefg;正则匹配的两个原则 1.不会回头 匹配成功的就不会在匹配 2.贪婪模式 能匹配多就不会匹配少 n* {0,正无穷} \w 0-9A-z_ var reg /\w*/g;var str abcdefg;\d 0-9 var reg /\d*/g;var str abcdefg;## n&#xff1…

gorm中的关联操作详解

一对一 belong to 属于:可以理解为舔狗认为自己属于女神,而女神都不知道舔狗的存在 type Girl struct { Id int Name string } type Dog struct { Id int Name string GirlId int Girl Girl } 迁移 schema db.AutoMigrate(&Dog{}) //此时会将…

Linux从入门到入土②(系统管理)

文章目录系统管理Linux 中的进程和服务Service服务管理&#xff08;CentOS 6 版本-了解&#xff09;基本语法使用systemctl服务管理&#xff08;CentOS 7 版本-重点掌握&#xff09;基本语法使用chkconfig 设置后台服务的自启配置&#xff08;CentOS 6 版本&#xff09;基本语法…