@kafkalistener中id的作用_SSM框架(十一):Spring框架中的IoC(1)

控制反转 IOC:

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。

在bean.xml中加入bean标签

    <!--把对象的创建交给spring来管理--><bean id="accountService" class="cn.figo.service.impl.AccountServiceImpl"></bean><bean id="accountDao" class="cn.figo.dao.impl.AccountDaoImpl"></bean>

然后可以获取spring的Ioc核心容器,并根据id获取bean对象

	// 获取核心容器对象ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");// 根据id获取bean对象IAccountService accountService = (IAccountService) ac.getBean("accountService");IAccountDao accountDao = (IAccountDao) ac.getBean("accountDao");

核心容器的继承关系:

93f717a5592dcb1c14ec491feb61c105.png
ApplicationContext 的父类和实现类

ApplicationContext的三个常用实现类:

ClassPathXmlApplicationContext:它可以加载类路径下的配置文件,要求配置文件必须在类路径下。不在的话,加载不了。(更常用)

FileSystemXmlApplicationContext:它可以加载磁盘任意路径下的配置文件(必须有访问权限)

AnnotationConfigApplicationContext:它是用于读取注解创建容器的

核心容器的两个接口

ApplicationContext: 单例对象适用,实际开发通常采用此接口

它在构建核心容器时,创建对象采取的策略是采用立即加载的方式。也就是说,只要一读取完配置文件马上就创建配置文件中配置的对象。

0b59b78705d19f9890f02aac8558fcd3.png
ApplicationContext 立即加载

BeanFactory: 多例对象使用

它在构建核心容器时,创建对象采取的策略是采用延迟加载的方式。也就是说,什么时候根据id获取对象了,什么时候才真正的创建对象。

9f8756c069797e136f279330d7e40a3e.png
BeanFactory 延迟加载

spring对bean的管理

第一种方式:使用默认构造函数创建

在spring的配置文件中使用bean标签,配以id和class属性之后,且没有其他属性和标签时。

<bean id="accountService" class="cn.figo.service.impl.AccountServiceImpl"></bean>

采用的就是默认构造函数创建bean对象,此时如果类中没有默认构造函数,则对象无法创建。

这里如果我们覆盖掉默认构造函数后,运行会报错

public AccountServiceImpl(String id){System.out.println("create service");}

b7e3b2b039199ac69d7fe5ef225ac804.png

第二种方式: 使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,并存入spring容器)

通过某一个其他类中的一个方法来创建我们所需要的bean对象,比如这里有一个类InstanceFactory 中的方法 getAccountService()可以创建 IAccountService 对象

/*** 模拟一个工厂类(该类可能是存在于jar包中的,我们无法通过修改源码的方式来提供默认构造函数)*/
public class InstanceFactory {public IAccountService getAccountService(){return new AccountServiceImpl();}
}

在 xml中做如下配置

<bean id="instanceFactory" class="cn.figo.factory.InstanceFactory"></bean>
<bean id="accountService" factory-bean="instanceFactory" factory-method="getAccountService"></bean>

90607bfd6eb6f68faf348e61bdf9559e.png

第三种方式:使用工厂中的静态方法创建对象(使用某个类中的静态方法创建对象,并存入spring容器)

通过某一个其他类中的静态方法来创建我们所需要的bean对象,比如这里有一个类StaticFactory 中的方法 getAccountService()可以创建 IAccountService 对象

/*** 模拟一个工厂类(该类可能是存在于jar包中的,我们无法通过修改源码的方式来提供默认构造函数)*/
public class StaticFactory {public static IAccountService getAccountService(){return new AccountServiceImpl();}
}

在xml中做如下配置:

<bean id="accountService" class="cn.figo.factory.StaticFactory" factory-method="getAccountService"></bean>

52930ee23bc81d067b3890dbf8aa5380.png

这样就可以成功创建相应的bean对象了

50187eb4da02cea53f809255123cf20f.png

bean的作用范围调整

bean标签的scope属性:

作用:用于指定bean的作用范围

取值: 常用的就是单例的和多例的

singleton:单例的(默认值)

prototype:多例的

request:作用于web应用的请求范围

session:作用于web应用的会话范围

global-session:作用于集群环境的会话范围(全局会话范围),当不是集群环境时,它就是session

当设置bean标签的scope为prototype时,是多例的

<bean id="accountService" class="cn.figo.service.impl.AccountServiceImpl" scope="prototype"></bean>

测试一下:

        // 获取核心容器对象ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");// 根据id获取bean对象IAccountDao accountDao = (IAccountDao) ac.getBean("accountDao");System.out.println(accountDao);IAccountService accountService = (IAccountService) ac.getBean("accountService");IAccountService accountService2 = (IAccountService) ac.getBean("accountService");System.out.println(accountService);System.out.println(accountService2);System.out.println(accountService == accountService2);

ee483340ec249224fd81f2fd5859ab02.png

当设置bean标签的scope为singleton时,是单例的

01bb72fc06ef3c7587cfe2fc1e81c04f.png

bean对象的生命周期

单例对象:单例对象的生命周期和容器相同

出生:当容器创建时对象出生

活着:只要容器还在,对象一直活着

死亡:容器销毁,对象消亡

多例对象

出生:当我们使用对象时spring框架为我们创建

活着:对象只要是在使用过程中就一直活着。

死亡:当对象长时间不用,且没有别的对象引用时,由Java的垃圾回收器回收

在类中加入 init 和 destroy 方法

public class AccountServiceImpl implements IAccountService {private IAccountDao accountDao = new AccountDaoImpl();public AccountServiceImpl(){System.out.println("对象创建了");}public void  saveAccount(){System.out.println("service中的saveAccount方法执行了。。。");}public void  init(){System.out.println("对象初始化了。。。");}public void  destroy(){System.out.println("对象销毁了。。。");}
}

在 xml中配置 初始化方法和销毁方法

    <bean id="accountService" class="cn.figo.service.impl.AccountServiceImpl"scope="singleton" init-method="init" destroy-method="destroy"></bean>

然后测试一下

ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
IAccountService accountService = (IAccountService) ac.getBean("accountService");
accountService.saveAccount();
System.out.println(accountService);
ac.close();

单例时:

7446efa5c522d81c0aa46a83af1cf113.png
单例时 对象随容器一起销毁

多例时:

df12dbe708436050ccf8ed9706ff6f9e.png
多例时 即使容器关闭,对象也没有被销毁

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

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

相关文章

keras优化算法_目标检测算法 - CenterNet - 代码分析

代码出处吃水不忘打井人&#xff0c;分析github上的基于keras的实现&#xff1a;xuannianz/keras-CenterNet​github.com代码主体结构模型训练的主函数流程如下所示&#xff0c;该流程也是使用keras的较为标准的流程。其中代码篇幅较大的是数据准备的部分&#xff0c;通常的代码…

c语言中创建一个整数数组_VBA中动态数组的创建及利用方法

大家好&#xff0c;后疫情时代一定会到来&#xff0c;各行各业&#xff0c;都将是一场战胜萧条的无声的战役。无论怎样&#xff0c;我们一定要坚信&#xff0c;疫情终将会过去&#xff0c;曙光一定会到来。后疫情时代将会是一个全新的世界&#xff0c;很多理念都将被打破&#…

用计算机求函数公式,计算机常用的函数公式有哪些?

01计算机常用的函数公式包括RANK函数、COUNTIF函数、IF函数、ABS函数、AND函数、AVERAGE函数、COLUMN 函数等。RANK函数是Excel计算序数的主要工具&#xff0c;它的语法为&#xff1a;RANK(number&#xff0c;ref&#xff0c;order)&#xff0c;其中number为参与计算的数字或含…

golang 读取文件最后一行_python3从零学习-5.4.3、文件输入流fileinput

源代码: Lib/fileinput.py此模块实现了一个辅助类和一些函数用来快速编写访问标准输入或文件列表的循环。 如果你只想要读写一个文件请参阅 open().典型用法为:import fileinputfor line in fileinput.input(): process(line)这将遍历sys中列出的所有文件的行。argv[1:]如果…

云计算机具体应用场景,云计算的定义、类型及应用场景

云计算是20年来IT行业出现的最激动人心且最具颠覆性的技术&#xff0c;甚至比大型主机向客户端/服务器架构的迁移还更具颠覆性。无论是IT服务的交付方式&#xff0c;还是企业消费这些IT服务的方式&#xff0c;都因云计算而改变。用户也正在快速应对新架构带来的变革&#xff0c…

dataframe for循环 筛选_Python循环12种超强写法,又快又省内存

0 前言说到处理循环&#xff0c;我们习惯使用for, while等&#xff0c;比如依次打印每个列表中的字符&#xff1a;在打印内容字节数较小时&#xff0c;全部载入内存后&#xff0c;再打印&#xff0c;没有问题。可是&#xff0c;如果现在有成千上百万条车辆行驶轨迹&#xff0c;…

html5文字飞入插件,jquery使用CSS3实现文字动画效果插件Textillate.js

jquery使用CSS3实现文字动画效果插件Textillate.jsTextillate是一款基于CSS3动画效果的 JavaScript 库&#xff0c;您可非常轻轻松地把这些动画效果应该于网页中的任何文字。使用方法引入核心文件构建html标签My Title写入JS&#xff0c;初始化$(function () {$(.tlt).textilla…

工业机器人导轨 百度文库_工业机器人或许开创一个全新的PLC时代

自机器人诞生之日起人们就不断地尝试着说明到底什么是机器人。但随着机器人技术的飞速发展和信息时代的到来&#xff0c;机器人所涵盖的内容越来越丰富&#xff0c;机器人的定义也不断充实和创新。机器人技术作为20世纪人类最伟大的发明之一&#xff0c;自20世纪60年代初问世以…

银联分账与银联代付_第三方分账系统到底有哪些作用?

随着监管越来越严&#xff0c;业务越来越复杂&#xff0c;所有平台电商企业都需要通过第三方分账系统解决支付清算及二清等问题。作为第三方分账系统行业从业者&#xff0c;整理了部分关于系统的相关问题及解答&#xff0c;希望对大家有所帮助。问题一&#xff1a;第三方分账系…

计算机更改桌面,2010年职称计算机考试:更改桌面背景和颜色

Windows XP提供了各种桌面的颜色和背景方案,用户可以根据自己的爱好进行选择。颜 色充当桌面的最底层,背景覆盖于颜色之上。(l)桌面背景的更改在"显示属性"对话框中,选择"桌面"选项卡。在"桌面"选项卡上有一个"背景"列表框,选择列表框…

dell t40 固态系统盘_笔记本怎么安装固态硬盘 笔记本安装固态硬盘教程【详解】...

首先我不得不介绍一下我这古董级别的笔记本 硬件升级&#xff0c;然后给大家介绍一下笔记本安装固态硬盘的教程。dell戴尔1320&#xff0c;cpu t6500 主频2.1ghz 。内存运用了淘汰的ddr2 分别是两条1g&#xff0c;共2g 800频率。这样的古董用的着用固态么?SATA2.0接口完全成为…

如何进入zabbix的wab界面_如何不用光盘重装系统呢?

如果身边没有系统光盘如何重装系统呢&#xff1f;小鱼系统可以帮助你一键重装系统和U盘重装系统的方法&#xff0c;下面一起看下小鱼系统教你的如何不用光盘重装系统吧。一键重装系统方法1、首先请备份好电脑C盘重要资料&#xff0c;然后打开【小鱼系统】&#xff0c;进入电脑环…

全国高中计算机大赛,2019年含金量最大的中小学全国性竞赛活动——五大学科竞赛...

五大学科竞赛历史是我国含金量最高的中小学全国性竞赛活动&#xff0c;在各高校自主招生过程中&#xff0c;具有较高的参考价值。对相关方面有一定兴趣的同学&#xff0c;也可以积极参与。五大赛面向的对象都是高中学生。一、全国中学生数学奥林匹克竞赛此项竞赛的主办单位是中…

单片机红绿灯电路灯有几种_新农村建设的太阳能路灯如何选择?

随着我国城乡一体化发展进程&#xff0c;城乡道路照明已成为新农村建设必不可少的一部分。目前市面通用的道路照明有两种&#xff1a;即市电路灯照明&#xff08;市电220V&#xff09;和太阳能路灯照明。安装简便且不需要布线的太阳能路灯在新农村建设中应用广泛&#xff0c;下…

lr不能直接转ps编辑_摄影后期调色软件,Lr软件包

摄影后期调色除了用到PS软件还有一款与之媲美的就是LR软件了&#xff0c;全名是Adobe Lightroom&#xff0c;喜欢拍照的人&#xff1b;总会希望自己拍下来的照片更好看&#xff0c;不管是多好的器材直出的 jpg 本身总会多多少少有一些限制&#xff0c;而利用后期软件可以很好的…

hive中如何把13位转化为时间_重要知识点收藏 | Hive常用函数大全

关系运算1、等值比较: 语法&#xff1a;AB操作类型&#xff1a;所有基本类型描述: 如果表达式A与表达式B相等&#xff0c;则为TRUE&#xff1b;否则为FALSE举例&#xff1a;hive>select 1 from lxw_dual where 11;12、不等值比较: <>语法: A <> B操作类型: 所有…

一加6html查看程序,一加6T评测:极速屏下指纹,解锁你想要的轻快顺滑

【PConline 评测】作为年末旗舰机阵营的新成员&#xff0c;一加6T选在11月5日正式在国内市场亮相。这款充满极客味道的手机早期已经获得了许多海外用户的好评和关注&#xff0c;全新加入的光感屏幕指纹&#xff0c;历来以轻快流畅著称的系统体验&#xff0c;让一加6T再一次成为…

all方法 手写promise_promise.all的实现

今天自己来实现一下promise.all方法的实现; 先来看MDN官网对promise.all方法的介绍: 简单理解,当参数中的promise有一个失败了就直接返回失败的结果,返回第一个失败的结果,都成功返回所有的参数结果; 上代码: function promiseAll(promises){// 返回一个promise实例retu…

七代处理器装win7_为啥新电脑没法装windows7系统?解决方法总会有的

这两年购买新电脑的用户&#xff0c;常常会来问小白问什么不能安装win7系统。之前很多解释都是把矛头直接归咎于主板&#xff0c;但其实这得找Intel&#xff0c;第六代Intel处理器以后所使用的主板(100芯片组系列主板)采用了最新的XHCI主控接口&#xff0c;不再内置win7所需要的…

计算机的服务如何还原,电脑怎么样还原到出厂设置

电脑要还原出厂设置&#xff0c;我们可以重装系统或者重置BIOS设置来实现。下面由学习啦小编为大家整理了电脑怎么样还原到出厂设置的方法步骤&#xff0c;希望对大家有帮助!电脑怎么样还原到出厂设置电脑还原出厂设置的方法一、重装系统1通过百度搜索360安全卫士下载&#xff…