IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 【2021-07-21】Spring学习笔记1-Spring IoC容器 -> 正文阅读

[Java知识库]【2021-07-21】Spring学习笔记1-Spring IoC容器


学习《Spring+Spring MVC+Mybatis整合开发实战》笔记

Spring IoC容器

  1. IoC容器替代了传统的new方式初始化对象,通过读取在XML文件中配置的Bean定义,自动创建并管理容器的Bean实例及其生命周期。
  2. 可以在Bean的定义中进行依赖对象的配置,降低对象之间的耦合程度,以达到解耦的效果。
  3. Spring提供了多种依赖注入方式,包括构造函数注入和设置值注入。

1.IoC与DI简介

IoC(Inversion of Control,控制反转)是一种编程思想,或者说设计模式。IoC模式将耦合从代码中移出去,放入配置中,如XML文件,容器在启动时依据依赖配置生成依赖对象并注入。使用IoC容器后,代码从内部的耦合转到外部容器,解耦性更高,也更灵活。
控制权的转移,即控制反转,就是指依赖对象创建的控制权从应用程序本身转移到外部容器。控制反转的实现策略:

  • 依赖查找(Dependency Lookup):首先需要将依赖或服务进行注册,然后通过容器提供的API来查找依赖对象和资源。
  • 依赖注入(Dependency Injection,简称DI):依赖对象通过注入进行创建,由容器负责组件的创建和注入。根据配置将符合依赖关系的对象传递给需要的对象。两种常见依赖注入方式:
    • 属性注入
    • 构造器注入

DI是IoC这种设计思想的一种实现。控制反转乃至依赖注入的目的并不是提升系统性能,而是提升组件重用性与系统的可维护性。

2.Spring容器初始化

  • Spring IoC容器用来创建和管理类的实例称为Bean,根据Bean的配置可以使用BeanFactory创建和管理Bean实例。
  • Spring容器最重要的作用就是根据配置注入依赖对象。

BeanFactory和ApplicationContext是Spring进行对象管理的两个主要接口。ApplicationContext继承自BeanFactory,除了基本的对象管理之外,还提供了应用程序所需要的其他上下文信息。

BeanFactory位于org.springframework.beans包中;
ApplicationContext位于org.springframework.context包中。
下面主要介绍ApplicationContext的初始化方式。

2.1 ApplicationContext初始化方式

  • ClassPathXmlApplicationContext是从类的根路径开始获取XML的配置文件;
  • FileSystemXmlApplicationContext是默认从项目根路径查找配置文件。

在Spring中。使用“classpath:”来表示类的根路径,如果加上*号,即“classpath * :”则除了自身的类路径之外,同时也会查找依赖库(.jar)下的目录。对于不同的配置文件位置,容器的初始化方法如下:
(1) 配置文件位于项目的类的根路径下

//方式1:使用类路径应用上下文初始化类
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//方式2:使用文件路径应用上下文初始化类
ApplicationContext context = new FileSystemXmlApplicationContext("classpath:applicationContext.xml");

(2) 配置文件位于类的根路径的子目录下

//方式1:使用类路径应用上下文初始化类
ApplicationContext context = new ClassPathXmlApplicationContext("first/second/applicationContext.xml");
//方式2:使用文件路径应用上下文初始化类
ApplicationContext context = new FileSystemXmlApplicationContext("classpath:first/second/applicationContext.xml");

(3) 配置文件位于项目的根路径下

//使用文件路径应用上下文初始化类
ApplicationContext context = new FileSystemXmlApplicationContext("applicationContext.xml");

(4) 配置文件位于项目的根路径的子目录下,如config目录下

//使用文件路径应用上下文初始化类
ApplicationContext context = new FileSystemXmlApplicationContext("config/applicationContext.xml");

(5)使用file协议访问方式

ApplicationContext context = new FileSystemXmlApplicationContext("file://D:/Software/Eclipse/Eclipse-workspace/first/config/applicationContext.xml");

(6)动态加载Bean

GenericApplicationContext context = new GenericApplicationContext();
new XmlBeanDefinitionReader(context).loadBeanDefinitions("services.xml","daos.xml");
context.refresh();

若配置文件最终位于类路径下,建议使用ClassPathXmlApplicationContext;

若配置文件和源代码文件分开,位于项目的其他路径,建议使用FileSystemXmlApplicationContext。

2.2 Spring基于XML的配置文件结构

一个简单的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 id="helloWorld" class="first.HelloWorld"></bean>
 
</beans>
  • <?xml version="1.0" encoding="UTF-8"?>表示XML的版本和编码,供XML解析器使用
  • 根元素是< beans>,通过< beans>元素的属性定义对根元素下子元素的定义进行规范,< beans>的基本属性包括xmlns、xmlns:xsi、xsi:schemaLocation.
  • xmlns是XML Namespace的缩写,即XML命名空间,为了解决XML元素重名的问题,类似于Java中类的包名的作用。xmlns定义了默认的命名空间。
  • xmlns:xsi表示使用xsi作为前缀的命名空间,这个属性是为了下面的xsi:schemaLocation的定义。
  • xsi:schemaLocation用于定义命名空间和对应的XSD(XML结构定义)文档的位置关系,两者是成对配置的。Schema处理器将从指定的位置读取Schema文档,根据描述的文档结构验证XML文件是否符合规范。

2.3 Bean的配置方式

Bean的配置方式就是直接在根元素< beans>下增加< bean>的子元素,配置示例如下:

<bean id="helloWorld" class="first.HelloWorld"/>

一个Bean元素包含两个基本属性:class、id。

  • class的值是包含包名的全路径类名,必须是类不能使用接口;
  • id属性给这个类的实例一个标识,方便容器和程序查找使用。

若不设定id的属性和值,容器默认以类名的首字母小写作为标识,上例中设置id为helloWorld和不设定id的效果是一样的。

2.4 容器的关闭

对于非Web应用,建议使用close()方法关闭容器。
close()方法是AbstractApplicationContext抽象类才开始具有的。其初始化和关闭代码如下:

AbstractApplicationContext context = new ClassPathXmlApplicationContext("spring-beans.xml");
context.close();

在实际场景中,可能遇到RuntimeException异常关闭或者使用操作系统强制关闭。这时可以使用关闭钩子(ShutdownHook),注册关闭钩子只需加入以下代码,其中registerShutdownHook()也是AbstractApplicationContext抽象类才具有的:

context.registerShutdownHook()

3.依赖注入方式

依赖关系注入使用配置的方式,而不是固定写在代码里,来实现系统的解耦,有构造函数注入和设置值注入两种常见方式。

3.1构造函数注入

<?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 -->
	<bean id="userDao" class="learning.UserDao" />
	<!-- 用户服务 -->
	<bean id="userService" class="learning.UserService">
		<constructor-arg><!-- 构造参数注入 -->
			<ref bean="userDao" />
		</constructor-arg>
	</bean>
</beans>

其中,constructor-arg的子元素配置可简写为< constructor-arg ref=“userDao” />

3.2设置值注入

在配置文件中使用< bean>元素的property子元素注入依赖对象,name对应bean类中的属性名,ref设置为依赖bean的id

<?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 -->
	<bean id="userDao" class="learning.UserDao" />
	<bean id="userService" class="learning.UserService">
		<property name="userDao" ref="userDao" /> <!--属性注入依赖-->
	</bean>
</beans>
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-07-22 14:00:25  更:2021-07-22 14:02:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/17 21:17:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码