Spring简介与使用

news2025/1/18 12:03:03

什么是spring

spring是一个开源的框架,里面有一系列功能,可以使我们的开发变得更为轻松
简单来说,spring是包含众多工具方法的IoC容器

所谓容器,就是盛放东西的事务,例如我们的ArrayList就是数据存储的容器,我们的tomcat就是web容器

而IoC,其全称是Inversion of Control,也就是控制反转,下面用一个例子来介绍什么是控制反转

当我们要创建一个公寓,公寓中有一个个的房间,房间中有厕所。在代码中,我们这几个类实现中,想要将这几个类有所关联,就需要在apartment类中创建room类,在room类中创建wc类

但是,当我们要更改厕所的尺寸时,就需要在WC类的实现方法中加入参数size,但是这样做后,room类中实现也要加上size,apartment也要加上size

public class demo {
    static class WC{
        int size = 20;
        public WC(int size){
            this.size = size;
        }
    }

    static class Room{
        public Room(int size){
            WC wc = new WC(size);
        }
    }

    static class Apartment{
        public Apartment(int size){
            Room room = new Room(size);
        }
    }

    public static void main(String[] args) {
        Apartment apartment = new Apartment(30);
    }
}

可以看到,这样的代码写法非常繁琐,耦合度非常的高,想要解决这个问题,我们就需要控制反转

我们将之前的apartment依赖room,room依赖wc的关系,转换为wc传入room,room传入apartment,这样的过程就称之为控制反转

例如下面代码

public class demo2 {
    static class WC{
        int size = 20;
        public WC(int size){
            this.size = size;
        }
    }

    static class Room{
        WC wc;
        public Room(WC wc){
            this.wc = wc;
        }
    }

    static class Apartment{
        Room room;
        public Apartment(Room room){
            this.room = room;
        }
    }

    public static void main(String[] args) {
        WC wc = new WC(30);
        Room room = new Room(wc);
        Apartment apartment = new Apartment(room);
    }
}

而我们spring IoC,为了避免对象之间的依赖关系,我们将所有的对象都放到spring中,然后从spring中获取对象

有关IoC,还有一个概念——DI,全称是Dependency Injection,也就是依赖注入
当我们的对象之间有依赖关系,使用IoC可以将对象之间的依赖关系注入,实现解耦合
也就是说,IoC是一种思想,而DI是具体的实现方法

创建spring项目

和我们的maven项目一样,要创建一个maven项目
在这里插入图片描述
然后命名项目,点击finish即可
在这里插入图片描述
然后在pom.xml中添加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>

我们在项目中添加一个启动类,里面有main方法
在这里插入图片描述

存储bean对象

当我们创建一个类时
在这里插入图片描述
想要存储上面的这个user类在spring中,我们需要存储bean对象,也就是先创建bean对象,然后将bean对象存储在spring容器中
首先我们在resources中创建一个文件,然后将下面的代码片段存储在这个文件中

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

在这里插入图片描述

然后我们将user对象存储到spring中,在beans中添加下面的代码片段

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

在这里插入图片描述

上面这个代码的意思是,我们将User类对象存储在spring容器中,如果我们的User类是在com.demo的包下,那么class应该写 class=“com.demo.User”,而id则是我们给这个类对象取的一个别名,方便以后取用

使用bean对象

首先在启动类中创建spring上下文,然后获取指定的bean对象

创建ApplilcationContext对象,里面的参数是我们的xml的名称,使用其getBean方法,传的参数是id,也就是我们起的别名

这时我们得到的是object对象,还需要强制转化一下

调用User对象的.hi方法,验证我们的对象是否获取成功

ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
//根据名称获取bean对象
User user = (User) context.getBean("user");
System.out.println(user.hi("xiaolock"));

我们还有另外一种方法来获取对象
context的getBean方法有多种重载方法,我们可以传入类对象,这样写可以避免强制类型转换

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

但是,这种如果使用上面的这种方法,我们如果在xml中存储多个User对象,就会出现报错

No qualifying bean of type ‘User’ available: expected single matching bean but found 2: user,anotherUser
在这里插入图片描述
还可以使用另一种重载方法,既传入id,也传入类对象

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

除了ApplicationContext外,还有另一种方法来得到bean对象——BeanFactory

BeanFactory factory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
User user4 = (User) factory.getBean("user");

其使用方法和ApplicationContext差不多,两者具体有下面几种区别

ApplicationContext和BeanFactory的区别

相同点

  1. 都可以都到spring上下文对象
  2. 都是来自spring的顶级接口

不同点

  1. ApplicationContext是BeanFactory的子类,ApplicationContext的功能更加齐全->资源访问,国际化,事件传播
  2. Application一次性加载所有bean对象,BeanFactory是需要哪个对象加载哪个对象,因此BeanFactory更加轻量化

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

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

相关文章

数据库——排序与分页

目录 排序数据 单列排序 多列排列 分页 分页原理 优点 MySQL 8.0新特性 排序数据 使用 ORDER BY 子句排序ASC&#xff08;ascend&#xff09;: 升序DESC&#xff08;descend&#xff09;:降序ORDER BY 子句在SELECT语句的结尾。 单列排序 SELECT employee_id,last_name…

【Linux】项目自动化构建工具-make与Makefile的简单使用(模拟实现进度条)

目  录1 make与Makefile使用2 模拟实现进度条前言&#xff1a; 会不会编写Makefile&#xff0c;从侧面说明了一个人是否具备完成大型工程的能力。一个工程中的源文件不计其数&#xff0c;按类型、功能、模块分别放在若干个目录中&#xff0c;Makefile定义了一系列的规则来指定…

使用 EMQX Cloud 桥接数据到 GCP Pub/Sub

前不久&#xff0c;Google 宣布其旗下的 GCP IoT Core 即将在 2023 年 8 月 16 日停止提供服务。这意味着大量使用 GCP IoT Core 的用户可能需要将他们的 IoT 应用迁移到其他物联网云服务。除了云服务的迁移&#xff0c;很多用户也在直接利用谷歌云生态&#xff0c;使用 GCP 上…

Docker部署 Harbor

系列文章目录 Docker部署 registry Docker搭建 svn Docker部署 Harbor Docker 部署SQL Server 2017 Docker 安装 MS SqlServer Docker部署 Oracle12c Docker部署Jenkins Docker部署 Harbor系列文章目录前言一、Harbor安装有3种方式二、安装步骤1. 从github官方地址下载安装包2…

C/C++尖括号和双引号包含头文件的区别

前言头文件有两种包含方式&#xff0c;一种是使用尖括号<>&#xff0c;另外一种是通过双引号""包含&#xff0c;例如&#xff1a;#include <iostream> #include "add.h"那么今天就专门来聊一聊这两种方式的区别。1.头文件的含义不同使用尖括号…

多表连接查询

语法&#xff1a; select ... from a join b on a和b的连接条件 join c on a和c的连接条件 join d on a和d的连接条件 一条SQL语句中内连接与外连接可以混合使用 案例&#xff1a;查询每个员工的部门名称以及薪资等级&#xff0c;要求显示员工名、部门名、薪资和薪资等级 SQL&…

核心乐理---和弦基础

和弦命名 什么是和弦 三个或三个以上的三度堆叠成为和弦 三和弦 三和弦指的是有三个音的和弦 七和弦是指七度的和弦&#xff0c;共4个音 其余的和弦与七和弦命名规则相同&#xff0c;跨越几度就是几和弦 九和弦是指跨越九度的和弦&#xff0c;共5个音十一和弦是指跨越十一…

【阶段三】Python机器学习18篇:机器学习项目实战:AdaBoost算法的核心思想、原理与数学原理举例

本篇的思维导图: AdaBoost算法的核心思想 AdaBoost算法(Adaptive Boosting)是一种有效而实用的Boosting算法,它以一种高度自适应的方式按顺序训练弱学习器。针对分类问题,AdaBoost算法根据前一次的分类效果调整数据的权重,在上一个弱学习器中分类错误的样本的权…

和Nginx相关的TCP/IP中反向代理系统解析与调优

文章目录前言反向代理系统分析消耗资源分析CPUMemory网卡压测与调优实战压测数据对比什么是TIME_WAITkeepalive开启前后数据对比小结关于后续端口不足&#xff0c;限制连接扩展协议层面无法充分做到连接的复用TCP优化分享相关文章&#xff1a;前言 本文介绍aeproxy这个应用以及…

IB地理科学什么?

IB地理科是一门很特别的科目&#xff0c;能帮助同学掌握技巧认识和了解这世界&#xff0c;而这课程分为两部分&#xff0c;包括自然环境和人文社会。IB地理科两部分 首先是自然环境&#xff0c;包括生态系统、气候&#xff0c;地壳活动等等 &#xff1b;另外是人文社会&#x…

Nosql和Redis介绍,Redis五大数据类型及操作,跳跃表

NoSQL数据库是用来解决性能问题的&#xff0c;分很多类。redis是NoSQL的一种。 NoSQL的引入&#xff1a; 随着Web2.0时代的到来。可以进行网络请求的不仅限与电脑。用户还可以通过手机端&#xff0c;平板甚至汽车等来进行网络请求。网络请求极具增加&#xff0c;增加了服务器…

【代码随想录】LC 102. 二叉树的层序遍历

目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 一、题目 1、原题链接 力扣 2、题目描述 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问…

linux下miniconda环境的配置以及软件的安装

miniconda 我们需要在自己的目录下安装conda环境&#xff0c;所以需要自定义安装位置 mkdir /share/nas6/wangyq/biosoft/miniconda wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O /share/nas6/wangyq/biosoft/miniconda/miniconda.sh注意…

070-JAVA项目实训:仿QQ即时通讯软件系列讲座五(讲解用户注册功能)

【上一讲】069-JAVA项目实训:仿QQ即时通讯软件讲座四(讲解系统登录功能)_CSDN专家-赖老师(软件之家)的博客-CSDN博客 本文主要内容是实现注册QQ用户功能,自动获取本机IP地址,与系统用户判断端口是否唯一,使用的主要技术如下: 1.使用数据库技术完成注册功能; 2.自动…

Linux系统编程——锁

目录线程同步:锁的使用:使用matex(互斥量、互斥锁)一般步骤:restrict关键字:死锁:读写锁&#xff1a;条件变量实现生产者-消费者代码信号量实现消费者生产者线程同步: 协同步调&#xff0c;对公共区域数据按序访问。防止数据混乱&#xff0c;产生与时间有关的错误。 锁的使用…

原来这些技术标准,是字节跳动人参与制定的

我们常常遇到这类问题&#xff1a;因为不同厂商产品标准不同、接口不一致&#xff0c;导致 A 产品无法兼容 B 产品&#xff0c;C 接口和 D 接口无法连接&#xff0c;实在令人困扰。其实&#xff0c;技术从业者们一直在试图解决这些不统一、不兼容的问题&#xff0c;他们的方法是…

ceres学习笔记(一)

本来还想着先对照着官方doc来学习的。突然在csdn里面搜了下&#xff0c;发现了几篇高质量的文章&#xff0c;就先对应这几篇文章学习&#xff0c;来快速入门。 一、ceres求解问题一般步骤 使用ceres-solver求解优化问题一般分为下面三步&#xff1a; 1.第一步&#xff1a;构…

aws cdk 配置 lambda 函数的金丝雀发布

之前的文章介绍了使用sam框架完成lambda函数的金丝雀发布&#xff0c;这里使用cdk创建lambda函数项目实现此功能 Building CI/CD pipelines for lambda canary deployments using AWS CDK 项目的结构如下图所示 lambda堆栈示例 应用程序和环境配置 #!/usr/bin/env python3 im…

数据结构与算法0—大纲

数据结构&#xff1a;数据结构是计算机存储、组织数据的方式。是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组. 算法&#xff1a;是指解题方案的准确而完整的描述&#xff0c;是一系列解决问题的清晰指令&#xff0c;算法代表着用系统的方法…

Vue动态路由、动态路由如何进行参数的传递、$router和$route的区别、命名路由、命名视图

一、什么是动态路由 ​ 将URL地址中可变的内容设置成参数&#xff0c;根据不同的参数渲染不同的组件。&#xff08;组件可以复用&#xff09; 二、动态路由如何进行参数的传递 ​ 1. 如何设置URL地址中的参数&#xff1a;“/url/:参数名” ​ 2. 在组…