Spring自学日志01-IOC(控制翻转)

news/2024/5/18 0:21:05/文章来源:https://www.cnblogs.com/csmCode/p/16732690.html

目录
  • 一、IOC的基本概念和底层原理
    • 1.1、什么是IOC?
      • 1.1.1、Spring IOC容器
    • 1.2、IOC底层原理
      • 1.2.1、IOC容器
      • 1.2.2、IOC容器装配Bean的方式
      • 1.2.3、IOC容器装配Bean的操作
        • 1.2.3.1、基于XML
        • 1.2.3.2、基于注解
      • 1.2.4、IOC容器装配Bean的作用域

一、IOC的基本概念和底层原理

1.1、什么是IOC?

(1)控制翻转,把对象的创建和对象之间相互调用的的过程交给Spring IOC容器来管理

(2)降低代码之间的耦合

1.1.1、Spring IOC容器

Spring 启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相应的Bean配置注册表,然后根据这张注册表实例化Bean,装配好Bean之间的依赖关系,为上层应用提供准备就绪的运行环境。
Bean缓存池:HashMap实现


图1

Spring 通过一个配置文件描述 Bean 及 Bean 之间的依赖关系,利用 Java 语言的反射功能实例化 Bean 并建立 Bean 之间的依赖关系。 Spring 的 IoC 容器在完成这些底层工作的基础上,还提供了 Bean 实例缓存、生命周期管理、 Bean 实例代理、事件发布、资源装载等高级服务。

1.2、IOC底层原理

1.2.1、IOC容器

Spring 的IOC容器长什么样呢?其实Spring 作者设计了两个接口用以表示容器。分别是BeanFactoryApplicationContext

  • BeanFactory 是 Spring 框架的基础设施,面向 Spring 本身是整个IOC最底层的接口。也是ApplicationContext接口继承的源头;
  • ApplicationContext 面向使用Spring框架的开发者几乎所有的应用场合我们都直接使ApplicationContext 而非底层的 BeanFactory

1.2.2、IOC容器装配Bean的方式

IOC有两种装配Bean的方式: 依赖查找(DL)依赖注入(DI)

  1. 依赖注入(DI)是Spring 最主要的使用方式。主要使用两种方式setter()方法注入构造函数注入
  2. 依赖查找(DL)Spring也支持但是不推荐使用(主要是博主也不会) ,因为他需要用户自己去是使用 API 进行查找资源和组装对象。具有侵入性

1.2.3、IOC容器装配Bean的操作

SpringIOC容器装配Bean有4种方式:

  • XML配置
  • 注解
  • JavaConfig
  • 基于Groovy DSL配置(工作中很少使用)

总的来说:Spring在日常工作中主要使用XML注解,其中注解这种方式占大头!

1.2.3.1、基于XML

假设有类User.java

package com.User;/*** @description:* @author: 陈声铭* @time: 2022/9/18 16:21*/
public class User {private String name;public User(String name) {System.out.println("有参构造");this.name = name;}public User() {System.out.println("无参构造");}public String getName() {return name;}public void setName(String name) {System.out.println("Set函数");this.name = name;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +'}';}
}

假设有配置文件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 http://www.springframework.org/schema/beans/spring-beans.xsd"><!--无参构造创对象类型 变量名 = new 类型();Hello hello =new Hello();id = 变量名class = new 的对象property相当于给对象中的属性设值!--><bean id="user" class="com.User.User"><property name="name" value="陈声铭"/></bean></beans>

我们就可以借助Xml装配Bean

import com.User.User;
import com.util.ObjectFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** @description:* @author: 陈声铭* @time: 2022/9/18 16:27*/
public class MyTest {public static void main(String[] args) {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/beans.xml");System.out.println(applicationContext.getBean("user"));}
}

可以看到

  1. User对象的创建是通过构造函数注入
  2. Name属性的添加是通过setter()方法注入

这就是Spring-IOC通过依赖注入(DI)装配Bean的方式

1.2.3.2、基于注解

注解分两类装配注解注入注解

装配注解:@Component 、@Service、@Controller、@Repository

注入注解:@Autowired(根据类型注入)、@Qualifier(根据id注入)

1.2.4、IOC容器装配Bean的作用域

IOC容器装配Bean的作用域

  1. 默认是singleton,即单例模式,是Spring装配Bean默认的模式。容器在启动时,自动实例化所有singleton的Bean并缓存与容器中。这样做有一个好处,当程序运行时使用到bean时从直接缓存中读取,提高了运行效率。装配流程参考 图1
  2. prototype,Spring容器启动时不会实例化prototype的bean。每次从容器调用bean时都会创建一个新的对象。
  3. request,每次http请求都会创建一个对象(工作中极少使用)
  4. session,同一个session共享一个对象(工作中极少使用)
  5. global-session(工作中极少使用)

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

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

相关文章

MySQL:索引特性

索引 0. 预备知识 索引是一个“物美价廉”的特性&#xff0c;用来提高数据库的性能。不需要改程序、调SQL、只需要正确的创建索引&#xff0c;查询速度就能提高成百上千倍&#xff0c;但查询速度的提升也带来了插入、更新、删除速度的下降。 0.1 认识磁盘 MySQL对数据进行增…

大数据讲课笔记2.1 初探大数据

文章目录零、学习目标一、导入新课二、新课讲解&#xff08;一&#xff09;什么是大数据&#xff08;二&#xff09;大数据的特征1、数据体量大2、数据类型多3、处理速度快4、价值密度低&#xff08;三&#xff09;研究大数据的意义&#xff08;四&#xff09;拥抱大数据时代1、…

【数据结构初阶】第四话 —— 动态栈的基本操作

文章目录什么是栈栈的结构1. 初始化栈2. 入栈3. 出栈4. 获取栈顶元素5. 获取栈中有效元素个数6. 检测栈是否为空7. 销毁栈8. 总结接口函数贴图什么是栈 假如有⼀个⼜细⼜⻓的圆筒&#xff0c;圆筒⼀端封闭&#xff0c;另⼀端开⼝。往圆筒⾥放⼊乒乓球&#xff0c;先放⼊的靠近…

U盘插入自动读写/U盘插入自动复制/pythhttps://www.cnblogs.com/wawawa888/p/16749476.htmlon检测U盘的插入,以及进行自动复制文件并写入文件

U盘自动读写的小玩意 共有四种方法(我知道的方法,全是转载。转载也很不易,可望给个硬币) 方法一(vbs方法 全自动,转载自bilibili 点我跳转)文件下载链接(点我下载) 方法二(cmd方法 需手动,转载自bilibili 点我跳转)文件下载链接(点我下载) 方法三(python方法 全…

在DataFrame中根据索引值进行排序:sort_index()函数

【小白从小学Python、C、Java】 【Python-计算机等级考试二级】 【Python-数据分析】 在DataFrame中根据索引值进行排序&#xff1a; sort_index()函数 [太阳]选择题 对以下python代码表述有误的选项是&#xff1f; import numpy as np import pandas as pd data np.random.…

ElasticSearch_03_批量处理命令mget和bulk的使用

系列文章目录 文章目录系列文章目录前言一、批量处理命令mget方案1&#xff1a;body请求体中指定index和type方案2&#xff1a;url中指定index和type&#xff0c;body中仅指定ids方案2扩展&#xff1a;url中指定index和type&#xff0c;body中仅指定id数组二、基于bulk的增删改…

C++开发坦克大战--补充(加入传送门)--附完整代码

目录 素材整理 穿越草地 坦克穿越草地 子弹穿越草地 传送门 判定形式 生成传送门 传送坦克 关卡模式 效果展示 ​总结 完整代码 上一篇坦克大战居然意外获得了一些关注&#xff0c;正好最近也完善了一些功能&#xff0c;同时也加入了一些自己想到的新元素&#xff0c;主要是…

python requests cookie的获取和使用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、cookie是什么&#xff1f;二、使用步骤开始代码实现会话是什么然后写入我们的账号信息使用session访问登陆账号的url获取账号的书架上的数据完整的代码补充比…

基于javaweb在线投票管理系统ssm

基于SSM的在线投票系统以XXX学院为背景&#xff0c;运用在校所学习的软件开发原理&#xff0c;采用SpringSpringMVCMyBatis技术和MySQL数据库构建一个基于B/S模式的在线投票系统。 传统的投票模式都是通过人工手动填写问卷的方式来进行&#xff0c;这在很大程度上会造成人力和…

1.1 Ryu 的安装部署

What is Ryu Ryu是轻量级的、开源的SDN控制器Ryu是由日本NTT公司在2012年推出其名字在日文中的意思是“Flow”和“Dragon”的意思 Ryu架构 Ryu安装 在Ubuntu上装Ryu和Mininet&#xff0c;CSDN上搜教程&#xff0c;这一部分正确做法是对着视频敲代码如果有问题去CSDN上找解决办…

滤波器基础01——滤波器的种类与特性

滤波器是一种选频装置&#xff0c;它能够保留某一频段的信号&#xff0c;将此频段之外的信号消除。以下介绍不同分类依据下滤波器的特点。 一. 模拟滤波器与数字滤波器 根据滤波器的作用对象是模拟信号还是数字信号可将滤波器分为模拟滤波器和数字滤波器。 模拟滤波器处理模…

创建并运行一个 Spring Boot 项目

创建并运行一个 Spring Boot 项目引言第一个 Spring Boot 项目1. 创建一个 spring boot 项目第一步第二步第三步第四步2. 验证第一步第二步3. 写一个 hello world第一步解析代码第二步注意事项网页创建一个 Spring Boot 项目Spring Boot 的优点引言 Spring Boot 是 Spring 框架…

升级迭代:让我的颜色控制打印工具mypycolor更聪明,参数可以任意接收颜色控制码、颜色描述英文单词的任意组合。

【点击此处跳转笔记正文】Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那么简单…… My CSDN主页、My HOT博、My Python 学习个人备忘录好文力荐、 老齐教室 自学并不是什么神秘的…

YOLOV+pytorch+win10+CPU环境配置

Step 1&#xff1a;下载github YOLOV3源码 链接&#xff1a;https://github.com/ultralytics/yolov3 Step 2&#xff1a;配置CPUpytorch版本环境 WinR启动cmd&#xff0c;在命令提示符内输入以下命令&#xff0c;创建一个新环境&#xff1a; conda create –n yolov-pytorc…

记录自学的学习路线(详细)

目录 HTML css javaScript javaScript高级 jQuery(快速过一遍) bootstrap 移动端适配 ajax ES6 Vue2vue3全家桶&#xff08;vue3暂时不学&#xff0c;后面会解释原因&#xff09; axios promise vue2结束后 Vue3 Ts 依我而言 曾经我也迷茫过&#xff0c;如何学习…

JWT 和 JJWT 还傻傻的分不清吗

JWTs是JSON对象的编码表示。JSON对象由零或多个名称/值对组成,其中名称为字符串,值为任意JSON值。 JWT有助于在clear(例如在URL中)发送这样的信息,可以被信任为不可读(即加密的)、不可修改的(即签名)和URL - safe(即Base64编码的)。 JSON Web Token (JWT) 作为一个开放的标准…

CPU--指令系统

1.机器的指令的一般格式:操作码字段,地址码字段; 2.数据在存储器中的存放方式:a,从任意位置开始--不浪费空间,读写控制比较复杂; :b, 从一个存储字的起始位置开始存储--读写控制简单,浪费空间;  :c,边界对准方式,按地址数字节的整数倍位置存储--结合前两者;3.寻址…

日本抢滩Web3:“樱花”如何在加密彼岸绽放

失去互联网之后&#xff0c;这个第三大经济体决定在Web3奋起直追。 9月22日&#xff0c;Astar 创始人渡边宗太在自己的博客宣布&#xff0c;Astar 的原生代币通过了金融厅和 JVCEA&#xff08;日本加密资产交易协会&#xff09;的严格审核&#xff0c;并将在日本本土交易所 Bit…

汉诺塔问题分治求解

汉诺塔问题 在经典汉诺塔问题中,有 3 根柱子及 n 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制: (1) 每次只能移动一个盘子; (2) 盘子只能从柱子顶端滑…

Java Web 10 JSP 10.7 MVC 模式和三层架构

Java Web 【黑马程序员新版JavaWeb基础教程&#xff0c;Java web从入门到企业实战完整版】 10 JSP 文章目录Java Web10 JSP10.7 MVC 模式和三层架构10.7.1 MVC 模式10.7.2 三层架构10.7.3 MVC 和 三层架构10.7 MVC 模式和三层架构 MVC 模式和三层架构是一些理论的知识&#…