Spring IoC容器

2023-11-16

转自:

Spring IoC容器

一、Ioc简介


IoC容器是Spring中的核心
我们通常也将其称之为Spring容器
Spring使用IoC容器对对象的实例化和初始化的操作,及管理对象的创建到销毁的生命周期
Spring中使用的对象全部由IoC容器进行管理,所以在借助Spring开发时,我们无需使用new关键字创建对象

我们将IoC容器管理的对象称为Spring Bean
Spring Bean就是 Java 对象,它同new关键字创建的对象相同
在Spring中我们可以通过XML或Java注解两种方式创建生成Java Bean
 

二、IoC容器的类型


Spring中提供2种不同类型的IoC容器,即BeanFactory和ApplicationContext容器

1. BeanFactory 容器

BeanFactory是最简单的容器,由org.springframework.beans.factory.BeanFactory接口定义,采用懒加载(lazy-load)-使用时即时加载,所以容器启动比较快。
 BeanFactory只对外提供容器最基本的操作功能
其功能:为兼容Spring集成的第三方框架(如 BeanFactoryAware、InitializingBean、DisposableBean) 


BeanFactory:是一个管理Bean 的工厂,它主要负责初始化各种 Bean,并调用它们的生命周期方法。
BeanFactory 接口有多个实现类,
   如:org.springframework.beans.factory.xml.XmlBeanFactory
   使用 BeanFactory 需要创建 XmlBeanFactory 类的实例,
   通过 XmlBeanFactory 类的构造函数来传递 Resource 对象

Resource resource = new ClassPathResource("applicationContext.xml"); 
BeanFactory factory = new XmlBeanFactory(resource);  

2. ApplicationContext 容器

ApplicationContext 继承了 BeanFactory 接口,
由 org.springframework.context.ApplicationContext 接口定义,对象在启动容器时加载

ApplicationContext 在 BeanFactory 的基础上增加了很多企业级功能,如 AOP、国际化、事件支持等

ApplicationContext 接口有两个常用的实现类,具体如下。
1)ClassPathXmlApplicationContext
该类从类路径 ClassPath 中寻找指定的 XML 配置文件,并完成 ApplicationContext 的实例化工作,具体如下所示。
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(String configLocation);
在上述代码中,configLocation 参数用于指定 Spring 配置文件的名称和位置,如 Beans.xml。
2)FileSystemXmlApplicationContext
该类从指定的文件系统路径中寻找指定的 XML 配置文件,并完成 ApplicationContext 的实例化工作,具体如下所示。
ApplicationContext applicationContext = new FileSystemXmlApplicationContext(String configLocation);
它与 ClassPathXmlApplicationContext 的区别是:
在读取 Spring 的配置文件时,
FileSystemXmlApplicationContext 不会从类路径中读取配置文件,而是通过参数指定配置文件的位置。
即 FileSystemXmlApplicationContext 可以获取类路径之外的资源,如“D:/test/Beans.xml”。

通常在 Java 项目中,会采用 ClassPathXmlApplicationContext 类实例化 ApplicationContext 容器的方式,
而在 Web 项目中,ApplicationContext 容器的实例化工作会交由 Web 服务器完成。
Web 服务器实例化 ApplicationContext 容器通常使用基于 ContextLoaderListener 实现的方式,
它只需要在 web.xml 中添加如下代码:

 <!--指定Spring配置文件的位置,有多个配置文件时,以逗号分隔-->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <!--spring将加载spring目录下的applicationContext.xml文件-->
    <param-value>
        classpath:spring/applicationContext.xml
    </param-value>
</context-param>
<!--指定以ContextLoaderListener方式启动Spring容器-->
<listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>


注意事项:
  BeanFactory及ApplicationContext 都可采用XML配置文件的方式加载Bean
二者的区别:
    当Bean中某一个属性没有注入,使用 BeanFacotry 加载后,第一次调用 getBean() 方法时会抛出异常
   而 ApplicationContext 则会在初始化时自检,这样有利于检查所依赖的属性是否注入

在日常的开发中,我们经常使用ApplicationContext
在一些特殊的情况下,如:系统资源较少时,才会使用 BeanFactory 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring IoC容器 的相关文章

随机推荐

  • Remote Sensing 从投稿到录用

    一 刊物介绍 最新升级版大类分区仍然是二区TOP期刊 这个期刊现在业界褒贬不一 今年影响因子已经上升到4 848 可以作为一区文章被拒之后的首选 研究方向 无线传感器网络的定位与导航 投稿 Remote Sensing Remote Sen
  • RabbitMQ C++客户端 RabbitMQ Client for Windows/Linux 超简单接收发送接口-最近更新2019-09-06

    消息队列设计精要 解耦是消息队列要解决的最本质问题 所谓解耦 简单点讲就是一个事务 只关心核心的流程 而需要依赖其他系统但不那么重要的事情 有通知即可 无需等待结果 如果下游有很多系统关心你的系统发出的通知的时候 果断地使用消息队列吧 掰开
  • Docker 镜像使用

    目录 1 列出镜像列表 2 获取一个新的镜像 3 查找镜像 4 拖取镜像 5 删除镜像 6 创建镜像 a 更新镜像 b 构建镜像 设置镜像标签 当运行容器时 使用的镜像如果在本地中不存在 docker 就会自动从 docker 镜像仓库中下
  • Scala学习(九)---List集合

    文章目录 1 List 1 1 不可变List集合 1 2 可变集合ListBuffer 1 List List集合默认为不可变集合 List集合在实例化的时候 无法通过new关键字进行实例化 只能通过伴生apply方法来对其进行实例化 1
  • Ping操作 ICMP的数据包的分析(基础学习)

    学习链接 https zhuanlan zhihu com p 142665708 https blog csdn net weixin 43742894 article details 115415782 ICMP概述 全称interne
  • 机器学习-贝叶斯网络-笔记

    贝叶斯网络描述 1 贝叶斯网络 Bayesian network 又称信念网络 Belief Network 或有向无环图模型 directedacyclic graphical model 是一种概率图模型是一种模拟人类推理过程中因果关系
  • 内存泄漏分析

    原因 造成内存泄漏的网上很多 单例 handler 内部类持有外部类的对象 广播注册未反注册 静态变量 资源未释放等 工具 MAT 插件 可以直观的观察内存变化情况 dumpsys meminfo packagename 观察视图是否存在泄
  • (转)C++模板函数和重载

    C 模板函数和重载 先来看一个例子 include
  • Java代码实现按序打印(多线程)

    使用synchronized关键字同步线程 线程会在while循环中等待条件满足 如果当前要打印的数字为1 则打印1 并将当前要打印的数字设置为2 最后 调用notifyAll 方法唤醒所有正在等待的线程 让它们继续执行 class Pri
  • httprunner创建脚手架报错解决方法:httprunner: error: invalid choice: ‘startproject‘ (choose from ‘run‘, ‘make‘)

    安装完httprunner版本4 1 3后进行创建脚手架是报错 经过百度发现是与python 3 7 6 版本不匹配 卸载httprunner重新安装低版本的httprunner 卸载 pip uninstall HttpRunner 重新
  • 终端上使用脚本隔一定时间进行重复reboot和ping

    bin sh 设置 so的路径 export LD LIBRARY PATH usrdata LD LIBRARY PATH export LD LIBRARY PATH LD LIBRARY PATH usrdata 设置 usrdata
  • 在navcat中清空数据后,设置id归零方法

    写后台完成后 需要清空Mysql数据库中的测试数据 但是后面新增的数据 一直是以原来所删除数据的最大id为增量基本 比如 对于一些id敏感的项 十分不便 如图 原有10条数据 清空后 新增一两条 手动改了11为1后 再增一条 自动成了12
  • 将Vmware虚拟机磁盘映射到本地实现文件传输

    文章目录 前言 一 在ubuntu上搭建samba服务器并设置共享文件夹 二 查询虚拟机ip 三 确保本地和虚拟机网络互通 四 映射网络驱动器 五 文件传输测试 前言 将虚拟机磁盘映射到本地 可以实现文件互传 更方便使用 在开发时可以替代S
  • python实现GA-GRU遗传算法优化门控循环单元多变量时间序列预测

    GA GRU遗传算法优化门控循环单元多变量时间序列预测是一个比较复杂的问题 需要一定的编程和数学基础 下面是一个简单的Python实现 供参考 首先 我们需要导入相关的库 python import numpy as np import p
  • setGeometry Unable to set geometry问题记录

    问题描述 为了添加美化效果 重写了QMainWindow等窗口的标题栏 通过自定义标题栏窗口实现最大化 最小化 还原 关闭等操作 这些操作涉及到窗口的尺寸变化 在调试过程中出现以下问题 打开一个QMainWindow后 窗口正常显示 最大化
  • connect时使用Qt::DirectConnection,导致多线程时UI线程还是卡顿

    如果槽函数是耗时会导致UI假死的任务 connect时不能使用Qt DirectConnection 该参数The slot is invoked immediately when the signal is emitted The slo
  • ValueError: Input contains NaN, infinity or a value too large for dtype('float32').

    ValueError Input contains NaN infinity or a value too large for dtype float32 64 一般处理方式 对于以上问题其原因一般是数据集中存在nan值 以下假设数据用nu
  • Python+Appium实现控制app

    在这之前需要做好以下几个步骤 1 java开发环境JDK 2 android SDK platform platform tools tools build tools 3 python下载安装 pip 4 appium下载安装 服务端 客
  • js -- constructor构造方法

    let aaa name Lifan age 18 class Polygon constructor aaa this name aaa name const poly1 new Polygon aaa console log poly1
  • Spring IoC容器

    转自 Spring IoC容器 一 Ioc简介 IoC容器是Spring中的核心 我们通常也将其称之为Spring容器 Spring使用IoC容器对对象的实例化和初始化的操作 及管理对象的创建到销毁的生命周期 Spring中使用的对象全部由