JavaEE > > Spring(1)

news2024/11/29 0:56:11

Spring

Spring:包含众多方法的 IoC 容器.,是一个集成很多方法的框架,让应用程序开发更加简单.
IoC:Inversion of Control 翻译成中⽂是“控制反转”的意思. 这是一个设计思想,而不是一个具体的实现方式.该思想就是把原本在程序中手动创建对象的控制权,交给 Spring 框架来处理.

控制:即对象创建(实例化)管理的权力;
反转:即将上述控制的权力交给 Spring 来执行;

情景代入:
工厂造车。一个完整的车是由好多个部件的构成的,即车依赖这些部件。那么工厂造车的顺序就是先将各个部件造完,然后才能造出一个完整的车。如下图:
在这里插入图片描述
当引入 IoC 容器思想后,即将这些部件的生产放到 IoC 容器中,在生产车的时候,只需要将部件的参数(例如轮子大小等)给 IoC 容器,此时 Spring 框架就会自己生产出来所需要的配件,方便车的生产。如下图:
在这里插入图片描述
上述将对象之间的依赖关系交给 IoC 容器来管理,并且由 IoC 容器完成对象 / 依赖的注入(对应上图的部件传入)。这样一来,很大程度上简化了开发过程,也将对象之间的依赖关系弱化(解耦)。
小结:

  • IoC容器就像这个工厂一样,我们不需要知道具体是怎么生产的,只需要将部件的参数给 IoC 容器即可,它就会帮我们生产出来
  • 换言之,IoC 容器就像是一个工厂,当我们需要创建一个对象的时候,只需要将配置文件配置即可,期间不用考虑具体的实现

那么我们如何将对象存储到 IoC 容器中,如何将对象从容器中取出来呢?(Spring 基本的功能)请看下面。

补充:依赖注入(DI)
所谓依赖注⼊,就是由 IoC 容器在运⾏期间,动态地将某种依赖关系注⼊到对象之中。所以,依赖注⼊(DI)和控制反转(IoC)是从不同的⻆度的描述的同⼀件事情,就是指通过引⼊ IoC 容器,利⽤依赖关系注⼊的⽅式,实现对象之间的解耦。
IoC 是“⽬标”也是⼀种思想,⽽⽬标和思想只是⼀种指导原则,最终还是要有可⾏的落地⽅案,⽽ DI 就属于具体的实现。
例如上述场景,工厂造车,造大众呀还是造法拉利呀,用哪个部件造呀!即造车是目标(IoC),大众、法拉利、部件是具体实现(DI).

Spring 创建

在这里插入图片描述
在这里插入图片描述
创建完成后如下图:
在这里插入图片描述
添加依赖(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>

在这里插入图片描述
右上角点击加载即可。
在这里插入图片描述
在 java 文件夹下面创建一个启动类:
在这里插入图片描述

创建 Bean

所谓的 Bean 就是 Java 语⾔中的⼀个普通对象。
创建一个类:
在这里插入图片描述

将 Bean 注册到容器

在创建好的项⽬中添加 Spring 配置⽂件 spring-config.xml,如下创建一个 xml 文件:
在这里插入图片描述

在这里插入图片描述
在该 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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>

然后在将 Student 对象注册到 Spring 中即可,具体操作是在 中添加如下配置:

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

获取并使用 Bean 对象

  1. 创建上下文,获取 Spring 上下文对象
  2. 获取上述指定 Bean 对象
  3. 使用 Bean,此处为调用对应方法输出结果
public class App {
    public static void main(String[] args) {
        // 1. 得到容器对象
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        // 2. 加载 Bean(Student)
        Student student = (Student) context.getBean("student");
        // 3. 调用对应方法
        System.out.println(student.sayHello("zhangSan"));
    }
}

注意:
在这里插入图片描述
在这里插入图片描述
到此,Spring 就可以启动了。
在这里插入图片描述

补充

得到容器对象的第二种方法

除了 ApplicationContext 之外,还可以使⽤ BeanFactory 来获取 Spring 的上下⽂.如下:

public class App {
    public static void main(String[] args) {
        // 1. 得到容器对象
        //ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); // 第一种
        BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));  // 第二种
        // 2. 加载 Bean(Student)
        Student student = (Student) beanFactory.getBean("student");   
        // 3. 调用对应方法
        System.out.println(student.sayHello("zhangSan"));
    }
}

在这里插入图片描述
两者的区别:

  • 继承关系和功能⽅⾯:Spring 容器有两个顶级的接⼝(BeanFactory 和 ApplicationContext)。其中 BeanFactory 提供了基础访问容器的能⼒,而 ApplicationContext 属于 BeanFactory 的⼦类,它除了继承了 BeanFactory 的所有功能之外,它还拥有独特的特性,还添加了对国际化、资源访问、以及事件传播等⽅⾯的⽀持。
  • 性能方面:ApplicationContext 是⼀次性加载并初始化所有的 Bean 对象,⽽ BeanFactory 是需要哪个才去加载哪个,因此更加轻量。

获取 Bean 的其它方法

public class App {
    public static void main(String[] args) {
        // 1. 得到容器对象
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml"); // 第一种
        //BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));  // 第二种
        // 2. 加载 Bean(Student)
        //Student student = (Student) beanFactory.getBean("student");   // 第一种获取 Bean 的方法
        Student student = context.getBean(Student.class);  // 第二种方法. 该方法根据类型获取 Bean
        //Student student = context.getBean("student",Student.class);  // 第三种方法. 与第二种的区别是 当有⼀个类型被重复注册到  spring-config.xml 中时,只能使用 id 获取了
        // 3. 调用对应方法
        System.out.println(student.sayHello("zhangSan"));
    }
}

总结

  1. 获得容器,即创建 Spring 项目
  2. 存对象
    • 创建 Bean (即创建类)
    • 将 Bean 注册到 spring-config.xml 中
  3. 取对象
    • 得到 Spring 上下文,读取 Spring 配置文件
    • 获取某一个 Bean 对象
    • 使用 Bean 对象
      在这里插入图片描述

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

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

相关文章

海外云手机为什么适合社媒运营?

如今&#xff0c;社媒营销如果做得好&#xff0c;引流效果好的账号&#xff0c;可以用来带货变现&#xff0c;而外贸、品牌出海也同样都在做社媒营销&#xff0c;Tik Tok、facebook、ins等热门的海外社媒平台都是行业密切关注的&#xff0c;必要的时候&#xff0c;大家会使用海…

区块链实验室(35) - 编译solana for ARM64版

今天终于成功编译solana for arm64版&#xff0c;编译时间巨长。见下图所示。编译步骤详见solana网站https://github.com/solana-labs/solana和https://docs.solanalabs.com/。

ORA-00742 ORA-00312 恢复---惜分飞

有客户反馈,断电之后数据库启动报ORA-00742和ORA-00312,无法正常open 我们远程上去尝试open库结果也报同样错误 [oracleoldhis oradata]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Wed Apr 10 09:40:03 2024 Copyright (c) 1982, 2013, Oracle. A…

计算机网络(五)传输层

传输层 从通信和信息处理的角度看&#xff0c;传输层向它上面的应用层提供通信服务&#xff0c;属于面向通信部分的最高层&#xff0c;同时也是用户功能中的最低层 传输层功能&#xff1a; 传输层提供应用进程之间的逻辑通信(即端到端的通信)。与网络层的区别区别是&#xf…

MySQL 试图

视图功能在 5.0 以后的版本启用 视图是一张虚表。数据表确实包含了具体数据并且保存到硬盘中的实表。视图使用数据检索语句动态生 成的一张虚表。每一次数据服务重启或者系统重启之后&#xff0c;在数据库服务启动期间&#xff0c;会使用创建视图的语 句重新生成视图中的数据&…

揭秘智慧礼品背后的故事

如若不是从事技术行业&#xff0c;在罗列礼品清单时&#xff0c;可能不会想到 “数据”&#xff0c;但幸运的是&#xff0c;我们想到了。如何将AI技术应用到当季一些最受青睐的产品中去&#xff0c;训练数据是这一智能技术的背后动力。很多电子设备或名称中带有“智能”一词的设…

频率域滤波总结

我本来想写在一起的&#xff0c;但是这样的话就没有重点了。分开写更能总结出来问题。这里的步骤5的对称滤波函数确实是(2M-1)x(2N-1)的大小&#xff0c;但是书上还说了如下图所示的问题: 首先第一个问题是乘积的问题&#xff0c;为什么普通的函数乘积也需要填充零&#xff1f;…

【电控笔记6.2】拉式转换与转移函数

概要 laplace&#xff1a;单输入单输出&#xff0c;线性系统 laplace 传递函数 总结

DNS解析实验

一、DNS正向解析实验 准备工作 服务端及客户端都关闭安全软件 [rootserver ~]# setenforce 0 [rootserver ~]# systemctl stop firewalld服务端安装bind软件 [rootserver ~]# yum install bind -y服务端配置静态IP [rootserver ~]# nmcli c modify ens33 ipv4.m…

浅尝一下ECS(Entity Component System)(学习笔记)

参考文章&#xff1a;浅谈Unity ECS&#xff08;一&#xff09;Uniy ECS基础概念介绍&#xff1a;面向未来的ECS - 知乎 (zhihu.com) 视频链接&#xff1a;【青幻译制】GDC讲座系列之三 守望先锋的游戏架构和网络代码_哔哩哔哩_bilibili 云风的 BLOG: 浅谈《守望先锋》中的 E…

消息队列和分布式消息队列

文章目录 分析系统现状不足中间件消息队列什么是消息队列&#xff1f;应用场景消息队列的模型为什么不直接传输&#xff0c;而要用消息队列&#xff1f;为什么要用消息队列&#xff1f;消息队列的缺点&#xff1f; 分布式消息队列分布式消息队列的优势&#xff1f;消息队列应用…

PLC远程通信:实现工业自动化的关键技术

在当今高度信息化和自动化的时代&#xff0c;工业领域对于实时数据的准确传输和迅速响应提出了更高要求。而PLC(可编程逻辑控制器)远程通信技术&#xff0c;正是能够实现工业自动化的关键技术之一。 首先&#xff0c;我们需要了解PLC远程通信的原理。PLC作为一种专用计算机控制…

设计模式代码实战-组合模式

1、问题描述 小明所在的公司内部有多个部门&#xff0c;每个部门下可能有不同的子部门或者员工。 请你设计一个组合模式来管理这些部门和员工&#xff0c;实现对公司组织结构的统一操作。部门和员工都具有一个通用的接口&#xff0c;可以获取他们的名称以及展示公司组织结构。…

学习BOM

目录 前言: 1. BOM组成&#xff1a; 1.1Window 对象&#xff1a; 1.1Location 对象&#xff1a; 1.2Navigator 对象&#xff1a; 1.2.1 navigator 对象包含了关于浏览器的信息包括&#xff1a; 1.3History 对象&#xff1a; 1.4常用的history的方法和属性: 1.4Document…

氟化钙与盐酸反应

结论&#xff1a;可以反应 参考链接 为什么盐酸,硝酸不能溶解氟化钙呢?氢氟酸可是弱酸啊。。。_百度知道 (baidu.com)https://zhidao.baidu.com/question/421110040.html特此记录 anlog 2024年4月16日

中医圆运动规律

目录 人体圆运动营气在十二经脉的运行规律子午流注与圆运动升降结合图 人体圆运动 营气在十二经脉的运行规律 营气在脉中&#xff0c;卫气在脉外 这个顺序也是子午流注的顺序 子午流注与圆运动升降结合图

【论文阅读02】一种基于双通道的水下图像增强卷积神经网络

来源&#xff1a;海洋论坛▏一种基于双通道的水下图像增强卷积神经网络 当前不会的 一、背景&#xff1a; 水下图像增强方法包含有无水下成像模型的水下图像增强方法、基于水下成像模型的水下图像恢复方法、水下成像模型与深度学习相结合的方法以及完全采用深度学习的方…

数据结构与算法——22.哈希算法

这篇文章我们来讲一下哈希表中较为关键的部分——哈希算法 目录 1.哈希算法的介绍 2.hash算法的使用 2.1 Object.hashCode 2.2 String.hashCode 3.关于哈希表及哈希算法的一些思考 1.哈希算法的介绍 问题&#xff1a;什么是哈希算法&#xff1f;哈希算法有哪些&#xff…

【算法一则】做算法学数据结构 - 简化路径 - 【栈】

目录 题目栈代码题解 题目 给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &#xff08;以 ‘/’ 开头&#xff09;&#xff0c;请你将其转化为更加简洁的规范路径。 在 Unix 风格的文件系统中&#xff0c;一个点&#xff08;.&#xff09;表…

兔C_Java集:Java 语言简介

文章目录 1. Java简介历史简介问&#xff1a;Oracle 为什么收购 SUN 公司关于三个分支语言特性&#xff1a; 2. JDK 的安装与配置安装的官网链接配置环境变量 3. 第一个Java程序4. 第一个程序解释关于类的定义 5. CLASSPATH命令自动配置CLASSPATH 与 JVM 的关系CLASSPATH 的手动…