Spring(Spring的理解+DI+Spring的创建)

news2024/11/23 19:13:26

目录

1. Spring 是什么

2. DI

3. 面试题: IoC 和 DI 有什么区别?

4. Spring 的创建

5. 将 Bean (对象) 存储到 Spring (容器) 中

6. 将 Bean (对象) 从 Spring (容器) 中取出来 

7. 面试题: ApplicationContext 和 BeanFactory的区别

8. getBean 更多用法


1. Spring 是什么

通常所说的 Spring 是 Spring Framework (Spring 框架), 

用一句话来解释 Spring: Spring 是包含了众多工具方法的 IoC 容器

那么什么是 IoC 容器? 

先来理解看一下什么是容器: 容器是用来容纳某种物品的 (基本) 装置

对比到前面的知识点,   目前接触到的容器有

  • List / Map -->  数据存储容器
  • Tomcat  -->  Web 容器

Spring 也是一个容器, Spring 是一个 IoC 容器

下面再看一下什么是 IoC ?

IoC = Inversion of Control 翻译过来就是 "控制反转" 的意思, 也就是

Spring 是一个 "控制反转" 的容器,

("控制反转":之前的控制权是在我身上,现在反转了,也就是我把控制权交出去了,交给框架了,下次我再要用X的时候,直接告诉框架,我要用X,而现在的X的生命周期和我没啥关系)

IoC 优点: 实现代码的解耦; 对象 (Bean) 生命周期交给 IoC 框架来维护,作为程序员无需再关注了

Spring IoC 容器最核心的功能:

  1. 将 Bean (对象) 储到 Spring (容器) 中
  2. 将 Bean (对象) 从 Spring (容器) 中出来 

Spring 是一个 IoC 容器, 说的是对象的创建和销毁的权利都交给 Spring 来管理了, 它本身又具备了存储对象和获取对象的能力. 


2. DI

说到IoC 就要提到 "DI", DI 是 Dependency Injection 的缩写,翻译过来就是 "依赖注入" 的意思

依赖:比如说A类中,需要用到B类,那就说A依赖B

注入:将一个东西拿过来用就叫做注入

合起来"依赖注入"的意思就是: 有 IoC 容器在运行期间,动态的将某种依赖关系注入到对象中.

依赖注入的角度就是,通过引用 IoC 容器,利用依赖关系注入的方式,实现对象之间的解耦,所以DI 是一种实现


3. 面试题: IoC 和 DI 有什么区别?

IoC 是一种思想: 控制反转

DI 是一种实现: 依赖注入 


4. Spring 的创建

(1) 创建一个 maven 项目

输入项目名就可以了

(2) 添加 spring 框架支持(spring-context/spring-beans)

先配置镜像国内源

<mirror>  
      <id>alimaven</id>  
      <name>aliyun maven</name>  
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>  
      <mirrorOf>central</mirrorOf>          
    </mirror>

然后再添加Spring框架支持 

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.3.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.2.3.RELEASE</version>
        </dependency>
    </dependencies>

(3) 创建一个启动类并添加 main


5. 将 Bean (对象) 存储到 Spring (容器) 中

存储 Bean 对象三步(两步)走

  1. 如果是第一次添加, 先在 spring 项目中添加配置文件
  2. 先创建一个 Bean 对象
  3. 在配置文件中将需要保存到 spring 中的 Bean 对象进行注册

(1) 在 spring 项目中添加配置文件

<?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">
</beans>

 (2) 创建一个 Bean 对象

(3) 在配置文件中将需要保存到 spring 中的 Bean 对象进行注册

id可以不等于 class 里面的类名,但是要尽量符合规范

类名使用大驼峰, bean id 通常使用小驼峰. 

假设类名是 UserInfo, 那么通常情况下 id 它应该是 userInfo 


6. 将 Bean (对象) 从 Spring (容器) 中出来 

获取并使用 Bean 对象,分为以下 3 步:
  1. 先得到 spring 上下文对象(ApplicationContext / BeanFactory)
  2. 再通过上下文对象提供的方法,获取需要使用的 bean 对象
  3. 可以使用 bean 对象
import com.beans.UserBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class app {
    public static void main(String[] args) {
        // 1. 得到 spring 上下文对象
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

        // 2. 根据上下文对象提供的方法,获取需要使用的 bean 对象
        UserBean userBean = (UserBean) context.getBean("user");

        // 3. 可以使用 bean 对象
        userBean.sayHi("张三");
    }
}
import com.beans.UserBean;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;

public class app {
    public static void main(String[] args) {
        // 1. 得到 spring 上下文对象
        BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));

        // 2. 根据上下文对象提供的方法,获取需要使用的 bean 对象
        UserBean userBean = (UserBean) beanFactory.getBean("user");
        
        // 3. 可以使用 bean 对象
        userBean.sayHi("张三");
    }
}
package com.beans;
//普通的 bean 对象
public class UserBean {
     public void sayHi(String name) {
         System.out.println("你好:" + name);
     }
}
<?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="user" class="com.beans.UserBean"></bean>
</beans>

7. 面试题: ApplicationContext 和 BeanFactory的区别

相同点: ApplicationContext 和 BeanFactory 效果是⼀样的, 都可以实现从容器中获取 bean,都提供了 getBean 的方法.

不同点:

从继承关系和功能方面来看: BeanFactory 提供了基础的访问容器的能力,

而 Application 属于 BeanFactory 的子类,它除了继承了 BeanFactory 的所有功能外,它还拥有独特的特性,还添加了对国际化支持,资源访问支持,以及事件传播等方面的支持.

从性能方面来看: Application 是一次加载并初始化所有的 Bean 对象(饿汉方式),

而 BeanFactory 是需要哪个才去加载哪个,所以更加的轻量(懒汉方式)


8. getBean 更多用法

(1) 使用 bean name 获取 bean

 (2) 根据 bean type 获取 bean

(3) 根据 bean name 和类型获取 bean (推荐使用)

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

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

相关文章

能否在虚拟平台里构建真实的生活体验?

接近三年的疫情&#xff0c;重构了每一个人的生活。线下活动的频繁延期、取消&#xff0c;使得物理空间的聚集充满了不确定性&#xff0c;线上办公、网络授课等远程协同的方式在这样的时代背景下&#xff0c;毫无疑问成了主旋律。曾经只停留在想象层面的不出门就能完成工作、上…

u盘打不开常见原因|数据恢复方法|解决方案

u盘作为一种常用的外部存储器&#xff0c;能够帮助我们存放大量的数据&#xff0c;如图片、文档、视频等文件类型。但是在使用过程中&#xff0c;难免会遇到这样或那样的问题&#xff0c;比如使用过程中出现u盘打不开的情况&#xff0c;但是里面又有自己重要的文件&#xff0c;…

数字图像处理(入门篇)一 图像的数字化与表示

目录 1 人眼图像是如何形成的&#xff1f; 2 图像的感知与获取&#xff1f; 3 图像的数字化 4 数字图像的表示 1 人眼图像是如何形成的&#xff1f; 人眼近似为一个球体&#xff0c;物体的光线经过角膜和晶状体的折射&#xff0c;在视网膜上形成“倒立缩小”的实像。 视网膜…

这或许是全网最详细的介绍预言机赛道的视频课程,通俗易通,有趣有料!

图片来源&#xff1a;由无界版图 AI 绘画工具生成有一句话在创业者中很流行&#xff1a;Web3创业三大坑&#xff0c;隐私、跨链、预言机……搞塌加密市场的DK和SBF还在豪华度假酒店里思考人生搞隐私&#xff0c;一毛钱没赚到的Tornado cash开发者却在吃牢饭……加密圈前十大资产…

javascript中的polyfill是什么,polyfill和babel的关系

首先我们看看这个单词的意思 好像也没有解释啥&#xff0c;但是给人的感觉是一种用来补充&#xff0c;优化的东西。 没错在js中也正有这个意思 js中的polyfill用来表示&#xff0c;根据新特性的定义&#xff0c;创建一段与之行为等价&#xff0c;但是能够在旧的js环境中运行的…

如何实现机器人自动拉微信群

如果想长期运营一个微信群&#xff0c;每天手动拉人进群是很痛苦的事情。实际上可以用微信机器人来替代人力&#xff0c;实现过程也并没有想象中的那么困难 引导一下思路 1. 经验分析 如果是手动拉人进群的话&#xff0c;根据我们的日常经验&#xff0c;基本上逻辑是这样的&…

​GENIUS: 根据草稿进行文本生成的预训练模型,可用于多种NLP任务的数据增强...

©PaperWeekly 原创 作者 | 郭必扬 单位 | 上海财经大学信息管理与工程学院AI Lab论文标题&#xff1a;GENIUS: Sketch-based Language Model Pre-training via Extreme and Selective Masking for Text Generation and Augmentation论文作者&#xff1a;Biyang Guo, Yeyu…

赤霉素3β-羟化酶的下调增强了大豆的光合作用并提高了种子产量

文章信息 题目&#xff1a;Downregulation of a gibberellin 3β-hydroxylase enhances photosynthesis and increases seed yield in soybean 刊名&#xff1a;New Phytologist 作者&#xff1a;Fang Huang,Zhixi Tian,Deyue Yu et al. 单位&#xff1a;Nanjing Agricultu…

探讨下如何更好的使用缓存 —— 集中式缓存Redis的BitMap存储、管道与事务、以及与本地缓存一起构建多级缓存

大家好&#xff0c;又见面了。 通过前面的文章&#xff0c;我们一起剖析了Guava Cache、Caffeine、Ehcache等本地缓存框架的原理与使用场景&#xff0c;也一同领略了以Redis为代表的集中式缓存在分布式高并发场景下无可替代的价值。 现在的很多大型高并发系统都是采用的分布式…

Oracle自定义函数实现递归查询(用自定义函数替换connect_by_root)

Oracle自定义函数实现递归查询&#xff08;用自定义函数替换connect_by_root&#xff09;1. 前言2. connect_by_root 和 自定义函数2.1 用 connect_by_root 实现2.2 用 自定义函数实现2.2.1 自定义函数2.2.2 实现效果1. 前言 看这篇文章之前可以先看下面的文章 oracle递归查询&…

B站季报图解:营收58亿净亏收窄36% 日活突破9000万

雷递网 雷建平 11月29日哔哩哔哩股份有限公司&#xff08;简称&#xff1a;“B站”&#xff09;今日发布财报。财报显示&#xff0c;B站2022年第三季营收57.9亿&#xff0c;同比增11%。B站2022年第三季度日均活跃用户数达9030万&#xff0c;月均活跃用户数达3.33亿&#xff0c;…

springboot整合minio

minio是对象存储服务。它基于Apache License 开源协议&#xff0c;兼容Amazon S3云存储接口。适合存储非结构化数据&#xff0c;如图片&#xff0c;音频&#xff0c;视频&#xff0c;日志等。对象文件最大可以达到5TB。 优点有高性能&#xff0c;可扩展&#xff0c;操作简单&a…

招标网站信息爬取

目标网站 某采购与招标网  代码链接code-repo 准备工作 参考博客[1]&#xff0c;使用谷歌浏览器的开发者工具&#xff0c;提取http的表单信息。  http post 中的表单信息&#xff0c;需要含有_qt信息。网站使用_qt做反爬虫措施。_qt由服务器返回&#xff0c;在不同的会话中…

第五站:操作符(终幕)(一些经典的题目)

目录 一、分析下面的代码 二、统计二进制中1的个数 解一&#xff1a;&#xff08;求出每一个二进制位&#xff0c;来统计1的个数&#xff09; 解二&#xff1a;&#xff08;利用左我们移或右移操作符和按位与&#xff09; 解三&#xff1a;&#xff08;效率最高的解法&…

Java中的集合框架

目录 集合体系 Collection - List接口实现类 Collection - List接口对象的遍历 Collection - List - ArrayList Collection - List - Vector Collection - List - LinkedList Collection - Set接口实现类 Collection - Set接口的遍历 Collection - Set - HashSet Has…

哈夫曼压缩算法-Python实现

前面上传了A*算法的实现&#xff0c;就顺便把一起写的哈夫曼压缩也上传了吧 本文主要提供了Python版本的哈夫曼压缩算法实现&#xff0c;并在此基础上提供了命令行和基于Qt的GUI用户界面&#xff08;User Interface&#xff09; 哈夫曼&#xff08;Huffman Encoding&#xff09…

HTTP 协议内容的介绍与应用

HTTP简介 HTTP 超文本传输协议(Hyper Text Transfer Protocol)是一个应用层的协议&#xff0c;使用相当广泛&#xff0c;比如我们常说浏览器敲入网址打开网页&#xff0c;浏览器跟后台服务器之间就用的是HTTP&#xff0c;并且也常用于后端各个微服务之间的数据请求和通信。是我…

【学习笔记62】判断数据类型的方法

1. typeof&#xff1a;判断基本数据类型 console.log(typeof(123));console.log(typeof(123));console.log(typeof(true));console.log(typeof(undefined));console.log(typeof([1, 2, 3]));console.log(typeof({a:1}));2. constructor 可以判断当前数据的构造函数是谁 const …

Node.js 入门教程 51 Node.js Buffer

Node.js 入门教程 Node.js官方入门教程 Node.js中文网 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删 文章目录Node.js 入门教程51 Node.js Buffer51.1 什么是 buffer&#xff1f;51.2 为什么需要 buffer&#xff1f;51.3 如何创建buffer51.4 使用 buff…

KVM虚拟化部署

一、 安装配置KVM 相关软件 检查本机CPU是否支持虚拟化 intel: 最新linux内核的Intel处理器(含VT虚拟化技术) vmx nx lm AMD: 含SVM安全虚拟机技术的AMD处理器, 也叫AMD-V svm nx lm 可以使用如下命令检查&#xff1a; [rootzutuanxue ~]# egrep "(vmx|svm)" /p…