Spring:Spring 框架概述、IoC 设计思想、依赖注入、各种配置

news2024/10/6 10:38:28

文章目录

  • Spring:Day 01
  • 一、简介
    • 1. 概述
    • 2. Spring 组成
  • 二、IoC 设计思想
  • 三、编写一个 Spring
  • 四、IoC 创建对象方式
  • 五、Spring 配置
    • 1. 别名
    • 2. Bean 的配置
    • 3. import
  • 六、依赖注入
    • 1. 搭建环境
    • 2. Set 注入
    • 3. 总结
    • 补充:c 命名和 p 命名空间注入
  • 七、Bean 的作用域
    • 1. singleton
    • 2. prototype
  • 注意:

Spring:Day 01

<!-- spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.18</version>
</dependency>

一、简介

1. 概述

Spring Framework 官网:点此进入。

Spring Framework 参考文档:点此进入。

  1. Spring 框架即以 interface21 框架为基础,经过重新设计,并不断丰富其内涵,于 2004 年 3 月 24 日,发布了 1.0 正式版;
  2. Spring 框架创始人:Rod Johnson;
  3. 目的:解决企业应用开发的复杂性;
  4. 优点
    • Spring 是一个开源免费的框架(容器);
    • Spring 是一个轻量级的、非入侵式的框架;
    • 两个最重要的特征:控制反转(IoC)、面向切面(AOP)
    • 支持事务的处理,对框架整合的支持。
  5. 总结Spring 就是一个轻量级的控制反转(IoC)和面向切面(AOP)编程的框架

2. Spring 组成

Spring 框架是一个分层架构,由 7 个定义良好的模块组成:

  • Spring Core:核心容器的主要组件是 BeanFactory,它是工厂模式的实现;
  • Spring Context:是一个配置文件,向 Spring 框架提供上下文信息;
  • Spring AOP:将面向切面的编程功能集成到了 Spring 框架中,为基于 Spring 的应用程序中的对象提供了事务管理服务;
  • Spring DAO:面向 JDBC 的异常遵从通用的 DAO 异常层次结构;
  • Spring ORM:负责框架中对象关系映射,提供相关 ORM 接入框架的关系对象管理工具;
  • Spring Web:为基于 Web 的应用程序提供了上下文;
  • Spring MVC:全功能的构建 Web 应用程序的 MVC 实现。

Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式。

组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现,如下图所示。


二、IoC 设计思想

IoC:Inversion of Control,控制反转,是一种设计思想

DI:Dependency Injection,依赖注入,是一种设计模式,是实现 IoC 的一种方法。

  • 传统的 Java 设计中,直接会在对象的内部通过 new 进行对象的创建,是程序主动创建出来对象;
  • IoC 来说,有一个专门的容器管理这些对象的生命周期,控制对象的创建,所以在 IoC 中,是通过 IoC 容器控制对象,由 IoC 容器控制外部资源的获取。

理解:没有 IoC 的程序中,我们使用面向对象编程,对象的创建以及对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制。在控制反转后,对象的创建转移给第三方,可以理解为控制反转就是获得依赖对象的方式反转了

实现 IoC 的方式:XML 配置、注解。

注意:采用 XML 方式配置 Bean 时,Bean 的定义信息和实现是分离的。而采用注解的方式可以把两者合为一体,Bean 的定义信息直接以注解的形式定义在实现类中,从而达到零配置的目的。

总结

  1. 控制反转是一种通过描述(XML 或注解)并通过第三方去生产或获取特定对象的方式;
  2. 在 Spring 中实现控制反转的是 IoC 容器;
  3. 实现 IoC 的方法的是依赖注入 DI。

三、编写一个 Spring

  • pom.xml 中导入依赖
<!-- spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.18</version>
</dependency>
  • 编写一个实体类:Hello.java

  • 编写配置文件:beans.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
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 使用 Spring 来创建对象,在 Spring 中这些对象都成为 Bean -->
    <bean id="hello" class="com.Sun3285.pojo.Hello">
        <property name="str" value="Spring"/>
    </bean>

</beans>
  • 测试:先拿到 Spring 的容器,然后获取想要的对象

注意

  1. 实体类中必须要有 set 方法,因为使用 Spring 来创建对象时使用了 set 方法来注入;
  2. 之前创建对象:Hello hello = new Hello();现在使用 Spring 来创建对象,在 Spring 中这些对象都成为 Bean
    • id 为变量名(对象名),相当于 hello
    • class 为类的全限名,相当于 new 的对象,也就是对象的实际类型;
    • property 为对象的属性,其中 name 为属性名,value 为属性对应的具体值,ref 为引用 Spring 容器中创建好的对象。
  3. 在实体类的一侧有叶子图标,说明该实体类被 Spring 所托管;
  4. 在上面这个过程中,对象由 Spring 创建,对象的属性由 Spring 容器设置。对象由之前的程序本身控制反转为由 Spring 创建,变成被动地接收对象,这个过程就叫控制反转
  5. 现在不需要去改动程序,要实现不同的操作,只需要在 xml 配置文件中进行修改。

四、IoC 创建对象方式

  1. 默认使用无参构造器创建对象,使用 property 标签,详细内容见:第六部分 Set 注入

  1. 如果使用有参构造器创建对象,有三种方式
    • 通过下标赋值constructor-arg 中所用元素有:indexvalue
    • 通过参数名赋值constructor-arg 中所用元素有:namevalue
    • 【不建议使用】通过类型赋值constructor-arg 中所用元素有:typevalue
<!-- 方式一:通过下标赋值 -->    
<bean id="user" class="com.Sun3285.pojo.User">
    <constructor-arg index="0" value="3"/>
    <constructor-arg index="1" value="Sun1234"/>
</bean>

<!-- 方式二:通过参数名赋值 -->  
<bean id="user" class="com.Sun3285.pojo.User">
    <constructor-arg name="id" value="2"/>
    <constructor-arg name="name" value="Sun4569"/>
</bean>

<!-- 方式三:通过类型赋值 --> 
<bean id="user" class="com.Sun3285.pojo.User">
    <constructor-arg type="int" value="5"/>
    <constructor-arg type="java.lang.String" value="Sun3215"/>
</bean>

注意

  1. 方式三中的类型 type ,如果是引用类型必须为全限名,如 String 的全限名为 java.lang.String
  2. 不推荐用方式三,因为多个属性的类型如果相同时,不好赋值;
  3. 从 Spring 容器中获取 getBean 到的对象为同一个对象
  4. 在配置文件加载 new ClassPathXmlApplicationContext("beans.xml") 时,创建了容器中所有的对象

五、Spring 配置

1. 别名

给对象起别名有两种方式

  • 方式一:在 bean 标签中加 name 取别名,这种方式可以给同一对象取多个别名,多个别名之间用逗号分号空格分隔;
  • 方式二:用 alias 标签设置别名。

2. Bean 的配置

见上面内容

3. import

一般用于团队开发,可以将多个配置文件,导入 import 合并为一个。

如可以将多个 beans.xml 导入到一个 applicationContext.xml 中,使用时,直接使用总的配置文件即可。

<import resource="beans.xml"/>
<import resource="beans1.xml"/>
<import resource="beans2.xml"/>

注意:如果导入的多个 beans.xml 中有重名的对象,会取最后一个来创建。


六、依赖注入

依赖注入的方式有三种:

  • 有参构造器注入(见第四部分);
  • 重点】Set 方式注入;
  • 拓展方式注入(c 命名和 p 命名空间注入)。

接下来重点介绍 Set 方式注入

1. 搭建环境

编写一个 Student 类,属性为复杂属性,例如包括自定义对象、数组、集合、Properties 对象等。

public class Student {

    private String name;
    private Address address;
    private String[] books;
    private List<String> hobbies;
    private Set<String> games;
    private Map<String, String> cards;
    private String wife;
    private Properties info;
    
    // get/set/toString 方法等
}
// 自定义类
public class Address {

    private String address;

    // get/set/toString 方法等
}

2. Set 注入

注入结果

3. 总结

  1. 依赖注入,其实就是创建对象后,利用 set 方法给对象的属性赋值;
  2. 在给复杂属性赋值时,灵活利用不同标签
    • arraylistset :这三个比较类似,都是value 标签赋值;
    • map比较特殊,用 entry 标签给键和值分别赋值;
    • props比较特殊,用 prop 标签给键和值分别赋值,注意:和 map 还不太一样;
    • 给属性赋空值,直接用 null 标签。

补充:c 命名和 p 命名空间注入

使用前提:需要在配置文件 beans.xml头文件约束中导入 c 命名和 p 命名空间:

<!-- c 命名空间 -->
xmlns:c="http://www.springframework.org/schema/c"
<!-- p 命名空间 -->
xmlns:p="http://www.springframework.org/schema/p"
  • c 命名空间:对应有参构造器注入;
  • p 命名空间:对应 Set 方式注入。

使用


七、Bean 的作用域

六种作用域

1. singleton

默认singleton:单例模式,创建的实例只有一个实现方式:在 bean 标签中加 scope="singleton" (也可以不加)

实现

2. prototype

prototype:原型模式,每次从容器中 get 都是一个新的对象实现方式:在 bean 标签中加 scope="prototype"

实现


注意:

  1. Spring Framework 官网:https://spring.io/projects/spring-framework#overview
  2. Spring Framework 参考文档:https://docs.spring.io/spring-framework/docs/current/reference/html/
  3. Spring Framework 6.0.8 API:https://docs.spring.io/spring-framework/docs/current/javadoc-api/
  4. 出现以下错误,解决方法:降低依赖的版本。

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

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

相关文章

1.nginx基础学习笔记

1.nginx基础 一.Nginx介绍 Nginx是十分轻量级的HTTP服务器。Nginx&#xff0c;它的发音为“engine X”&#xff0c;是一个高性能的HTTP和反向代理服务器&#xff0c;同时也是一个IMAP/POP3/SMTP 代理服务器。Nginx是由俄罗斯人 Igor Sysoev为俄罗斯访问量第二的 Rambler.ru站…

Cisco AnyConnect Secure Mobility Client 4.10.07061 (macOS, Linux, Windows)

Cisco AnyConnect Secure Mobility Client 4.10.07061 (macOS, Linux, Windows) Cisco Secure Client&#xff08;包括 AnyConnect&#xff09; 请访问原文链接&#xff1a;https://sysin.org/blog/cisco-anyconnect-4/&#xff0c;查看最新版。原创作品&#xff0c;转载请保…

Apache Kafka - 安装注意事项

文章目录 概述安装Kafka配置Kafka启动Kafka配置注意事项导图 概述 在现代的大数据时代&#xff0c;消息队列成为了极为重要的组件。Kafka作为一种高吞吐量、低延迟、可扩展的分布式发布订阅消息系统&#xff0c;在大数据领域得到了广泛的应用。来&#xff0c;这里我们将介绍如…

【场景方案】如何去设计并二次封装一个好用的axios,给你提供一个好的参考(1.0版)

文章目录 前言文件结构建议封装的文件结构接口管理文件 二次封装axios的初始配置initutilswebConfig 再封一层环境配置使用 前言 以下演示基于vue3与element-plus 文件结构建议 封装的文件结构 把二次封装axios所有有关的代码全部放在request文件夹中&#xff0c;其中init.js…

【系统移植】SD卡 分区

目录 1、分区框架 2、清空磁盘分区 3、开始分区 4、格式化分区 1、分区框架 制作SD卡时&#xff0c;我们需要对 SD 卡进行分区&#xff0c;每个区存入对应的内容&#xff0c;整体框架如下&#xff1a; 第二扇区&#xff1a;uboot程序从这里开始存储&#xff0c;最开始的第…

Class 07 - 功能包的安装和 tidyverse 介绍

Class 07 - 功能包的安装和 tidyverse 介绍 tidyverse 简介功能包&#xff08;package&#xff09;的安装tidyverse 的安装 功能包&#xff08;package&#xff09;的加载tidyverse 的加载 功能包&#xff08;package&#xff09;的更新tidyverse 核心功能browseVignettes 函数…

组合数学第三讲

composition&#xff08;组成&#xff09; k-composition&#xff1a; 20块巧克力分给4个小朋友&#xff0c;有几种分法&#xff1f; 隔板法&#xff0c;19个间隙插入3个板&#xff0c; 推广&#xff1a;n块分给k个 weak k-composition: 20块巧克力分给4个小朋友&#xff0c;每…

Ajax基础知识点总结

努力前进 目录 为什么需要Ajax&#xff1f; 1.提高用户体验&#xff0c;实现局部刷新效果 2.提高性能和降低带宽消耗 什么是 Ajax Ajax 的工作原理 Ajax的工作过程分为以下几个步骤&#xff1a; 最基础的Ajax代码演示&#xff1a; open函数中的参数分析: 在Ajax中ready…

Dijkstra单源最短路

Dijkstra单源最短路径 什么是单源最短路径 描述&#xff1a;给定一个带权有向图G (V&#xff0c;E)&#xff0c;其中每条边的权时非负数。另外&#xff0c;给定V中的一个顶点&#xff0c;称为源。现在要计算从源到所有其他各顶点的最短路长度。这里路的长度是指路上各边权之…

数据在 Mocaverse 项目启动过程中是如何发挥作用的

日期&#xff1a;2023年5月 数据源&#xff1a; Mocaverse Realm Ticket Collection Airdrop & Mocaverse Optimizes an NFT Project at Launch & Beyond NFT 是 Web3 社区的基础。它们是区块链游戏、DAO 和 metaverses 的入场券&#xff0c;以及成为社区参与者的数字…

[创业之路-69]:对管理理念的理解和解读

目录 前言&#xff1a; 一、管理者与领导者的区别 二、管理活动的分类 三、业务管理&#xff1a;以终为始 3.1 业务目标到高效执行 &#xff08;1&#xff09;先明确要做哪些正确的事 》 需求分析、目标 &#xff08;2&#xff09;再明确怎样正确的做事 》 设计、实现 …

chatgpt赋能Python-python3_pygame

Python3 Pygame&#xff1a;游戏引擎进入开发者的时代 Python是一种常用的编程语言&#xff0c;有许多优秀的库和框架&#xff0c;而其中Pygame是许多游戏开发者的首选。Pygame是一个用Python编写的开源软件包&#xff0c;旨在帮助游戏制作者创建交互式游戏和媒体程序。在本篇…

OpenCV基础操作(2)OpevCV算术运算

OpenCV基础操作(2)OpevCV算术运算 import cv2 as cv import numpy as np一、图像的基础操作 1、获取并修改像素值 你可以根据像素的行和列的坐标获取他的像素值。 对 BGR 图像而言&#xff0c;返回值为 B&#xff0c;G&#xff0c;R 的值。对灰度图像而言&#xff0c;会返回他…

微信小程序node+vue+uniapp课程在线答疑学习答题考试系统

系统主要分为管理员和学生、教师三部分&#xff0c;管理员服务端&#xff1a;首页、个人中心、学生管理、教师管理、课程资源管理、课程类型管理、学习记录管理、系统管理&#xff0c;教师服务端&#xff1a;首页、个人中心、课程资源管理、学习记录管理、试题管理、试卷管理、…

JAVA期末考内容知识点的梳理

作者的话 前言&#xff1a;这些都是很基本的&#xff0c;还有很多没有写出来&#xff0c;重点在于考试复习&#xff0c;包括后四章的内容 前面内容请参考JAVA阶段考内容知识点的梳理 一、集合、流 课堂总结1集合 集合概念&#xff1a; 保存和盛装数据的容器&#xff0c;将许多…

maven的常用命令clean/package/install/deploy

如标题&#xff0c;下面放图&#xff1a; 這就是一个pom对应的maven操作命令&#xff0c; 那这些命令中&#xff0c;最常用的打包项目的命令是什么&#xff1f; 两种最常用打包方法&#xff1a; 1.先 clean&#xff0c;然后 package2.先 clean&#xff0c;然后install 下面…

实验四 车辆定位导航

有想自己动手的同学可在末尾看教程 【实验目的】 1、了解全球定位导航系统的定位原理和电子地图技术&#xff0c;掌握电子地图API使用方法。 2、了解导航数据报文数据格式&#xff0c;解析导航数据并在电子地图上进行导航应用。 【实验性质】 验证性实验。 【实验要求】 1、相…

【动态规划专栏】--基础-- 动态规划经典题型

目录 动态规划 动态规划思维&#xff08;基础&#xff09; 状态表示&#xff08;最重要&#xff09; 状态转移方程&#xff08;最难&#xff09; 初始化&#xff08;细节&#xff09; 填表顺序&#xff08;细节&#xff09; 返回值&#xff08;结果&#xff09; 1、第 …

C++实现日期类Date(超详细)

个人主页&#xff1a;平行线也会相交&#x1f4aa; 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C之路】&#x1f48c; 本专栏旨在记录C的学习路线&#xff0c;望对大家有所帮助&#x1f647;‍ 希望我们一起努力、成长&…

C++笔试笔记2

C笔试笔记2 百富计算机的笔试 const限定符&#xff1a;首先作用于左边&#xff0c;如果左边没东西&#xff0c;就作用于右边。 const int&#xff1a; 左边没有内容&#xff0c;所以const作用于右边&#xff0c;就是“整型常量”。等同于int const&#xff1b; int * const&am…