简单易懂带你入门Spring框架,循序渐进,帮助你理解IOC思想---(一)入门实验一,教你如何使用spring框架

目录

1.1 、Spring概述

1.2 、Spring家族

1.3 、Spring Framework

1.3.1 、Spring Framework特性

1.3.2 、Spring Framework五大功能模块

IOC容器

IOC思想

IOC容器在Spring中的实现

基于XML管理bean

实验一:入门案例

如何获取bean



1.1 、Spring概述

官网地址:Spring | Home

Spring 是最受欢迎的企业级Java 应用程序开发框架,数以百万的来自世界各地的开发人员使用

Spring 框架来创建性能好、易于测试、可重用的代码。

Spring 框架是一个开源的Java 平台,它最初是由Rod Johnson 编写的,并且于2003 年6 月首次在Apache 2.0 许可下发布。

Spring 是轻量级的框架,其基础版本只有2 MB 左右的大小。

Spring 框架的核心特性是可以用于开发任何Java 应用程序,但是在Java EE 平台上构建web 应用程序是需要扩展的。Spring 框架的目标是使J2EE 开发变得更容易使用,通过启用基于POJO 编程模型来促进良好的编程实践。

1.2 、Spring家族

项目列表:Spring | Projects

1.3 、Spring Framework

Spring 基础框架,可以视为Spring 基础设施,基本上任何其他Spring 项目都是以Spring Framework

为基础的。

1.3.1 、Spring Framework特性

  • 非侵入式:使用Spring Framework 开发应用程序时,Spring 对应用程序本身的结构影响非常

小。对领域模型可以做到零污染;对功能性组件也只需要使用几个简单的注解进行标记,完全不会 破坏原有结构,反而能将组件结构进一步简化。这就使得基于Spring Framework 开发应用程序时结构清晰、简洁优雅。

  • 控制反转:IOC——Inversion of Control,翻转资源获取方向。把自己创建资源、向环境索取资源变

成环境将资源准备好,我们享受资源注入。

  • 面向切面编程:AOP——Aspect Oriented Programming,在不修改源代码的基础上增强代码功能。
  • 容器:Spring IOC 是一个容器,因为它包含并且管理组件对象的生命周期。组件享受到了容器化的管

理,替程序员屏蔽了组件创建过程中的大量细节,极大的降低了使用门槛,大幅度提高了开发 效率。

  • 组件化:Spring 实现了使用简单的组件配置组合成一个复杂的应用。在Spring 中可以使用XML 和

Java 注解组合这些对象。这使得我们可以基于一个个功能明确、边界清晰的组件有条不紊的搭建超大型复杂应用系统。

  • 声明式:很多以前需要编写代码才能实现的功能,现在只需要声明需求即可由框架代为实现。 一站

式:在IOC 和AOP 的基础上可以整合各种企业应用的开源框架和优秀的第三方类库。而且Spring 旗下的项目已经覆盖了广泛领域,很多方面的功能性需求可以在Spring Framework 的基础上全部使用Spring 来实现。

1.3.2 、Spring Framework五大功能模块

功能模块

功能介绍

Core Container

核心容器,在Spring 环境下使用任何功能都必须基于IOC 容器。

AOP&Aspects

面向切面编程

Testing

提供了对junit 或TestNG 测试框架的整合。

Data Access/Integration

提供了对数据访问/集成的功能。

Spring MVC

提供了面向Web应用程序的集成功能。

IOC容器

IOC思想

IOC:Inversion of Control,翻译过来是反转控制

获取资源的传统方式

在应用程序中的组件需要获取资源时,传统的方式是组件主动的从容器中获取所需要的资源,在这样的模式下开发人员往往需要知道在具体容器中特定资源的获取方式,增加了学习成本,同时降低了开发效率。

反转控制方式获取资源

反转控制的思想完全颠覆了应用程序组件获取资源的传统方式:反转了资源的获取方式----改有容器主动将资源推送给需要的组件,开发人员不需要知道容器是如何创建资源对象,只需要提供接收资源的方式即可,极大的降低了学习成本,提高了开发的效率。这种行为也称为查找的被动形式。

③DI

DI:Dependency Injection,翻译过来是依赖注入

DI 是IOC 的另一种表述方式:即组件以一些预先定义好的方式(例如:setter 方法)接受来自于容器的资源注入。相对于IOC而言,这种表述更直接。

所以结论是:IOC 就是一种反转控制的思想,而DI 是对IOC 的一种具体实现

IOC容器在Spring中的实现

Spring 的IOC 容器就是IOC 思想的一个落地的产品实现。IOC 容器中管理的组件也叫做bean。在创建bean 之前,首先需要创建IOC 容器。Spring 提供了IOC 容器的两种实现方式:

BeanFactory

这是IOC 容器的基本实现,是Spring 内部使用的接口。面向Spring 本身,不提供给开发人员使用。

ApplicationContext

BeanFactory 的子接口,提供了更多高级特性。面向Spring 的使用者,几乎所有场合都使用

ApplicationContext 而不是底层的BeanFactory。

③ApplicationContext的主要实现类

类型名

简介

ClassPathXmlApplicationContext

通过读取类路径下的XML 格式的配置文件创建IOC 容器对象

FileSystemXmlApplicationContext

通过文件系统路径读取XML 格式的配置文件创建IOC 容器对象

ConfigurableApplicationContext

ApplicationContext 的子接口,包含一些扩展方法

refresh() 和close() ,让ApplicationContext 具有启动、关闭和刷新上下文的能力。

WebApplicationContext

专门为Web 应用准备,基于Web 环境创建IOC 容器对象,并将对象引入存入ServletContext 域中。

我们常用到的就是ClassPathXmlApplicationContext类,简单说就是帮开发人员创建对象。

基于XML管理bean

实验一:入门案例

1、创建maven工程

2、引入依赖

<dependencies>
  <!-- 基于Maven依赖传递性,导入spring-context依赖即可导入当前所需所有jar包 -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.3.1</version>
  </dependency>
  <!-- junit测试 -->
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
		<scope>test</scope>
		</dependency>
</dependencies>

3、创建类HelloWorld

public class HelloWorld {
    
    public void sayHello(){ 
    	System.out.println("helloworld");
    }
}

4、创建Spring的配置文件

applicationContext.xml

5、在Spring的配置文件中配置bean


<!--
配置HelloWorld所对应的bean,即将HelloWorld的对象交给Spring的IOC容器管理 通过bean标签配置IOC容器所管理的bean
属性:
id:设置bean的唯一标识
class:设置bean所对应类型的全类名
-->
<bean id="helloworld" class="com.softeem.bean.HelloWorld"></bean>

6、创建测试类测试

@Test
public void testHelloWorld(){ 
	ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); 
    HelloWorld helloworld = (HelloWorld) ac.getBean("helloworld"); 
    helloworld.sayHello();
}

ICO容器就会帮我们创建bean类的对象,直接调用类中方法。

整个过程也就是:自定义的实体类在Spring配置文件中进行配置,就是实验中applicationContext.xml文件中bean标签中的内容。然后IOC容器对象ClassPathXmlApplicationContext对配置文件进行读取,创建类对象。然后就可以使用该对象进行一些方法的调用等等...

如何获取bean

①方式一:根据id获取

由于id 属性指定了bean 的唯一标识,所以根据bean 标签的id 属性可以精确获取到一个组件对象。上个实验中我们使用的就是这种方式。

②方式二:根据类型获取

@Test
public void testHelloWorld(){ 
    ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); 
    HelloWorld bean = ac.getBean(HelloWorld.class); 
    bean.sayHello();
}

③方式三:根据id和类型

@Test
public void testHelloWorld(){ 
	ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); 
    HelloWorld bean = ac.getBean("helloworld", HelloWorld.class); bean.sayHello();
}

以上三种方式都可以获取bean,但要注意的是:

当根据类型获取bean时,要求IOC容器中指定类型的bean有且只能有一个

那么一个spring框架就使用起来了...

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

爬虫笔记(二):实战58二手房

第一&#xff1a;给大家推荐一个爬虫的网课哈&#xff0c;码起来 第二&#xff1a;今夜主题&#xff1a;通过xpath爬取58二手房的title信息&#xff0c;也就是标红的位置~ 第三&#xff1a;先分析一波title所在的位置 打开按下f12打开抓包工具&#xff0c;即可看到网站的源码…

代码随想录算法训练营29期|day30 任务以及具体安排

332.重新安排行程 class Solution {private LinkedList<String> res;private LinkedList<String> path new LinkedList<>();public List<String> findItinerary(List<List<String>> tickets) {Collections.sort(tickets, (a, b) -> a.…

【必剪】拼字怎么使用?哪些素材能使用拼字?

1-1 点击需要编辑文字&#xff0c;在给定的人物中选择 其中一个&#xff0c;选择【拼字】选项&#xff0c;以下的字母表 的字母读音&#xff0c;是当前人物在他的鬼畜原版里的 全部读音&#xff0c;你可以打出自己专属独特的语句 ! 1-2 在字母表中继续寻找想要的读音&#xff…

利用STM32CubeMX和Keil模拟器,3天入门FreeRTOS(4.0) —— 动态创建队列

前言 &#xff08;1&#xff09;FreeRTOS是我一天过完的&#xff0c;由此回忆并且记录一下。个人认为&#xff0c;如果只是入门&#xff0c;利用STM32CubeMX是一个非常好的选择。学习完本系列课程之后&#xff0c;再去学习网上的一些其他课程也许会简单很多。 &#xff08;2&am…

基于YOLOv8的摔倒行为检测系统(Python源码+Pyqt6界面+数据集)

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文主要内容:通过实战基于YOLOv8的摔倒行为检测算法&#xff0c;从数据集制作到模型训练&#xff0c;最后设计成为检测UI界面 人体行为分析AI算法&#xff0c;是一种利用人工智能技术对人体行为进行检测、跟踪和分析的方法。通过计算…

MATLAB知识点:mode :计算众数

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 节选自第3章 3.4.1节 mode &#xff1a;计算众数 众数是指一…

log4j2配置文件命名及优先级

log4j 2.x版本不再支持像1.x中的.properties后缀的文件配置方式&#xff0c;2.x版本配置文件后缀名只能为".xml",“.json"或者”.jsn"。 命名规则 默认配置文件名&#xff1a; log4j2.xml 或 log4j2.json 测试或特定环境配置文件名&#xff1a;可以以 -t…

(blender学习)blender和vscode联合编写代码

文章目录 一、建立联合二、代码1.做一个小panel2. 给选定的物体更换好多好多材质 一、建立联合 按照这个文档做&#xff1a; 【Blender】使用 Microsoft Visual Studio Code 作为外部 IDE 来编写 Blender 脚本/附加组件 二、代码 下面几个代码的学习视频来自&#xff1a;ht…

Linux中并发程序设计(进程的创建和回收、exec函数使用)

进程的创建和回收 进程概念 概念 程序 存放在磁盘上的指令和数据的有序集合&#xff08;文件&#xff09; 静态的 进程 执行一个程序所分配的资源的总称 动态的进程和程序比较 注&#xff1a;进程是存在RAM中&#xff0c;程序是存放在ROM(flash)中的进程内容 BSS段&#xff…

Rocky8 顺利安装 Airflow 并解决数据库报错问题

rocky是替代centos的服务器系统&#xff0c;稳定可靠。rocky8会比centos7新&#xff0c;可以支持更多服务软件的安装&#xff0c;免去升级各种库的麻烦&#xff0c;本文运行airflow服务就用rocky8系统。airflow是一个定时任务管理系统&#xff0c;功能强大&#xff0c;目前是ap…

【QT+QGIS跨平台编译】之七:【libjpeg+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、libjpeg介绍二、文件下载三、文件分析四、pro文件五、编译实践一、libjpeg介绍 libjpeg是一个广泛使用的jpeg图像压缩和解压的函数库,采用 C 语言开发。 2013年1月,Independent JPEG Group发布了版本9,对新引入的无损编码模式进行了改进。2022年1月,发布了版…

Android U 配置 WiFiCalling 场景下PLMN/SPN 显示的代码逻辑介绍

功能介绍 根据设备的网络连接情况更新状态栏显示的运营商及网络状态。 注册上WFC&#xff08;WiFi Calling&#xff09;后&#xff0c;支持客制化显示左上角状态栏中的运营商网络状态信息 。具体的代码逻辑在CarrierDisplayNameResolver.java。 ServiceStateTracker 网络状态…

C# Bitmap类学习1

Bitmap对象封装了GDI中的一个位图&#xff0c;此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义的图像的对象。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using …

程序媛的mac修炼手册-- 如何用Python节省WPS会员费

上篇分享了如何用微博爬虫&#xff0c;咱举例爬了女明星江疏影的微博数据。今天就用这些数据&#xff0c;给大家安利一下怎么用Python实现WPS中部分Excel付费功能。 MacOS系统自带的工具&#xff0c;绝大多数都非常顶&#xff0c;除Numbers外。当然&#xff0c;page比起word来&…

图像分类】【深度学习】【轻量级网络】【Pytorch版本】EfficientNet_V2模型算法详解

【图像分类】【深度学习】【轻量级网络】【Pytorch版本】EfficientNet_V2模型算法详解 文章目录 【图像分类】【深度学习】【轻量级网络】【Pytorch版本】EfficientNet_V2模型算法详解前言EfficientNet_V2讲解自适应正则化的渐进学习(Progressive Learning with adaptive Regul…

魔众题库系统v9.3.0版本:升级与新功能亮点,让学习更高效!

大家好&#xff01;今天我们激动地向大家宣布&#xff0c;魔众题库系统已经升级到了v9.3.0版本&#xff01;这个版本带来了许多令人兴奋的改进和新功能&#xff0c;让用户的使用体验更上一层楼。 首先&#xff0c;让我们来看看这个版本的VIP界面升级。无论是PC端还是移动端&am…

C/C++ - 编程语法特性

目录 标准控制台框架 输入输出对象 命名空间 标准控制台框架 头文件 ​#include <iostream>​​ 告诉编译器我们要使用iostream库尖括号中的名字指定了某个头文件(header) 入口函数 ​int main(void)​​ 返回 ​return 0;​​ 输出语句 ​std::cout << "H…

python基础——锁

进程锁 (互斥锁) 进程锁的引入&#xff1a; 模拟抢票程序&#xff1a; from multiprocessing import Process import json import time def show_ticket(i):with open("./tickets.txt",mode"r",encoding"utf-8") as file:ticket json.load(f…

k8s图形化管理工具之rancher

前言 在前面的k8s基础学习中,我们学习了各种资源的搭配运用,以及命令行,声明式文件创建。这些都是为了k8s管理员体会k8s的框架,内容基础。在真正的生产环境中,大部分的公司还是会选用图形化管理工具来管理k8s集群,大大提高工作效率。 在二进制搭建k8集群时,我们就知道了…

Spring依赖注入之setter注入与构造器注入以及applicationContext.xml配置文件特殊值处理

依赖注入之setter注入 在管理bean对象的组件的时候同时给他赋值&#xff0c;就是setter注入&#xff0c;通过setter注入&#xff0c;可以将某些依赖项标记为可选的&#xff0c;因为它们不是在构造对象时立即需要的。这种方式可以减少构造函数的参数数量&#xff0c;使得类的构…
最新文章