Spring IoC容器

我们将详细介绍 Spring 的 Ioc 容器。

IoC 是指在程序开发中,实例的创建不再由调用者管理,而是由 Spring 容器创建。Spring 容器会负责控制程序之间的关系,而不是由程序代码直接控制,因此,控制权由程序代码转移到了 Spring 容器中,控制权发生了反转,这就是 Spring 的 IoC 思想。

Spring 提供了两种 IoC 容器,分别为 BeanFactory 和 ApplicationContext,接下来将针对这两种 IoC 容器进行详细讲解。

BeanFactory

BeanFactory 是基础类型的 IoC 容器,它由 org.springframework.beans.facytory.BeanFactory 接口定义,并提供了完整的 IoC 服务支持。简单来说,BeanFactory 就是一个管理 Bean 的工厂,它主要负责初始化各种 Bean,并调用它们的生命周期方法。

BeanFactory 接口有多个实现类,最常见的是 org.springframework.beans.factory.xml.XmlBeanFactory,它是根据 XML 配置文件中的定义装配 Bean 的。

创建 BeanFactory 实例时,需要提供 Spring 所管理容器的详细配置信息,这些信息通常采用 XML 文件形式管理。其加载配置信息的代码具体如下所示:

BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource("D://applicationContext.xml"));

ApplicationContext

ApplicationContext 是 BeanFactory 的子接口,也被称为应用上下文。该接口的全路径为 org.springframework.context.ApplicationContext,它不仅提供了 BeanFactory 的所有功能,还添加了对 i18n(国际化)、资源访问、事件传播等方面的良好支持。

ApplicationContext 接口有两个常用的实现类,具体如下。

1 ClassPathXmlApplicationContext
该类从类路径 ClassPath 中寻找指定的 XML 配置文件,找到并装载完成 ApplicationContext 的实例化工作,具体如下所示。

ApplicationContext applicationContext = new ClassPathXmlApplicationContext(String configLocation);

在上述代码中,configLocation 参数用于指定 Spring 配置文件的名称和位置,如 applicationContext.xml。

2 FileSystemXmlApplicationContext
该类从指定的文件系统路径中寻找指定的 XML 配置文件,找到并装载完成 ApplicationContext 的实例化工作,具体如下所示。

ApplicationContext applicationContext = new FileSystemXmlApplicationContext(String configLocation);

它与 ClassPathXmlApplicationContext 的区别是:在读取 Spring 的配置文件时,FileSystemXmlApplicationContext 不再从类路径中读取配置文件,而是通过参数指定配置文件的位置,它可以获取类路径之外的资源,如“F:/workspaces/applicationContext.xml”。

在使用 Spring 框架时,可以通过实例化其中任何一个类创建 Spring 的 ApplicationContext 容器。

通常在 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。

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

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

相关文章

python相同怎么写_这两个index相同的dataframe我想把他们merge,怎么写?

能具体点么&#xff1f;这是这两df的代码# -*- coding: utf-8 -*-import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport tracebackfrom tools import *import matplotlib as mplimport pickleimport datetime as dtdf1 pd.DataFrame({A0: [A0, A1, …

python里删除range里的数字_python中range函数与列表中删除元素

一、range函数使用range(1,5) 代表从1到4(不包含5)&#xff0c;结果为&#xff1a;1,2,3,4 &#xff0c;默认步长为1range(1,5,2) 结果为&#xff1a;1, 3 (同样不包含5) &#xff0c;步长为2range(5,-1,-1) 反向输出&#xff0c;结果为&#xff1a;5,4,3,2,1,0 &#…

python中print又可将数据写入文件_Python第五课-将写入文件的列表格式化

1、上节课代码中的问题 第四课中介绍了python持久化的基础实例——将数据写入文本文件。 可当我们试着把保存数据的文件读取出来会怎样呢&#xff1f; try: with open(man.txt, r) as fman: print(fman.readline())except IOError as err: print(str(err)) 执行时&#xff0c;1…

Spring 依赖注入的实现

依赖注入&#xff08;Dependency Injection&#xff0c;DI&#xff09;和控制反转含义相同&#xff0c;它们是从两个角度描述的同一个概念。 当某个 Java 实例需要另一个 Java 实例时&#xff0c;传统的方法是由调用者创建被调用者的实例&#xff08;例如&#xff0c;使用 new…

arduino倾斜开关python语言_Arduino小白的学习记录:倾斜开关实验

一、介绍带有金属球的球形倾斜开关&#xff0c;它用于检测小角度的倾斜。图7.1 倾斜开关模块二、材料准备Arduino Uno 主板*1USB数据线*1倾斜开关模块*1杜邦线若干三、实验原理在倾斜开关中小球以不同的倾斜角度移动以造成触发电路的原理。倾斜开关模块使用双向传导的球形倾斜开…

Spring Bean的配置及常用属性

作为 Spring 核心机制的依赖注入&#xff0c;改变了传统的编程习惯&#xff0c;对组件的实例化不再由应用程序完成&#xff0c;转而交由 Spring 容器完成&#xff0c;在需要时注入应用程序中&#xff0c;从而对组件之间依赖关系进行了解耦。这一切都离不开 Spring 配置文件中使…

java 静态对象语法_04.Java 语法

计算机基础知识表达式(expression)&#xff1a;Java中最基本的一个运算。比如一个加法运算表达式。12是一个表达式&#xff0c;ab也是。计算机内存的最小存储单元是字节(byte)&#xff0c;一个字节就是一个8位二进制数&#xff0c;即8个bit。它的二进制表示范围从00000000~1111…

python 化学模块_Python chemif包_程序模块 - PyPI - Python中文网

实施解决这个问题的方法是使用一个while循环的递归下降算法。这个循环的基本结构是&#xff1a;todo [[item1, processing_data],[item2, processing_data], ... ]done []while len(todo)>0:item_to_workon todo.pop()for each_branch in branches:stuff.do()data.proces…

Spring实例化Bean

在面向对象的程序中&#xff0c;要想调用某个类的成员方法&#xff0c;就需要先实例化该类的对象。在 Spring 中&#xff0c;实例化 Bean 有三种方式&#xff0c;分别是构造器实例化、静态工厂方式实例化和实例工厂方式实例化。 构造器实例化 构造器实例化是指 Spring 容器通…

centos7配置mysql其他机器访问_CentOS7安装MySQL并开启远程访问详解

1.安装MySQLCentOS7中默认安装了MySQL系列的数据库&#xff0c;需要先卸载掉。查看当前安装的mariadb包&#xff1a;[[email protected] desktop]# rpm -qa | grep mariadb将它们统统强制性卸载掉&#xff1a;[[email protected] 桌面]# rpm -e --nodeps mariadb-libs-5.5.35-3…

python单元测试框架unittest介绍和使用_Python单元测试框架unittest简明使用实例

测试步骤1. 导入unittest模块import unittest2. 编写测试的类继承unittest.TestCaseclass Tester(unittest.TestCase)3. 编写测试的方法必须以test开头def test_add(self)def test_sub(self)4.使用TestCase class提供的方法测试功能点5.调用unittest.main()方法运行所有以test开…

python堆模块_python内置堆模块

heapqpython内置heapq模块&#xff0c;通过import heapq导入。heapq模块是用于堆实现优先队列。我们知道队列是先进先出(FIFO)&#xff0c;heapq中的优先队列指的是不论谁先进&#xff0c;最小的先出或者最大的先出。# 需要注意的是heapq的堆是小根堆。01 23 4 5 67 8 9 10 11 …

Java连接数据库所遇到的坑,连接数据库,遇到一个很奇怪的问题……

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼这个程序&#xff0c;运行之后发现成功连接上了然后我又看一眼&#xff0c;发现 DatabasName 拼错了&#xff0c;少写了一个 e没想到改正后反而报错了&#xff01;com.microsoft.sqlserver.jdbc.SQLServerException: Cannot open d…

如何用python的i2c教程_Micropython TPYBoard I2C的用法

先看看基本用法&#xff1a;from pyb import I2Ci2c I2C(1) # create on bus 1i2c I2C(1, I2C.MASTER) # create and init as a masteri2c.init(I2C.MASTER, baudrate20000) # init as a masteri2c.init(I2C.SLAVE, addr0x42) # i…

Spring基于XML装配Bean

Bean 的装配可以理解为依赖关系注入&#xff0c;Bean 的装配方式也就是 Bean 的依赖注入方式。Spring 容器支持多种形式的 Bean 的装配方式&#xff0c;如基于 XML 的 Bean 装配、基于 Annotation 的 Bean 装配和自动装配等。 Spring 基于 XML 的装配通常采用两种实现方式&…

苹果php环境,苹果电脑安装PHP环境步骤-PHP问题

苹果电脑装置PHP环境步骤&#xff1a;一、起首咱们需求装置Homebrew二、终端输出饬令// 创立目次,假如你不创立过该目次sudo mkdir /usr/local/varsudo chmod 777 /usr/local/var//修正成你本人的用户名以及组,假如你不创立过该目次sudo mkdir /usr/local/sbin/sudo chown -R :…

python邮件图片加密软件_用Python发一封图文并茂的邮件

最近使用了不少通讯工具的接口, 比如企业微信机器人&#xff0c;钉钉&#xff0c;微信公众号的接口(未认证的订阅公众号)&#xff0c;相对于邮件来说&#xff0c;它们的表现形式太弱。比如没有更丰富的版本方式。当然了&#xff0c;并不是说表现形式越棒就是约好的通知手段&…

Spring基于Annotation装配Bean

在 Spring 中&#xff0c;尽管使用 XML 配置文件可以实现 Bean 的装配工作&#xff0c;但如果应用中 Bean 的数量较多&#xff0c;会导致 XML 配置文件过于臃肿&#xff0c;从而给维护和升级带来一定的困难。 Java 从 JDK 5.0 以后&#xff0c;提供了 Annotation&#xff08;注…

用java写米与英尺,JAVA 英制变换(英尺与英寸)

JAVA 英制转换(英尺与英寸)系统实际业务中&#xff0c;还有些外国船舶水尺用的英制计算单位。写了一个简单的 英尺与英寸的转换 。英尺 --> 英寸 的转换&#xff1a;public class FeetToInch {/*** param args*/public static void main(String[] args) {String aa FeetTo…

swiper鼠标hover停止自动轮播_swiper滑块组件

相信大家在平常购物的时候都会看到轮播图&#xff0c;轮播图里面播放的是热门商品的信息。在小程序里面我们可以通过swiper滑动视图容器组件来实现&#xff0c;让我们一起来看下swiper组件都有哪些属性&#xff1a;我们看到可以通过一些属性给视图容器增加一些指示点&#xff0…