学习springIOC

第二章 Spring IOC

章节内容

  • Spring IOC技术实现
  • Spring IOC设值注入
  • Spring IOC构造注入

章节目标

  • 掌握Spring IOC技术实现
  • 掌握Spring IOC设置注入
  • 掌握Spring IOC构造注入

第一节 Spring简介

1. Spring 简介

Spring 是目前主流的 Java 开发框架,是 Java 世界最为成功的框架。其目的是用于简化企业级应用程序开发的难度和周期,任何 Java 应用都可以从 Spring 中受益。Spring 框架还是一个超级粘合平台,除了自己提供功能外,还提供粘合其他技术和框架的能力。

什么是框架? 框架是一个半成品,提供了基本的运行功能,但具体业务实现需要我们去编写。

2. Spring体系结构

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

EL = Expression Language 表达式语言

SpEL = Spring Expression Language Spring表达式语言

2.1 Data Access/Integration

Data Access/Integration表示数据访问/集成层,包含了JDBC、ORM、OXM、JMS、Transactions模块。

JDBC 模块

提供了一个 JBDC 的样例模板,使用这些模板能消除传统冗长的 JDBC 编码还有必须的事务控制,而且能享受到 Spring 管理事务的好处。

ORM 模块

提供与流行的“对象-关系”映射框架无缝集成的 API,包括 JPA、JDO、Hibernate 和 MyBatis 等。而且还可以使用 Spring 事务管理,无需额外控制事务。

OXM 模块

提供了一个支持 Object /XML 映射的抽象层实现,如 JAXB、Castor、XMLBeans、JiBX 和 XStream。将 Java 对象映射成 XML 数据,或者将XML 数据映射成 Java 对象。

JMS 模块

指 Java 消息服务,提供一套 “消息生产者、消息消费者”模板用于更加简单的使用 JMS,JMS 用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。

Transactions 事务模块

支持编程和声明式事务管理。

2.2 Web

Spring 的 Web 层包括 Web、Servlet、WebSocket 和 Portlet 组件。

Web 模块

提供了基本的 Web 开发集成特性,例如多文件上传功能、使用的 Servlet 监听器的 IOC 容器初始化以及 Web 应用上下文。

Servlet 模块

提供了一个 Spring MVC Web 框架实现。Spring MVC 框架提供了基于注解的请求资源注入、更简单的数据绑定、数据验证以及一套非常易用的 JSP 标签,完全无缝与 Spring 其他技术协作。

WebSocket 模块

提供了简单的接口,用户只要实现响应的接口就可以快速的搭建 WebSocket Server,从而实现双向通讯。

Portlet 模块

提供了在 Portlet 环境中使用 MVC 实现,类似 Web-Servlet 模块的功能。

2.3 Core Container

Spring 的核心容器是其他模块建立的基础,由 Beans 模块、Core 核心模块、Context 上下文模块和 SpEL 表达式语言模块组成,没有这些核心容器,也不可能有 AOP、Web 等上层的功能。

Beans 模块

提供了框架的基础部分,包括控制反转和依赖注入。

Core 核心模块

封装了 Spring 框架的底层部分,包括资源访问、类型转换及一些常用工具类。

Context 上下文模块

建立在 Core 和 Beans 模块的基础之上,集成 Beans 模块功能并添加资源绑定、数据验证、国际化、Java EE 支持、容器生命周期、事件传播等。ApplicationContext 接口是上下文模块的焦点。

SpEL 模块

提供了强大的表达式语言支持,支持访问和修改属性值,方法调用,支持访问及修改数组、容器和索引器,命名变量,支持算数和逻辑运算,支持从 Spring 容器获取 Bean,它也支持列表投影、选择和一般的列表聚合等。

2.4 AOP、Aspects、Instrumentation和Messaging

在 Core Container 之上是 AOP、Aspects 等模块。

AOP 模块

提供了面向切面编程实现,提供比如日志记录、权限控制、性能统计等通用功能和业务逻辑分离的技术,并且能动态的把这些功能添加到需要的代码中,这样各司其职,降低业务逻辑和通用功能的耦合。

Aspects 模块

提供与 AspectJ 的集成,是一个功能强大且成熟的面向切面编程(AOP)框架。

Instrumentation 模块

提供了类工具的支持和类加载器的实现,可以在特定的应用服务器中使用。

messaging 模块

Spring 4.0 以后新增了消息(Spring-messaging)模块,该模块提供了对消息传递体系结构和协议的支持。

2.5 Test模块

Test 模块

Spring 支持 Junit 和 TestNG 测试框架,而且还额外提供了一些基于 Spring 的测试功能,比如在测试 Web 框架时,模拟 Http 请求的功能。

第二节 Spring IOC

1. IOC 概念

IOC全称为 Inverse Of Control,表示控制反转。指的是程序员使用硬编码创建的对象转为由Spring容器来创建,对于对象生命周期的控制交给Spring容器来管理。控制反转解决了具有依赖关系的组件之间的强耦合,使得项目形态更加稳健

2. 如何使用 IOC

2.1 依赖包引入
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.11</version>
</dependency>
2.3 创建类
public class User {
}
2.2 编写配置文件
<?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 name="user" class="com.qf.spring.ioc.model.User" />
</beans>
2.4 编写测试案例
public class BeanTest {@Testpublic void getIocTest(){//应用上下文使用的是类路径下XML文档作为当前应用上下文ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");//从上下文中根据bean的名称或者ID获取bean对象User user = context.getBean("user", User.class);System.out.println(user);}
}

3. DI概念

DI全称为Dependency Injection,表示依赖注入。指的是在Spring创建对象的同时,为其属性赋值

4. 如何使用 DI

4.1 在类中添加属性
@Data
public class User {private String username;private String password;
}
4.2 修改配置文件
<?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 name="user" class="com.qf.spring.ioc.model.User"><!--为对象的属性注入值:这里name属性的值必须与set方法保持一致--><property name="username" value="admin" /><property name="password" value="123456" /></bean>
</beans>
4.3 再次测试

5. 注入方式

5.1 设值注入

设值注入指的是通过set方法为属性注入值。设值注入必须保证存在无参构造,否则将报错。

@Data
public class Student {private String name;private String sex;private int age;private Date birthday;
}
<!--application.xml-->
<bean name="stu" class="com.qf.spring.ioc.model.Student"><property name="name" value="张三" /><property name="age" value="20" /><property name="sex" value="" /><!--这里需要注意:日期类型的默认格式yyyy/MM/dd--><property name="birthday" value="2021/10/10" />
</bean>
@Test
public void studentTest(){//应用上下文使用的是类路径下XML文档作为当前应用上下文ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");//从上下文中根据bean的名称或者ID获取bean对象Student stu = context.getBean("stu", Student.class);System.out.println(stu);
}
5.2 构造注入

构造注入指的是通过构造放入为属性注入值。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {private String name;private String sex;private int age;private Date birthday;
}
<!--application.xml-->
<bean name="s" class="com.qf.spring.ioc.model.Student"><!--这里按照顺序为属性注入值--><constructor-arg index="0" value="李四" /><constructor-arg index="1" value="" /><constructor-arg index="2" value="22" /><constructor-arg index="3" value="2020/05/05" />
</bean>
@Test
public void studentConstructorTest(){//应用上下文使用的是类路径下XML文档作为当前应用上下文ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");//从上下文中根据bean的名称或者ID获取bean对象Student stu = context.getBean("s", Student.class);System.out.println(stu);
}

6. 注入类型

6.1 注入常用数据类型

常用数据类型指8种基本数据类型以及对应的包装类、日期类型、字符串等。

6.2 注入引用数据类型

对于引用数据类型,spring 提供了两种注入值的方式。一种是通过 ref 属性来引用 bean 对象进行值的注入,一种是通过 bean 标签来创建一个 bean 对象进行值的注入。

<property name="" ref="" /><property name=""><bean class=""></bean>
</property>
@Data
public class User {private String username;private String password;private UserInfo userInfo;
}@Data
public class UserInfo {private int id;private String name;private String sex;private int age;
}
<bean id="info" class="com.qf.spring.ioc.model.UserInfo"><property name="id" value="1" /><property name="name" value="张三" /><property name="sex" value="" /><property name="age" value="20" />
</bean><!--bean标签表示一个对象-->
<bean name="user" class="com.qf.spring.ioc.model.User"><!--为对象的属性注入值:这里name属性的值必须与set方法保持一致--><property name="username" value="admin" /><property name="password" value="123456" /><!--引用id为info的bean对象进行值的注入--><property name="userInfo" ref="info" />
</bean><bean name="u" class="com.qf.spring.ioc.model.User"><!--为对象的属性注入值:这里name属性的值必须与set方法保持一致--><property name="username" value="admin" /><property name="password" value="123456" /><property name="userInfo"><!--使用bean标签创建一个bean对象进行值的注入--><bean class="com.qf.spring.ioc.model.UserInfo"><property name="id" value="2" /><property name="name" value="李四" /><property name="sex" value="" /><property name="age" value="22" /></bean></property>
</bean>
6.3 注入数组

spring 提供了 array 标签来进行数组类型的属性值的注入。

@Data
public class Clazz {private int id;private String name;private Student[] students;
}
<bean name="clazz" class="com.qf.spring.ioc.model.Clazz"><property name="id" value="1" /><property name="name" value="张三" /><property name="students"><array><!--引用数据类型 可以使用bean标签创建bean对象注入值--><!--<bean class=""></bean>--><!--引用数据类型 可以使用ref标签引用bean对象注入值--><ref bean="s" /><ref bean="stu" /><!--常用数据类型 可以使用value标签直接注入值--><!-- <value></value>--></array></property>
</bean>
6.4 注入集合
6.4.1 List集合
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {private String name;private String sex;private int age;private Date birthday;private List<Double> scores;
}
<bean name="stu" class="com.qf.spring.ioc.model.Student"><property name="name" value="张三" /><property name="age" value="20" /><property name="sex" value="" /><!--这里需要注意:日期类型的默认格式yyyy/MM/dd--><property name="birthday" value="2021/10/10" /><property name="scores"><list><value>80.0</value><value>90.0</value><value>81.0</value><value>82.0</value></list></property>
</bean><bean name="s" class="com.qf.spring.ioc.model.Student"><!--这里按照顺序为属性注入值--><constructor-arg index="0" value="李四" /><constructor-arg index="1" value="" /><constructor-arg index="2" value="22" /><constructor-arg index="3" value="2020/05/05" /><constructor-arg index="4"><list><value>80.0</value><value>90.0</value><value>81.0</value><value>82.0</value></list></constructor-arg>
</bean>
6.4.2 Set集合
@Data
public class Person {private String name;private Set<String> friendNames;
}
<bean name="p" class="com.qf.spring.ioc.model.Person"><property name="name" value="李刚" /><property name="friendNames"><set><value>李四</value><value>王五</value></set></property>
</bean>
6.4.3 注入Map
@Data
public class Person {private String name;private List<String> friendNames;private Map<String, Object> map;
}
<bean name="p" class="com.qf.spring.ioc.model.Person"><property name="name" value="李刚" /><property name="friendNames"><set><value>李四</value><value>王五</value></set></property><property name="map"><map><entry key="hobby" value="聊天" /><entry key="clazz" value-ref="clazz"/></map></property><property name="props"><props><prop key="desc">我很帅</prop><prop key="secret">我有两个女朋友</prop></props></property>
</bean>
6.4.4 注入Properties
@Data
public class Person {private String name;private List<String> friendNames;private Properties props;
}
<bean name="p" class="com.qf.spring.ioc.model.Person"><property name="name" value="李刚" /><property name="friendNames"><set><value>李四</value><value>王五</value></set></property><property name="props"><props><prop key="desc">我很帅</prop><prop key="secret">我有两个女朋友</prop></props></property>
</bean>

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

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

相关文章

Android实现手写输入

android应用开发中有时会有手写输入需求&#xff0c;非通过系统键盘手写功能&#xff0c;比如自定义键盘&#xff0c;这时就需要自己来实现&#xff0c;一般有两种场景&#xff1a;一种是类似手写签名保存&#xff1b;另一种是真正的手写输入&#xff0c;需要将笔迹识别成正确的…

JTracker IDEA 中最好的 MyBatis 日志格式化插件

前言 如果你使用 MyBatis ORM 框架&#xff0c;那么你应该用过 MyBatis Log 格式化插件&#xff0c;它可以让我们的程序输出的日志更人性化。 但是有一个问题&#xff0c;通常我们只能看到格式化后的效果&#xff0c;没办法知道这个 SQL 是谁执行的以及调用的链路。 如下图所…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑复合指标优化模态分解和 Stacking 集成的综合能源系统多元负荷预测》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

【stm32】大一上学期笔记复制

砌墙单片机 外设是什么&#xff1f; ipage 8 nx轴 128 X0-127 y0-63 PWM脉冲宽度调制 PWM脉冲宽度调制 2023年10月13日 基本特性&#xff1a;脉冲宽度调制PWM是一种对模拟信号进行数字编码的方法。广泛引用于电机控制&#xff0c;灯光的亮度调节&#xff0c;功率控制等领域…

赶紧收藏!全网最佳WebSocket封装:完美支持断网重连,自动心跳!

文章目录 一、WebSocket封装库简介二、库的安装与配置2.1 安装2.2 初始化 三、功能详解3.1 断网重连3.2 自动心跳3.3 消息队列3.4 事件管理 四、示例代码五、总结 &#x1f389;欢迎来到Java学习路线专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&…

Windows Server 2019部署网络负载均衡NLB服务的详细操作步骤

部署前准备 首先需要准备两台Windows Server 2019服务器&#xff0c;虚拟机创建请参考 VMware Workstation安装Windows Server2019系统详细操作步骤_安装windows server 2019操作系统(写出操作过程)-CSDN博客 克隆虚拟机请参考 VMware Workstation克隆虚拟机详细步骤-CSDN博…

超详细的 C++中的封装继承和多态的知识总结<2.多态>

引言 小伙伴们我们都知道了&#xff0c;什么是封装和继承&#xff0c;在有了这个的基础上我们接着来看什么是多态。多态从字面上意思我们就可以知道&#xff0c;大概就是一个函数的不同形态&#xff0c;而且&#xff0c;前边我们在学习函数重载的时候我们已经简单的了解了如何用…

[Swiper]在React中使用Swiper时注意销毁实例

swiper版本号&#xff1a; {"swiper": "^4.4.2", }在useEffect中初始化swiper实例&#xff0c;由于依赖项的变更&#xff0c;可能会重复初始化: useEffect(() > {swiper.current new Swiper(#mainSwiper, {autoplay: {delay: 3000,//3秒切换一次},on…

推荐算法学习笔记2.1:基于深度学习的推荐算法-基于共线矩阵的深度推荐算法-AutoRec模型

AutoRec模型 前置知识&#xff1a;推荐算法学习笔记1.1:传统推荐算法-协同过滤算法 AutoRec模型通过引入自编码器结构&#xff0c;将共线矩阵中的用户向量&#xff08;基于用户的U-AutoRec&#xff09;或物品向量&#xff08;基于物品的I-AutoRec&#xff09;嵌入到低维空间后还…

讯方技术鸿蒙应用定制开发服务上架华为云商店

在当前智能化与互联互通发展的时代背景下&#xff0c;鸿蒙操作系统已成为推动创新应用发展的新引擎。随着企业对个性化智能解决方案需求的不断增长&#xff0c;鸿蒙应用定制开发已成为企业技术转型升级的重要途径。 讯方技术作为一家致力于为客户提供全面专业服务的企业&#…

LVM核心概念

1. LVM简介 LVM是逻辑盘卷管理&#xff08;Logical Volume Manager&#xff09;的简称&#xff0c;它是Linux环境下对磁盘分区进行管理的一种机制&#xff0c;LVM是建立在硬盘和分区之上的一个逻辑层&#xff0c;来提高磁盘分区管理的灵活性。 优点&#xff1a; 可以灵活分配…

2024年,精品课录制新方式,站在大屏前录出绿幕抠像的效果!感谢不坑盒子!

先做个小调查&#xff1a;你们那边请工作室录一节课&#xff0c;多少钱&#xff1f;留言区交流一下。 暑假了&#xff0c;老师们又有时间来录课了。 早在2021年秋天&#xff0c;精品课遴选的第一年&#xff0c;我就第一时间给大家分享了2种录精品课的方法&#xff1a;大屏前录…

python源码:opencv多视频源同屏拼接播放

一、前言 如标题所示&#xff0c;这个python代码的目的是利用opencv模块实现多视频源同屏拼接播放的&#xff0c;里面包含视频播放尺寸修改、视频播放加序号、视频流存活检测等方案&#xff0c;可做扩展开发使用。 二、代码 import cv2 import time from func_timeout import …

JAVA里的BigDecimal用法

public class BigDecimaldemo1 {public static void main(String[] args) {System.out.println(0.090.01);//为什么不是0.10呢?} }在使用float或者double类型的数据在进行数学运算的时候&#xff0c;很有可能会产生精度丢失问题。我们都知道计算机底层在进行运算的时候&#x…

科林Linux7_网络爬虫

一、爬虫 网络资源的下载工具&#xff0c;工作与万维网环境&#xff0c;持续获取网页网站中的网络信息。可持续的数据采集机器人 1、搜索引擎技术使用爬虫 2、数据分析、数据挖掘领域&#xff0c;需要爬虫进行数据准备 3、数据批处理、采集&#xff0c;大量获取某些网站中的…

LeetCode题练习与总结:二叉树的前序遍历--144

一、题目描述 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&#xff1a;roo…

数据资产的创新应用与未来展望:探讨数据资产在人工智能、物联网等新兴领域的应用前景,提出前瞻性的数据资产解决方案,为企业探索新的增长点,推动行业创新发展

目录 一、引言 二、数据资产在人工智能领域的应用 1、机器学习与深度学习 2、自然语言处理 3、计算机视觉 三、数据资产在物联网领域的应用 1、智能家居 2、工业物联网 3、智慧城市 四、前瞻性的数据资产解决方案 1、构建统一的数据管理平台 2、加强数据安全和隐私…

基于路径长度的样条插补算法(自动驾驶和路径跟踪控制适用)

以前在做车辆跟踪控制的时候发现在针对有多个X和多个Y对应的路径插补时候&#xff0c;总是报错&#xff0c;因为MATLAB里面的interp1插补函数它要求x要唯一对应一个y&#xff0c;当路径以单独的x或者y来求插补时候的时候就报错。由于在使用Matlab的interp1函数进行插值时&#…

Linux-网络安全私房菜

文章目录 前言入门基本指令篇章字符集设置cdlsdatemkdirtouch-d-m 修改主机名rmshredrename重命名mv移动tar打包与压缩打包但是不压缩打包且压缩更新包文件解压对应的包 zip压缩文件命令cat查看显示行号交互写入&#xff08;追加&#xff09;显示空行 more和lesshead和tailhead…

期末复习---程序填空

注意&#xff1a; 1.数组后移 *p *(p-1) //把前一个数赋值到后一个数的位置上来覆盖后一个数 2.指针找最大字符 max *p while( *p){ if( max< *p) { max*p; qp;/ 用新的指针指向这个已经找到的最大位置&#xff1b;!!!!!!!!! } p; //因为开始没有next &#xff…