初识 Spring (存储和获取 bean)

news2024/11/25 23:02:08

目录

  • 初识 Spring
    • 总结
  • DI(依赖注入)
  • Spring 项目的创建
    • 创建一个 Maven 项目
    • 添加 Spring 框架支持
    • 添加启动类
  • 存储 bean 对象
    • 创建 bean
    • 将 bean 注册到容器中
  • 获取并使用 bean 对象
    • 获取 bean 的方法一
    • 获取 bean 的方法二
    • 获取 bean 的方法三
  • ApplicationContext 和 BeanFactory 的区别 (重点)
  • 总结

初识 Spring

Spring 是包含众多工具方法的 IoC 容器.

容器就是存储用的, 比如像以前学的 List / Map 就是存储数据的容器, 再像 Tomcat 就是 Web 容器.
容器最核心就是两点 : 存储和获取.

那 IoC 容器又是啥意思呢 ?
IoC = Inversion of Control 就是 “控制(权)反转” 的意思.

理解 :
以往我们获取对象都是通过 new 关键字来创建对象并获取的, 这样通过自己写代码控制类对象的生命周期, 我们是掌握对象控制权的, 而控制权反转就是指控制权不交由程序员控制了, 而是由 Spring(Spring容器 / IoC容器) 来控制.

IoC 容器就是存放 bean(对象) 的容器, 我们如果需要就去容器获取, 不需要自己 new 对象了.

这样有什么好处呢 ?
对代码进行解耦, 即使底层类发生改变, 整个调用链都不需要改动, 使程序设计更加通用, 灵活.

举个例字 :
我有两个类 :

public class B {
    private int b = 25;
    public B() {
        System.out.println("b : " + b);
    }
}
public class A {
    public A() {
        B b = new B();  // A 类依赖 B 类
    }
}

测试类 :

public class Test {
    public static void main(String[] args) {
        A a = new A();  //传统是直接 new 对象
    }
}

如果我要对 B 类的 b 进行修改, 那只能修改底层的 B 类代码 :

public class B {
    private int b = 25;
    public B(int m) {
        b = m;
        System.out.println("b : " + b);
    }
}

B 的构造方法变了, A 类的构造方法也要变 :

public class A {
    public A(int m) {
        B b = new B(m);
    }
}

测试类 :

public class Test {
    public static void main(String[] args) {
        A a = new A(66);
    }
}

我们只是改动底层代码一点点, 就牵一发而动全身了, 这显然很麻烦, 它们的耦合太强了, IoC 容器就解决了这一点, 让程序员修改底层代码而不动整个调用链.

总结

Spring 是⼀个 IoC 容器,对象的创建和销毁都交给 Spring 来管理了,它本身⼜具备了存储对象和获取对象的能⼒。

DI(依赖注入)

DI 是 Dependency Injection 的缩写, 翻译成中⽂是“依赖注⼊”的意思.
所谓依赖注⼊, 就是由 IoC 容器在运⾏期间, 动态地将某种依赖关系注⼊到对象之中.

DI 与 IoC 区别:
DI 和 IoC 是从不同角度描述同一件事情,IoC 是一种思想,它就是要实现对像解耦,不管用什么样的方法;DI 则是一种具体手段,来实现对象解耦.

Spring 项目的创建

创建一个 Maven 项目

在这里插入图片描述
在这里插入图片描述

添加 Spring 框架支持

在项⽬的 pom.xml 中添加 Spring 框架的⽀持,xml 配置如下 :

<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>

添加的框架有 spring-context:spring 上下⽂,还有 spring-beans:管理对象的模块。

注意 : 这里只是声明要这些依赖, 以及依赖所在地, 并不是添加完上述代码就添加完了依赖, 还得刷新一下, 让 idea 去下载这些依赖.

添加启动类

最后在创建好的项⽬ java ⽂件夹下创建⼀个启动类,包含 main ⽅法即可:

public class App {
    public static void main(String[] args) {
        
    }
}

存储 bean 对象

想存储 bean 对象, 首先得有 bean 才行, 因此首先得创建一个 bean, 然后将 bean 注册到 Spring 容器中.

创建 bean

bean 就是 Java 中 一个普通对象, 创建 bean 就是创建对象.

在这里插入图片描述

将 bean 注册到容器中

在创建好的项⽬中添加 Spring 配置⽂件 spring-config.xml,将此⽂件放到 resources 的根⽬录下,
如下图所示:
在这里插入图片描述
在 spring-config.xml 中添加 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"
       xmlns:content="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
</beans>

再将 Student 对象注册到 Spring 中就可以,具体操作如下:
在这里插入图片描述

注意 :
class 是对应你要注册的类的路径, 当我们获取 bean 的时候就会去这个路径中扫描, 如果扫描不到就会报错;
id 这里是可以随便取的, 只是给这个路径中注册的 bean 对象取个名字, 方便后续获取.
如果存在多个 bean 需注册, 则添加多个 < bean > 标签

获取并使用 bean 对象

获取并使⽤ Bean 对象,分为以下 3 步:

  1. 得到 Spring 上下⽂对象,因为对象都交给 Spring 管理了,所以获取对象要从 Spring 中获取,那
    么就得先得到 Spring 的上下⽂。
  2. 通过 Spring 上下⽂,获取某⼀个指定的 Bean 对象。
  3. 使⽤ Bean 对象。

获取 bean 的方法一

public class App {
    public static void main(String[] args) {
        //1. 获取 spring 上下文对象, 注意后面需填写添加配置的文件名称
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        //2. 获取 bean 对象, 后面的字符串要与我们之前取的名字相匹配, 
        //   获取到的 bean 是 object 类型的, 需强制类型转换
        Student student = (Student)context.getBean("student");
        //检验对象是否获取到
        System.out.println(student.sayHi("佩奇"));
    }
}

在这里插入图片描述

获取 bean 的方法二

public class App {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        //这里是直接通过类类型来获取 bean 对象, 所以返回的值不需要转换
        Student student = context.getBean(Student.class);
        //Student student = (Student)context.getBean("student");
        System.out.println(student.sayHi("佩奇"));
    }
}

当我们 Student 仅有一个 bean 对象时, 这样直接通过类名来获取 bean 对象显然没问题, 但若 Student 存在多个 bean 对象呢 ? 它会获取到哪个 bean 对象呢 ?
在这里插入图片描述
这里我们载注册一个 Student 类的 bean 对象, 并取名为 student2.
来看看获取效果 :
在这里插入图片描述
报错信息是 : 找到两个匹配结果, 但它只期望有一个结果.
如果是用 id 来获取就不会出现这种情况了, 因为每个 bean 都有唯一的 id.

获取 bean 的方法三

public class App {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        //通过 id 获取 bean, 并将所得 bean 转为 Student 类型, 无需类型转换了
        Student student = context.getBean("student", Student.class);
        //Student student = context.getBean(Student.class);
        //Student student = (Student)context.getBean("student");
        System.out.println(student.sayHi("佩奇"));
    }
}

ApplicationContext 和 BeanFactory 的区别 (重点)

其实 BeanFactory 也可以获取 Bean 对象.

public class App {
    public static void main(String[] args) {
        BeanFactory context = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
        //ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        //通过 id 获取 bean, 并将所得 bean 转为 Student 类型, 无需类型转换了
        Student student = context.getBean("student", Student.class);
        //Student student = context.getBean(Student.class);
        //Student student = (Student)context.getBean("student");
        System.out.println(student.sayHi("佩奇"));
    }
}

ApplicationContext 和 BeanFactory 效果是⼀样的, 那它们之间的区别是什么呢 ?

区别 :

  1. ApplicationContext 是 BeanFactory 的子类, ApplicationContext 不仅拥有父类的所有方法, 还扩展了很多父类没有的方法. (国际化支持、资源访问支持、事件传播支持等)
  2. ApplicationContext 是⼀次性加载并初始化所有的 Bean 对象, ⽽ BeanFactory 是懒加载(需要哪个才去加载哪个), 因此更加轻量.

总结

  1. 操作容器之前, 先要有容器, 所以先要得到容器.
  2. 存对象
    a. 创建 Bean (普通类).
    b. 将 Bean 注册(配置)到 spring-confing.xml 中.
  3. 取对象
    a. 得到 Spring 上下⽂, 并读取到 Spring 的配置⽂件.
    b. 获取某⼀个 Bean 对象.
    c. 使⽤ Bean 对象.

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

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

相关文章

【雕爷学编程】Arduino动手做(55)--DHT11温湿度传感器模块2

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

Cesium态势标绘专题-位置点(标绘+编辑)

标绘专题介绍:态势标绘专题介绍_总要学点什么的博客-CSDN博客 入口文件:Cesium态势标绘专题-入口_总要学点什么的博客-CSDN博客 辅助文件:Cesium态势标绘专题-辅助文件_总要学点什么的博客-CSDN博客 本专题没有废话,只有代码,代码中涉及到的引入文件方法,从上面三个链…

RocketMQ教程-(4)-领域模型-消费者分组ConsumerGroup

定义​ 消费者分组是 Apache RocketMQ 系统中承载多个消费行为一致的消费者的负载均衡分组。 和消费者不同&#xff0c;消费者分组并不是运行实体&#xff0c;而是一个逻辑资源。在 Apache RocketMQ 中&#xff0c;通过消费者分组内初始化多个消费者实现消费性能的水平扩展以…

练习——动态内存分配的笔试题

今天我们分享几道经典的笔试题&#xff0c;做完直接变成陈泽 第一题 ~~ --------------------------------------------------------------------------------------------------~~ void GetMemory(char* p) {p (char*)malloc(100); } void Test(void) {char* str NULL;Get…

计算机网络第一章概述

第1章 网络概述 因特网(Internet) 是世界上最大的互连网络【小写i的internet是通用名词&#xff0c;互连的网络都叫internet】 因特网的前身是1969年创建的第一个分组交换网&#xff1a;ARPANT 普通用户如何接入因特网&#xff1f; 通过ISP接入因特网。ISP可以从因特网管理…

C/C++ 程序 IDE 开发工具 CLion

下载地址&#xff1a; https://www.jetbrains.com/clion/ https://www.jetbrains.com/clion/ 下载地址&#xff1a; https://www.jetbrains.com/clion/download/ https://www.jetbrains.com/clion/download/ 历史版本&#xff08;老版本&#xff09;下载地址&#xff1a; h…

基于RASC的keil电子时钟制作(瑞萨RA)(4)----使用串口进行程序烧写

基于RASC的keil电子时钟制作4_使用串口进行程序烧写 概述硬件准备视频教程软件准备hex文件准备UART串口与瑞萨开发板进行接线烧录 概述 本篇文章主要介绍如何使用UART串口烧写程序到瑞萨芯片&#xff0c;并以实际项目进行演示。 硬件准备 首先需要准备一个开发板&#xff0c…

Docker 续

Docker 续 一、Docker 网络1.1 Docker 网络实现原理1.2 Docker 的网络模式1.2.1 Docker 网络模式分类 1.3 如何创建各类网络模式1.4 host模式1.5 container模式1.6 none模式1.7 bridge模式1.8 自定义网络 二、资源控制2.1 Cgroup2.2 CPU 资源控制2.2.1 设置CPU使用率上限2.2.2 …

Attention详解(自用)

encoder-decoder 分心模型&#xff1a;没有引入注意力的模型在输入句子比较短的时候问题不大&#xff0c;但是如果输入句子比较长&#xff0c;此时所有语义完全通过一个中间语义向量来表示&#xff0c;单词自身的信息已经消失&#xff0c;可想而知会丢失很多细节信息&#xff0…

科技UI图标的制作

科技UI图标的制作&#xff0c;效果图如下&#xff1a; 一、新建合成 1、新建合成&#xff0c;命名为合成1&#xff0c;参数设置如下&#xff1a; 2、新建纯色&#xff0c;命名为分形 二、添加分形杂色 1、添加分形杂色 为纯色层“分形”&#xff0c;添加分形杂色&#xff0c…

Oracle根据日志执行相应的存过处理逻辑

背景: 项目上有两个不同的MPP数据库(HIVE、oceanbase),目前的问题是需要把hive的数据迁移到ob中。数据体量大于4000亿,文件容量有300T,hive作为计算库(大于120节点的集群)把结果数据计算出,存放在DWD层,hive的表有近40张,大部分是大宽表(大于100个字段),里面字段…

从C到C++ | C++入门(三)

目录 内联函数 auto 关键字 范围for 指针空值nullptr 内联函数 以inline修饰的函数叫内联函数&#xff0c;编译时C编译器会在调用函数的地方展开&#xff0c;没有函数调用建立栈帧的开销&#xff0c;可提升程序的运行效率。 例子&#xff1a; #include <iostream> …

使用JMeter进行接口测试教程

安装 使用JMeter的前提需要安装JDK&#xff0c;需要JDK1.7以上版本目前在用的是JMeter5.2版本&#xff0c;大家可自行下载解压使用 运行 进入解压路径如E: \apache-jmeter-5.2\bin&#xff0c;双击jmeter.bat启动运行 启动后默认为英文版本&#xff0c;可通过Options – Ch…

RISCV - 2 “Zicsr“, CSR Instructions

RISCV - 2 “Zicsr“, CSR Instructions 1 CSR Instructions2 CSR Access Ordering3 CSR指令集类型 CSR&#xff1a;Control and Status Register RISCV - 1 RV32/64G指令集清单 RISC-V defines a separate address space of 4096 Control and Status registers associated w…

Java集合之Map

HashMap集合 HashMap的特点 HashMap的常用方法 ①.put(K key, V value) 将键&#xff08;key&#xff09;/值&#xff08;value&#xff09;映射存放到Map集合中 public class Test {public static void main(String[] args) {HashMap<String, Integer> map new Hash…

Python入门【生成器推导式创建元组、字典、字典元素添加、修改、删除、序列解包、字典核心底层原理、集合 】(六)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小王&#xff0c;CSDN博客博主,Python小白 &#x1f4d5;系列专栏&#xff1a;python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 &#x1f4e7;如果文章知识点有错误…

HTML :深入了解超文本标记语言

文章目录 前言HTML 简介HTML 基本结构HTML 标记HTML 文本标记HTML 图像标记HTML 链接标记 HTML 表单HTML 表格HTML 列表HTML 媒体元素HTML 语义化 前言 欢迎来到本篇博客&#xff0c;我将带你深入了解 HTML&#xff08;超文本标记语言&#xff09;。作为前端开发的基础&#x…

论文工具——ChatGPT结合PlotNeuralNet快速出神经网络深度学习模型图

文章目录 引言正文PlotNeuralNet安装使用使用python进行编辑使用latex进行编辑 样例利用chatGPT使用chatGPT生成Latex代码利用chatGPT生成对应的python代码 总结引用 引言 介绍如何安装PlotNeuralNet工具&#xff0c;并结合chatGPT减少学习成本&#xff0c;快速出图。将按照软…

06-Vue基础之事件处理

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章…

Cloudreve搭建云盘系统,并实现随时访问

文章目录 1、前言2、本地网站搭建1.环境使用2.支持组件选择3.网页安装4.测试和使用5.问题解决 3、本地网页发布1.cpolar云端设置2.cpolar本地设置 4、公网访问测试5、结语 1、前言 自云存储概念兴起已经有段时间了&#xff0c;各互联网大厂也纷纷加入战局&#xff0c;一时间公…