基础框架 Spring

news2024/11/19 1:43:51

引言

我们常说,Java 程序员不会 Spring,那还叫 Java 程序员吗?由此可见Spring在Java领域的重要性,本章我们就来谈谈 Spring 到底是何方神圣?

一、Spring 核心概念(重要)

1、Spring 是什么?

一句话概括:Spring 是包含了众多工具方法的 IoC 容器

2、什么是 IoC ?

IoC 全称为 Inversion of Control,即控制权反转。这也就是说 Spring 是⼀个“控制权反转”的容器。这里的“控制权反转”是一种设计思想。

  1. 在传统的编程模式中,对象的生命周期是由当前代码自身控制的。这种模式的诟病就是代码之间的耦合性较高,会导致代码拓展性和可维护性降低。例如如果一个对象 A 需要使用对象 B 的功能,那么对象 A 就需要创建并维护一个对象 B,这也就导致了 A 和 B 之间的强耦合关系,如果此时对象 B 发生改变,A 也要跟着修改。

  2. IoC 则是将对象的生命周期交由外部容器来控制。它的一大特点就是实现代码之间的解耦。此时 A 对象需要使用 B 对象的功能就不再需要自己实例化 B 了,而是将控制权交给容器,容器进行实例化和管理组件,并将所需的对象 B 导入到 A 中,后续即使 B 发生改变,只需要修改容器中的 B 即可。

3、什么是 DI ?

DI 全称为 Dependency Injection,即依赖注入。指的是在程序运行期间,动态的将依赖对象获取到的过程。

4、IoC 和 DI 的关系和区别?

关系:

IoC -Inversion of Control 控制权反转,DI-Dependency Injection 依赖注入,他俩是从不同角度来描述同一件事情,就是当我们的程序需要某个依赖对象时,不自己取创建它了,而是去从容器中取,也就是将对象的生命周期交由控制器控制,实现对象之间的解耦。

区别:

IoC是一种设计思想,而 DI 是IoC思想的一种实现方式。

二、Spring 的创建和使用

Spring(IoC)容器,管理的资源是 对象,这个对象通常被称为 Bean。既然是一个容器,那么它一定具备两个基础功能:

  1. 将对象存入到容器中
  2. 从容器中取出对象

具体操作流程如下:

1、创建 Spring 项目(Maven+依赖)

(1)创建一个普通的 Spring 项目,首先使用 IDEA 创建一个 Maven 项目,然后再 pom.xml 中添加 Spring 框架的依赖文件:

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

(2)添加启动测试类
在创建好的项目 java 文件夹下创建⼀个启动类,包含 main 方法即可:

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

2、注册 Bean

(1)这一步也就是将 Bean 对象存储到 Spring(IoC)容器中,当然前提是我们先创建一个 Bean:

package com.work.demo;

public class User {
    public void sayHi() {
        System.out.println("Hi,UserService!");
    }
}

(2)将 Bean 注册到 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">
    
    <bean id="user" class="com.work.demo.User"></bean>

</beans>

3、获取并使用 Bean

(1)得到 Spring 上下文对象

这里的上下文对象,可以理解为当前的容器管理对象,因为对象都交给 Spring 管理了,所以获取对象要从 Spring 中获取,那么就得先得到 Spring 的上下文。

方式一:使用 ApplicationContext 作为上下文。

public class GetBean {
    public static void main(String[] args) {
        // 1.获取 Spring 上下文对象(这里需要填写上一步的配置文件名)
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
    }
}

:ClassPathXmlApplicationContext 属于 ApplicationContext 的子类,拥有 ApplicationContext 的所有功能,是通过 xml 的配置来获取所有的 Bean 的。

方式二:使用 BeanFactory 作为上下文。

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

new ClassPathResource("spring-config.xml")它创建了一个ClassPathResource对象,用于加载位于类路径下的spring-config.xml配置文件。

ApplicationContext & BeanFactory 的区别?

  1. 从继承关系和功能方面来说:ApplicationContext 属于 BeanFactory 的子类,ApplicationContext 拥有更多的功能。
  2. 从性能方面来说:加载 Bean 机制不同。BeanFactory 是懒加载,即需要哪个才去加载哪个,因此它的启动比较快,但是之后获取比较慢;而ApplicationContext 一次性加载并初始化所有的 Bean 对象,因此它的启动比较慢,但是后期获取非常快。

(2)获取指定的 Bean 对象(依赖查找)

获取 Bean 对象,是通过 Spring 上下文对象中的 getBean() 方法进行获取的(IoC的一种实现方式,依赖查找),它主要有如下三种用法。

用法一:根据名称获取 Bean 对象

User user1 = (User) context.getBean("user");

用法二:根据类型获取 Bean 对象

User user2 = context.getBean(User.class);

注意:当有一个类型被重复注册到 spring-config.xml 中时,就只能使用根据名称获取了。

用法三:根据名称+类型获取 Bean 对象(常用)

User user3 = context.getBean("user",User.class);

(3)使用 Bean 对象

获取到 Bean 对象之后,直接使用即可。

public class GetBean {
    public static void main(String[] args) {
        // 1.得到 Spring 上下文对象
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        // 2.获取 Bean 【依赖查找 -> IoC 的一种实现方式】
        User user = beanFactory.getBean("user",User.class);
        // 3.使用 Bean 对象
        user.sayHi();
    }
}

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

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

相关文章

RGB彩色图、Depth深度图

&#x1f4a6;彩色图&#xff0c;深度图——》信息缺乏。如&#xff0c;颜色相近导致位置信息丢失 &#x1f4a6;深度图——》相近深度的物体&#xff0c;因为颜色或纹理的丢失&#xff0c;导致难区分 深度图并不可以直接使用&#xff0c; 因为深度图只能反映出了物体在三维空…

Oracle数据库完整卸载的完整步骤

时间&#xff1a;2023-03-15来源&#xff1a;系统城装机大师作者&#xff1a;佚名 1、停止所有Oracle服务 进入计算机管理&#xff0c;在服务中&#xff0c;找到oracle开头的所有服务&#xff0c;右击选择停止。 快捷键&#xff1a;ctrlshiftesc打开任务管理器 文章来源 Or…

PACS(Picture Archiving and Communications System)图像存储与传输系统源码

PACS&#xff08;Picture Archiving and Communications System&#xff09;——图像存储与传输系统&#xff0c;和医院信息化及数字化的目标紧密关联&#xff0c;它是专门为现代化医院的影像管理而设计的包括数字化医学图像信息的采集、显示、处理、存储、诊断、输出、管理、查…

蓝牙资讯|AirPods Pro 2推送新固件,苹果Find My功能受到好评

苹果公司今天面向采用 Lightning 端口和 USB-C 端口的 AirPods Pro 2 耳机&#xff0c;更新推出了内部编号为 6A305 的全新固件&#xff0c;高于 10 月 10 日发布的 6A303 更新。 苹果官方并没有公布固件的更新日志&#xff0c;目前尚不清楚具体引入了哪些新功能、新特性。苹…

【Rust 易学教程】学前准备:Cargo, 你好

当你开始学习 Rust 时&#xff0c;很快就会遇到 Cargo&#xff0c;它是 Rust 生态系统中用于构建和运行 Rust 应用程序的标准工具。在 《Rust 易学教程》 首篇中&#xff0c;我会简要概述一下 Cargo 是什么&#xff0c;以及它如何适应更广泛的生态系统。 安装 请按照 https:/…

[C++]3.类和对象下(this指针补充)+ 类和对象中构造函数和析构函数。

类和对象下&#xff08;this指针补充&#xff09; 类和对象中构造函数和析构函数 一.this补充&#xff1a;1.概念总结&#xff1a;2.两个问题&#xff1a; 二.构造函数和析构函数&#xff1a;一.类的默认构造&#xff1a;1.初始化和清理&#xff1a;2.拷贝复制&#xff1a;3.取…

数据结构: AVL树

目录 1.AVL树的概念 2.AVL树的模拟实现 AVL树的结构定义 插入 对平衡因子的讨论 旋转 对旋转情况的讨论 1.单旋 1.1左单旋 1.2右单旋 2.双旋 2.1左右双旋 2.2右左双旋 检查是否是AVL树 1.AVL树的概念 当向二叉搜索树中插入新结点后&#xff0c;如果能保证每个结点…

STM32F4XX之串口

一、标准串口&#xff08;UART&#xff09;介绍 1、通信协议相关概念 1.1同步通信和异步通信 (1)同步通信&#xff1a;两个器件之间共用一个时钟线&#xff0c;要发送的数据在时钟的作用下一位一位发送出去。 &#xff08;2&#xff09;异步通信&#xff1a;指两个器件之间没…

Java基础(第一部):IDEA的下载和安装(步骤图) 项目结构的介绍 项目、模块、类的创建。第一个代码的实现

文章目录 IDEA1.1 IDEA概述1.2 IDEA的下载和安装1.2.1 下载1.2.2 安装 1.3 IDEA中层级结构介绍1.3.1 结构分类1.3.2 结构介绍project&#xff08;项目、工程&#xff09;module&#xff08;模块&#xff09;package&#xff08;包&#xff09;class&#xff08;类&#xff09; …

数据结构与算法-树

树 &#x1f388;1.树和二叉树&#x1f388;2.树&#x1f52d;2.1树的定义&#x1f52d;2.2树的4种表示方法&#x1f52d;2.3树的基本术语&#x1f52d;2.4树的抽象数据类型定义 &#x1f388;3.二叉树&#x1f52d;3.1二叉树的定义&#x1f52d;3.2二叉树的抽象数据类型定义&a…

MySQL 性能分析

MySQL 性能分析 对 mysql 进行性能分析&#xff0c;主要就是提升查询的效率&#xff0c;其中索引占主导地位。对 mysql 进行性能分析主要有如下几种方式&#xff1a; 方式一&#xff1a;查看 sql 执行频次 show global status like ‘Com_______’; // global 表示全局 show s…

力扣每日一题49:字母异位词分组

题目描述&#xff1a; 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate&quo…

国产低功耗MCU芯片:Si24R03

Si24R03集成了基于RISC-V核的低功耗MCU和工作在2.4GHz ISM频段的无线收发器模块&#xff0c;是一款高度集成的低功耗SOC片。 应用领域&#xff1a; 1、物联网 2、智N门锁 3、电机控制 4、消费电子 5、工业控制 其无线收发器模块是专为低功耗无线场合设计&#xff0c;在关…

微信小程序开发的OA会议之会议,投票,个人中心的页面搭建及模板

目录 一.自定义组件 1.1.创建 1.2.定义 1.3.编写 1.4.使用 二.会议 2.1.数据 2.2.显示 2.3. 样式 三.个人中心 3.1.页面 3.2.样式 四.投票 4.1.引用 4.2.数据 4.3.页面 4.4.样式 好啦今天就到这里了&#xff0c;希望能帮到你哦&#xff01;&#xff01;&…

UGUI交互组件Dropdown

一.Dropdown的应用 Dropdown控件官方翻译为下拉选单&#xff0c;游戏中有一定程度的使用&#xff0c;其优势是用户体验优秀&#xff0c;节省界面空间&#xff0c;下图为某游戏的实际应用 二.Dropdown对象的结构 对象说明Label当前选中的选项Arrow向下或向上箭头表示展开方向Te…

Ubuntu服务器配置qq邮箱发送信息

效果&#xff1a; 此处设置的是自己给自己发送&#xff0c;配合linux的cron实现定时触发发送事件的效果 实现过程&#xff1a; 安装邮箱客户端Postfix sudo apt-get install postfix配置Postfix&#xff1a;编辑Postfix的主要配置文件 /etc/postfix/main.cf&#xff0c;并在…

uni-app:js实现数组中的相关处理

一、查询数组中&#xff0c;某一项中的某个数据为指定值的项&#xff08;find() 方法&#xff09; 使用分析 使用数组的 find() 方法来查询 id 为 0 的那一项数据。这个方法会返回满足条件的第一个元素&#xff0c;如果找不到符合条件的元素&#xff0c;则返回 undefined。使用…

跨路由器路由设置

1781的eth0网口地址设置为192.168.3.45并接入192.168.3.0网段里&#xff1b; 1781的eth1网口地址设置为10.0.9.20并接入10.0.0.0网段里&#xff0c;并且连接在网关地址为10.0.9.1的路由上。 192.168.1.140的摄像头接在网关为10.0.9.1的路由器上 现在的需求是1781网关在访问19…

CardView设置任意角为圆角

注意&#xff1a;material:1.1.0以上版本在RadiusCardView节点下一定要添加 android:theme“style/Theme.MaterialComponents”&#xff0c;不然会报错&#xff0c;另外&#xff0c;由于是重写自MaterialCardView&#xff0c;所以一定要导入material包&#xff1a; implementat…

2022年京东双11食品饮料品类数据回顾

2022年双11&#xff0c;根据京东官方发布的数据显示&#xff0c;京东百货中&#xff0c;京东新百货的589个品类10025个品牌成交额同比增长100%。而在食品饮料行业中&#xff0c;也有一些在大促期间成交额同比涨幅超过100%的品牌。 下面&#xff0c;结合鲸参谋平台提供的数据&am…