Spring框架的创建和使用

news2024/11/25 20:38:46

目录

Spring框架概述

什么是Spring框架

什么是容器

什么是IoC容器

Spring的核心功能

IoC容器和普通程序开发的区别

DI

Spring项目的创建和使用

Spring项目创建

创建一个maven项目

添加Spring框架支持

添加一个启动类

Spring项目的使用

存储Bean对象

获取并使用Bean对象

 操作流程


Spring框架概述

什么是Spring框架

我们常说的Spring指的是Spring Framework(Spring 框架),是一个开源的框架,有着活跃且庞大的社区。同时Spring还支持广泛的引用场景,它可以让Java企业级的应用程序开发更加的简单。

总体来说Spring就是包含了众多工具方法的IoC容器。

上面这句话包含了两个重要信息,也是Spring的本质。那么什么是容器,什么又是IoC容器?

什么是容器

我们回想我们之前学过得容器,是干什么的。

比如:

  • List/Map是存储数据的容器。
  • Tomcat是存储Web网站的容器。

Spring里面的容器其实也是同样的性质,都是用来存储东西的。具体存储的是就是对象。

什么是IoC容器

在我们知道了什么是容器里面存储的是对象之后,那么IoC容器又是什么呢?

IoC:翻译成中文就是控制翻转的意思,也就说Spring是一个控制翻转的容器。

控制翻转具体控制的是啥,又把什么给翻转了?

对象的生命周期:在传统的开发过程中,对象的生命周期是由程序员直接控制的。然而在Spring中,对象的生命周期不在是程序员控制了,而是交给Spring,让Spring去管理和控制对象的生命周期。Spring本身右具有存储对象和获取对象的能力。控制的就是对象,翻转的就是对象的控制权。

这里的IoC是一种设计思想。

Spring的核心功能

上述描述我们知道了Spring是一个包含了众多工具方法的IoC容器。

既然是容器,那么具备的两个基本的功能:

  • 将对象存储在容器中
  • 从容器中获取对象

也就说Spring最核心的功能就是将对象如何存储到Spring中,再从Spring中如何获取对象的过程。

IoC容器和普通程序开发的区别

将对象存储到IoC容器中的好处:将对象存储到IoC容器中相当于将以后可能会用到的所有工具都制作好放到仓库中,需要的时候直接取就好了,用完再次放到仓库中去。然后普通程序开发是每次需要工具的时候,才先做,也就是new,当这个new出来的对象用完了之后,就直接扔掉,也不会保存,如果下次需要了还得new。这就是IoC容器和普通程序开发的区别。

使用IoC容器还有一个好处就是可以实现代码之间的解耦。

DI

提到IoC,不得不提就是DI,DI是Dependency Injection的缩写,中文就是依赖注入的意思。

所谓的依赖注入,就是在IoC容器运行的过程中,动态的将某种依赖关系注入到对象之中。

依赖注入(DI)和控制翻转(IoC)都是在不同的角度描述一件事情。就是值通过引入IoC容器,利用依赖注入的方式,实现对象直接的解耦。

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

Spring项目的创建和使用

前面我们说了那么多,那么接下来我们就创建一个Spring项目。


Spring项目创建

Spring项目是通过Maven的方式来创建一个Spring项目,创建Spring项目总共可以分为3步:

  1. 创建一个普通的maven项目
  2. 添加Spring框架支持(spring-conext、spring-beans)
  3. 添加一个启动类。

解下来我们一步一步来:

创建一个maven项目

点击下一步:

 

添加Spring框架支持

在创建好的项目中,有一个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>

从上述添加的框架中可以看出,添加的框架有spring-context和spring-beans

spring-context:   spring的上下文

spring-beans:    spring管理对象的模块

从这里就能看出spring框架与传统开发的区别就是针对对象(在spring中Bean)的管理。

添加一个启动类

最后在创建好的项目中,src/main/java这个路径中创建一个启动类,包含一个main方法即可。

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

经过上述步骤之后,我们就成功的创建了一个spring项目。注意在上述创建的过程中,如果出现pom.xml文件里面爆红现象,那么就是maven的国内源没有配置上。关于maven国内源的配置,这里不在过多赘述。

Spring项目的使用

当我们在创建好了spring项目之后,我们就得使用spring项目了。

前面已经说过,spring的核心功能:

  • 存储Bean对象
  • 获取Bean对象

接下来spring的使用也将围绕着这两个Spring的核心功能来使用。

存储Bean对象

在存储Bean对象之前我们先要有Bean对象,这里Bean对象就是就是普通的对象。

我们先创建一个Bean对象:

 在src/main/java下面创建了如上目录。

User类如下:

package com.dgz.domo;

public class User {
    private int userId;
    private String name;

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void sayHi() {
        System.out.println("Hi spring");
    }
    @Override
    public String toString() {
        return "User{" +
                "userId=" + userId +
                ", name='" + name + '\'' +
                '}';
    }
}

这样我们就有了一个Bean对象。

接下来我们需要把这个Bean对象存储到Spring中,在存储之前,我们需要创建一个Spring配置文件。

在resources文件夹下面创建一个spring-config.xml文件:

并在spring-config.xml文件里面添加如下代码:

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

 上述代码是固定格式,不需要记忆。

然后我们在这个配置文件注册对应的Bean对象即可。

接下来我们将User对象注册到Spring中,具体操作是在beans标签中添加一个bean标签,然后在里面添加注册User对象的属性即可。

    <bean id="user" class="com.dgz.domo.User"></bean>

 这里id就是我们在将来获取Bean对象的时候需要填写的属性。class为User这个类的具体路径。

经过上述的操作我们就将一个Bean对象完成的注册到(存储到)Spring中去了。

获取并使用Bean对象

获取并使用Bean对象一共分为3步:

  1. 得到Spring上下文对象,因为对象都交给Spring去管理了,所以获取要到Spring中获取,那么就要得到Spring的上下文对象。
  2. 通过Spring上下文对象,获取某一个指定的Bean对象。
  3. 使用Bean对象

获取Spring上下文对象

Spring上下文可以通过使用ApplicationContext来获取到。

我们在启动类中可以通过如下代码来获取上下文对象:


        //得到Spring上下文对象,创建的时候需要配置Spring的配置信息
        ApplicationContext context = new 
ClassPathXmlApplicationContext("spring-config.xml");

除了ApplicationContext之外,我们还可以使用BeanFactory来作为Spring的上下文对象。

如下代码所示:

//使用BeanFactory
        BeanFactory factory = new 
XmlBeanFactory( new ClassPathResource("spring-config.xml"));

这两个获取Spring上下文对象的区别:(面试题)

ApplicationContext和BeanFactory的区别:

  1. ApplicationContext是BeanFactory的子类,ApplicationContext拥有更多功能。
  2. 加载Bean的机制不同,BeanFactory懒加载,按需加载,(使用一个bean加载一个Bean) ApplicationContext则是一次性加载所有的Bean对象。
  3. ApplicationContext启动慢,但是启动之后获取对象非常快 BeanFactory启动快,占用内存很少,但是后期获取对象非常慢。

获取指定的Bean对象

如下代码:

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

        //得到Spring上下文对象
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        //使用BeanFactory
        BeanFactory factory = new XmlBeanFactory( new ClassPathResource("spring-config.xml"));

        //使用ApplicationContext的方式来获取Bean对象
        User user = (User) context.getBean("user");
    }
}

这里需要注意我们在getBean里面的参数是不是很熟悉,这个参数就是我们之前在spring-config.xml文件中配置的id属性。

这里的id要一一对应:

 getBean的更多用法:

getBean有很多重载的方法,我们也可以通过其他的方式来获取Bean对象,比如下面这种:

        //根据类型来获取Bean
        User user1 = context.getBean(User.class);

        //根据id+类型来获取Bean
        User user2 = context.getBean("user",User.class);

 这两种方式的区别就是当有一个类被重复的注册到spring-config.xml中的时候,就只能使用名称获取了

 我们把一个类重复的注册到spring-config.xml中,然后再通过上述两种方式来获取,就会发现报错了。

上述这个错误就是说找到了两个user对象,但是获取的方式无法区分到底是要获取那个Bean,这时就要使用id的获取方式获取id+类型的方式。

使用Bean对象

由于我们之前已经通过各种的方式获取到了Bean对象,这时我们就能使用Bean对象了。

public class App {
    public static void main(String[] args) {
        //得到Spring上下文对象
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        //使用BeanFactory
        BeanFactory factory = new XmlBeanFactory( new ClassPathResource("spring-config.xml"));
        //使用ApplicationContext的方式来获取Bean对象
        //根据id来获取Bean
        User user = (User) context.getBean("user");
        //根据类型来获取Bean
       // User user1 = context.getBean(User.class);
        //根据id+类型来获取Bean
       /* User user2 = context.getBean("user",User.class);
        User user3 = context.getBean("user1",User.class);*/

        //使用Bean对象
        user.sayHi();

    }
}

 操作流程

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

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

相关文章

04规划模型练习题

(0-1 规划)某公司董事会正在考虑几个大型的投资项目&#xff0c;每个项目只能投资一次&#xff0c;且各个项目所需的投资金额与能够产生的预期收益是不同的&#xff0c;具体见表 1 所示.已知公司现有的投资额是 1亿美金&#xff0c;其中投资项目 1和项目 2 是斥的&#xff0c;项…

物理层——数据通信基础知识

1.典型的数据通信模型 2.数据通信的相关术语 2.1 三种通讯方式 2.2 数据传输方式 2.3 常用编码方式&#xff08;数字信号&#xff09; 曼彻斯特编码 将一个码元分成两个相等的间隔&#xff1b; 前一个间隔为 低电平 &#xff0c;后一个间隔为 高电平 表示码元1&#xff1b; 码…

Type-C带充电的OTG转接器方案 LDR6028

近些年随着社会生活水平提高&#xff0c;每个人的的电子设备逐渐的多了起来&#xff0c;各大品牌都在发售自家品牌的全家桶。手机、平板、笔记本电脑、智能手表、无线耳机、任天堂Switch、索尼PS5等电子设备一种不落。 那么多的电子设备基本来说都是需要充电&#xff0c;比如手…

JS-27 前端数据请求方式;HTTP协议的解析;JavaScript XHR、Fetch的数据请求与响应函数;前端文件上传XHR、Fetch;安装浏览器插件FeHelper

目录 1_前端数据请求方式1.1_前后端分离的优势1.2_网页的渲染过程 – 服务器端渲染1.3_网页的渲染过程 – 前后端分离 2_HTTP协议的解析2.1_HTTP概念2.2_网页中资源的获取2.3_HTTP的组成2.4_HTTP的版本2.5_HTTP的请求方式2.6_HTTP Request Header2.7_HTTP Response响应状态码2.…

Mac 配置 host,且立即生效

在公司局域网下办公&#xff0c;经常需要在本地配置对应 host 映射&#xff0c;才能正常接入网络。本文就介绍一下怎么在 Mac 上配置 host&#xff0c;且立即生效。 修改 host 打开终端工具输入命令&#xff1a;sudo vi /etc/hosts输入密码&#xff0c;回车在英文状态下输入字…

途乐证券“美元见顶论”引爆华尔街,人民币反弹后怎么走?

受GDP数据不及预期影响&#xff0c;周一&#xff08;18日&#xff09;人民币对美元走弱&#xff0c;走弱起伏达到300点。不过&#xff0c;由于曩昔两周美元指数遭受“滑铁卢”并敏捷跌破100大关&#xff0c;人民币对美元仍交投于7.2之下。 跟着上星期美元经历了8个月来最糟糕的…

Airtest的安装、配置、使用教程

1.安装及配置 1.1 下载AirtestIDE 官网&#xff1a;https://airtest.netease.com/ 选择下载版本&#xff0c;根据自己电脑版本进行下载对应安装包。 解压文件&#xff0c;进入安装目录&#xff0c;找到 AirtestIDE.exe&#xff0c;双击即可启动。 1.2 下载Airtest第三方库 先…

性能测试需求分析怎么做?(上)

本系列文章我们为大家系统地介绍一下性能测试需求分析&#xff0c;让大家全面掌握性能测试的第一个环节。本系列文章将会从性能测试需求分析整体概述、性能测试需求分析内容、性能测试需求分析方法这三个方面进行展开。 首先我们先对信息系统地性能进行一下了解&#xff0c;为…

Appium+python自动化(十四)- 与Capability完美懈垢之解读(超详解)

简介 Capability又叫Appium Desired Capabilities&#xff0c;前边写了那么多实例代码&#xff0c;小伙伴可以发现一些规律&#xff0c;就是有一部分代码总是重复的出现在你的视线中。这部分就是对Capability的配置。那么今天给小伙伴们分享、介绍和讲解一下Capability。让你知…

vue3的组件中使用slot

场景&#xff1a;在写好的表格组件中&#xff0c;需要在写好的默认操作的基础上&#xff0c;具备另外的操作。使用slot 组件里面只有修改功能&#xff0c;另外两个功能自己加。 页面中使用具名插槽插入自己需要的其他功能。 也可以直接使用 <slot></slot>直接插入内…

AOS | Type-C端口的ESD解决方案

日前&#xff0c;集设计研发、生产和全球销售一体的著名功率半导体及芯片供应商Alpha and Omega Semiconductor Limited &#xff08;AOS, 纳斯达克代码:AOSL) 推出了一系列单通道瞬态电压抑制器 (TVS)——AOZ8S303BLS-24 和AOZ8S305BLS-24。该系列产品采用同类最佳的低电容TVS…

实验数据管理与分析系统【双库实现】

一、介绍 实验数据管理与分析系统&#xff0c;实现了对实验数据和统计数据的备份、统一管理、可视化分析展示、操作日志展示等功能。系统角色分为管理员与普通用户&#xff0c;普通用户可以上传实验数据到系统主库&#xff0c;将主库数据迁移到从库并进行操作&#xff0c;然后…

idea集成jrebel完成热部署

idea集成jrebel完成热部署 今天想把idea设置成热部署&#xff0c;结果按照教程设置完还是不行&#xff08;一般教程请自行百度&#xff09;。实在受不了了就集成jrebel插件来完成热部署 一、下载插件 首先在idea的settings里的plugs搜索jrebel&#xff0c;将插件安装&#xff…

写字楼/办公楼能源管理系统的具体应用 安科瑞 许敏

0 引言 随着社会的进步&#xff0c;我国经济的快速发展&#xff0c;企业的办公环境和方式发生了巨大的变化&#xff0c;专业的写字楼在各大城市遍布林立。写字楼的出现使得各地企业办公集中化、高效化&#xff0c;然而写字楼物业管理的同步发展对于企业服务来说更是一个很大的…

HarmonyOS/OpenHarmony元服务开发-ArkTS卡片相关模块

图1 ArkTS卡片相关模块 FormExtensionAbility&#xff1a;卡片扩展模块&#xff0c;提供卡片创建、销毁、刷新等生命周期回调。 FormExtensionContext&#xff1a;FormExtensionAbility的上下供接口实现更新卡片、设置卡片更新时间、获取卡片信息、请求发布卡片等。 formIn…

高精尖领域数据暴增,分布式存储渐当大任

近年来&#xff0c;数据存储市场“最靓的仔”无疑就是分布式存储。 大模型火了之后&#xff0c;围绕Chat的应用也越来越多&#xff0c;通过AI生成图片、报表、音视频的应用比比皆是。众所周知&#xff0c;要想训练出一个有学习能力的、可理解的、响应迅速的大模型应用&#xf…

Hook技术 - 某站cookie解析

本文仅供学习交流&#xff0c;只提供关键思路不会给出完整代码&#xff0c;严禁用于非法用途&#xff0c;若有侵权请联系我删除&#xff01; 目标网站&#xff1a;aHR0cHM6Ly93d3cuYmlsaWJpbGkuY29tLw 目标接口&#xff1a;Cmh0dHBzOi8vYXBpLmJpbGliaWxpLmNvbS94L3dlYi1pbnRl…

小程序逆向动态调试及修复过程

微信小程序逆向 : https://codeooo.blog.csdn.net/article/details/120219900 一 &#xff1a;_typeof3 is not a function 小程序解包之后&#xff0c;在微信开发者工具当中点开调试器&#xff0c;选择Console选项卡&#xff0c;发现左侧的预览界面是空白的&#xff0c;虽然…

leetcode 40. 组合总和 II

2023.7.19 此题为 组合总和 的升级版。本题的特殊之处在于 给定的candidates数组只一个无序且包含重复元素的数组&#xff0c;并且最终的解集不能包含重复的组合。 所以本题的关键在于去重。那么&#xff0c;此类题的去重分为两种&#xff0c;一种是解集内部去重&#xff0c;灵…

设计模式-享元模式在Java中的使用示例-围棋软件

场景 享元模式 简介 当一个软件系统在运行时产生的对象数量太多&#xff0c;将导致运行代价过高&#xff0c;带来系统性能下降等问题。 例如在一个文本字符串中存在很多重复的字符&#xff0c;如果每一个字符都用一个单独的对象来表示&#xff0c;将会占用 较多的内存空间…