【Spring】之IoC与对象存取

未来的几周时间,大概率我会更新一下Spring家族的一些简单知识。而什么是Spring家族,好多同学还不是很清楚,我先来简单介绍一下吧:

所谓Spring家族,它其实就是一个框架,是基于Servlet再次进行封装的内容。为啥说是再次进行封装呢,就是因为Servlet也是封装的一门用于Web端的技术,他们的基础都是Java。所以说,想要学习Spring,建议大家先去了解一下Java基础语法以及Servlet技术。

Spring是什么

通常意义下,我们所说的Spring就是Spring Framework,这是一个开源框架,有着活跃而庞大的社区。为啥说Java的生态很完善,我认为Spring家族就提供了许多保证生态完善的轮子。而Spring框架由于支持广泛的应用场景,使得Java企业级的应用开发变得更简单。

框架为会啥流行呢?或者换句话说,为啥Spring会有这么庞大的用户量?刚开始使用Java解决某一问题时,代码冗杂而功能不全,而使用一些工具方法就可以使得本来繁杂的代码变得简单,而积聚了众多工具方法的组合,就可以称之为框架,既然有了可以使代码变简单的办法,那么就一定会被更多人所用,自然而然也会流行起来。

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

IoC是什么

IoC的全称是Inverson of Control,译为中文就是控制反转。其内容就是对对象的生命周期进行控制反转,结果就是降低耦合。

举个简单的例子来说吧:在传统开发中,A类引用B类,B类引用C类,C类引用D类,因此在A类中需要new一个B类,B类中需要new一个C类,而C类中需要new一个D类,假如D类的构造方法发生了改变,那么随之而来的就是需要去改变ABC三个类的构造方法;但是在Spring开发中,不需要进行new类,而是直接把需要使用类的对象给传进来,这样当D类发生改变时,并不需要去动其他的类,从而减少了许多不必要的麻烦,降低了类与类之间的耦合度。

DI是什么

DI的全称是Dependency Injection,译为中文就是依赖注入。其内容就是IoC容器在运行期间,动态的将某种依赖关系注入到对象当中。

从客观角度来看,IoC和DI描述的都是同一件事,即通过IoC容器,动态的将某种依赖关系注入到对象当中。不同的则是,IoC是一种思想,是从整体层面解释的概念,而DI则表示的是一种技术,用这种依赖注入的技术来控制对象生命周期的反转。

容器是什么

顾名思义,容器就是用来存放物品的一种装置。在Spring中,容器就是用来存放对象的装置。既然是容器,那么就表明其可以放物品,也可以拿物品。因此学习Spring时最核心的就是学会如何将对象存储到Spring中,如何将对象从Spring中取出来。

明白了Spring核心功能,那么它的好处是啥呢?首先将对象存储到IoC容器中就表示将未来所有可能用到的工具都放入仓库中,啥时候用啥时候取就可以了,而用完再放入容器中即可,非常的简单便捷。而传统的开发中new就相当于每次使用工具的时候,都现场制作一把,然后用完以后,直接废弃,下次再用的时候再制作,非常麻烦,这就是Spring开发和传统开发的区别。

Spring的创建和存取

1. 创建

创建一个maven项目

f7c494baea5b4eacadc044eb2f629070.png

引入Spring-beans(管理对象的模块)和Spring-context(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>

2. 存取

a. 创建一个Bean对象

所谓的Bean对象其实就是Java语言中的一个普通对象。

package org.example;public class User {public String sayHi() {return "hello world";}
}

b. 添加配置文件

在resourse目录添加配置文件spring-config.xml(后缀是xml不可变,但是前缀是可以改变的);xml文件的作用就是告诉Spring框架要存取的对象是啥。

0456ad4d28bb4cc9abb32848d0ba33b0.png

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

c. 存对象

将Bean对象配置到xml文件中。

<bean id="user" class="org.example.User"></bean>
<!--id表示的是Bean对象的名称,不可重复;而class表示的是对象本身,即包名+类名-->

d. 取对象

读对象的话先要得到Spring对象,再从Spring对象中取Bean对象;获取Spring对象可以使用ApplicationContext。

package org.example;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. 从Spring对象中得到Bean对象User user = context.getBean("user", User.class);//3. 使用Bean对象System.out.println(user.sayHi());}
}

对于得到Spring对象来说,有两种方法可以得到。

一种就是使用ApplicationContext,另一种方法就是BeanFactory。

package org.example;import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;public class App {public static void main(String[] args) {//1. 先得到Spring对象BeanFactory context = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));//2. 从Spring对象中取到Bean对象User user = context.getBean("user", User.class);//3. 使用Bean对象System.out.println(user.sayHi());}}

ApplicationContext和BeanFactory的异同

相同点:

两者都可以得到Spring对象;

两者都是来自Spring的顶级接口(即可以有很多类来继承他们)。

不同点:
07277c3f138341d6ada49a37da195fb0.png

cdef00e2ab794f6eab39b368c3d94ef5.png

继承关系,从上图可以看出,ApplicationContext是继承了BeanFactory,也就是说ApplicationContext不仅拥有BeanFactory的基础功能,还在其功能之上加了些许其他功能,例如国际化支持、资源访问以及事件传播等,而BeanFactory则只有最基础访问Bean的能力。

性能,ApplicationContext是一次性加载,即程序运行的时候将Bean对象都给加载出来,因此后续访问Bean的时候就会很快,而BeanFactory则是在使用某个对象的时候才进行加载,所有在执行Bean获取的时候会比较慢。

Spring中取对象的三种方法

        //第一种方法,使用Bean名称进行获取//当xml中没有出现这个Bean名称时,依然进行强转,那么可能会出现错误User user1 = (User) context.getBean("user");//第二种方法,使用Bean类型来获取//当xml中出现两次及以上,即一个Bean对象但是有好几个名字时,也会报错User user2 = context.getBean(User.class);//第三种方法,使用Bean名称和类型来获取User user3 = context.getBean("user", User.class);

总结

了解了Spring是包含了众多工具方法的IoC容器;

了解了IoC、DI以及容器的思想;

了解了Spring的创建和存取。

上述已经实现了Spring的存取,但是实现方法还是比较复杂,接下来会写一篇关于Spring存取更简单的方式,其中涉及到的内容也比较多,例如有配置文件、五大注解、Bean注解以及三大注入等内容。

 

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

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

相关文章

VMware——WindowServer2012R2环境安装mysql5.7.14解压版_互为主从(图解版)

目录 一、服务器信息二、192.168.132.35服务器上安装mysql&#xff08;主&#xff09;2.1、环境变量配置2.2、安装2.2.1、修改配置文件内容2.2.2、初始化mysql并指定超级用户密码2.2.3、安装mysql服务2.2.4、启动mysql服务2.2.5、登录用户管理及密码修改2.2.6、开启远程访问 三…

C++函数

转载知呼大佬06 - C函数 - 知乎 (zhihu.com) 06 - C函数 本期我们讨论的是 C 中的函数。 函数到底是什么呢&#xff0c;函数就是我们写的代码块&#xff0c;被设计用来执行特定的任务&#xff0c;以后我们学习 class 类的时候&#xff0c;这些块会被称为方法&#xff0c;但是…

windows电脑连接Android和iPhone真机调试

windows电脑连接Android和iPhone真机调试 目前用的是Hbuilder X编辑器&#xff0c;在正常情况下&#xff0c;Android手机需要在 "设置 ----> 更多设置 ----->关于手机 ------> 版本号&#xff08;手指点击5-7下即可打开开发者模式&#xff09;"(我的是vivo的…

MATLAB | 绘图复刻(十三) | 带NaN图例的地图绘制

有粉丝问我地图绘制如何添加NaN&#xff0c;大概像这样&#xff1a; 或者这样&#xff1a; 直接上干货&#xff1a; 原始绘图 假设我们有这样的一张图地图&#xff0c;注意运行本文代码需要去matlab官网下载Mapping Toolbox工具箱&#xff0c;但是其实原理都是相似的&…

人工智能基础_机器学习046_OVR模型多分类器的使用_逻辑回归OVR建模与概率预测---人工智能工作笔记0086

首先我们来看一下什么是OVR分类.我们知道sigmoid函数可以用来进行二分类,那么多分类怎么实现呢?其中一个方法就是使用OVR进行把多分类转换成二分类进行计算. OVR,全称One-vs-Rest,是一种将多分类问题转化为多个二分类子问题的策略。在这种策略中,多分类问题被分解为若干个二…

计算机毕业设计 基于SpringBoot的社区物资交易互助平台/系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

【C++】泛型编程 ⑩ ( 类模板的运算符重载 - 函数实现 写在类外部的同一个 cpp 代码中 | 类模板 的 外部友元函数二次编译问题 )

文章目录 一、类模板 - 函数声明与函数实现分离1、类模板 外部 实现 构造函数2、类模板 外部 实现 普通函数3、类模板 外部 实现 友元函数( 1 ) 错误示例及分析 - 类模板 的 外部友元函数 二次编译 问题( 2 ) 正确写法 二、代码示例 - 函数声明与函数实现分离1、代码示例2、执行…

level=warning msg=“failed to retrieve runc version: signal: segmentation fault“

安装docker启动后&#xff0c;发现里面没有runc版本信息 目前看是少了runc组件 那我们安装runc https://github.com/opencontainers/runc/releases/download/v1.1.10/runc.amd64 [rootlocalhost ~]# mv runc.amd64 /usr/bin/runc mv&#xff1a;是否覆盖"/usr/bin/runc&q…

Git 分支管理

目录 列出分支 删除分支 分支合并 合并冲突 几乎每一种版本控制系统都以某种形式支持分支&#xff0c;一个分支代表一条独立的开发线。 使用分支意味着你可以从开发主线上分离开来&#xff0c;然后在不影响主线的同时继续工作。 Git 分支实际上是指向更改快照的指针。 有…

修复dinput8.dll丢失的简单方法,解决dinput8.dll丢失

在使用电脑时&#xff0c;电脑可能会出现一些特殊的情况&#xff0c;比如电脑中出现关于dinput8.dll丢失会找不到的情况&#xff0c;出现这样的情况可能会不知道该怎么办&#xff0c;但是出现这样的情况其实并不是一件很难解决的事情&#xff0c;修复dinput8.dll丢失方法也是比…

MySQL InnoDB 引擎底层解析(二)

6.2.InnoDB 的表空间 表空间是一个抽象的概念&#xff0c;对于系统表空间来说&#xff0c;对应着文件系统中一个或多个实际文件&#xff1b;对于每个独立表空间来说&#xff0c;对应着文件系统中一个名为表名.ibd 的实际文件。大家可以把表空间想象成被切分为许许多多个页的池…

关于Unity Time.deltaTime的理解和使用

Unity中的Time.deltaTime是一个表示上一帧到当前帧所用时间的浮点数。 它可以让Unity应用程序能够以平滑的方式在不同的帧率下运行。 要深刻理解Time.deltaTime&#xff0c;首先得了解Unity引擎得工作原理。 Unity引擎以每秒帧数&#xff08;FPS&#xff09;的形式运行。 比…

Shell判断:模式匹配:case(二)

简单的JumpServer 1、需求&#xff1a;工作中&#xff0c;我们需要管理N多个服务器。那么访问服务器就是一件繁琐的事情。通过shell编程&#xff0c;编写跳板程序。当我们需要访问服务器时&#xff0c;看一眼服务器列表名&#xff0c;按一下数字&#xff0c;就登录成功了。 2、…

JAVA毕业设计111—基于Java+Springboot+Vue的养老院管理系统(源码+数据库+12000字论文)

基于JavaSpringbootVue的养老院管理系统(源码数据库12000字论文)111 一、系统介绍 本系统前后端分离&#xff0c;本系统分为销售、人事、服务、餐饮、财务、超级管理员六种角色 系统主要功能如下&#xff1a; 首页统计&#xff1a;包括今日新增咨询、今日新增预定、今日新增…

树与二叉树堆:堆

堆的概念&#xff1a; 一般是把数组的数据在逻辑结构上看成一颗完全二叉树&#xff0c;如下图所示。 注意&#xff1a;别将C语言中的堆和数据结构的堆混为一谈&#xff0c;本文所讲的数据结构的堆是一种完全二叉树&#xff0c;而C语言中的堆其实是一种内存区域的划分 堆的分类…

【发明专利】天洑软件再度收获六项国家发明专利授权

近日&#xff0c;南京天洑软件有限公司再度收获行业内六项国家发明专利授权&#xff0c;专利名称为&#xff1a;一种发电机绕组温度预警方法及装置&#xff08;专利号&#xff1a;ZL 2022 1 1525605.3&#xff09;&#xff0c;一种CSTR系统的控制方法及装置&#xff08;专利号&…

《C++PrimePlus》第8章 函数探幽

8.1 内联函数 使用内联函数 #include <iostream> using namespace std;inline double square(double x) { return x * x; }int main(){double a;a square(5.0);cout << "a " << a << endl;return 0; } 8.2 引用变量 将引用用作函数参数&…

java: 无效的目标发行版: 17 问题解决

今天在写完类点击运行后显示java: 无效的目标发行版: 17 网上查询了一番&#xff0c;发现有几个地方需要注意。 还有一个就是设置中&#xff0c;下面的就是我本次问题所在&#xff0c;不知道为什么&#xff0c;他自动添加了下面的东西 一个方法是把目标字节码版本改为正确的&a…

(C++)验证回文字符串

愿所有美好如期而遇 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/valid-pali…

OpenAI 超 700 名员工联名逼宫董事会;ChatGPT 新功能“阅后即焚”丨 RTE 开发者日报 Vol.89

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…