Spring 创建和使用

news2024/12/28 5:47:20

文章目录

    • 什么是 Bean ?
    • 1. 创建 Spring 项目
      • 1.创建一个 Maven 项目
      • 2. 添加 Spring 依赖
        • 1.配置 Maven 国内源
        • 2.添加 Maven 依赖
      • 3.添加启动项
    • 2.存储Bean对象
      • 1.创建 Bean
      • 2.注册 Bean
      • 3.获取并使用 Bean 对象
        • 1. 得到 Spring 对象
          • 常见方式有两种:
        • 2. 获取 Bean 对象
          • Bean 的三种获取方式
        • 3.使用 Bean 对象
          • 代码示例:
          • 类型相同的 bean 对象 , 实例化一样吗?
    • 总结

Spring 是一个包含了众多工具方法的 IoC 容器 , 既然是容器那么一定具备两个最基本的功能:

  • 将对象存储到容器(Spring) 中;
  • 从容器中将对象取出来.

什么是 Bean ?

在 Java 中对象也叫 Bean , 所以以后遇到对象就以 Bean 著称

初学 java 时我们都知道 , java 的图标是一杯咖啡 , 那么 bean 就可以当做咖啡豆.

bean 是一种特殊的 可重用的类 , 具有以下特征:

  • 提供一个无参构造函数
  • 需要被序列化且实现了 Serializable 接口
  • 有一系列可读属性 , 且一般是 private 的.
  • 有一系列的 Setter 和 getter 方法.

可以想象有一个箱子 , 内部被分成好几部分 , 每一部分存放指定的物品 , 工人可以从箱子中取出物品 , 也可以放入物品后封箱发送快递 , 其中 箱子就可以看做是 bean , 存取操作就是 Getter 和 Setter , 物品就是属性 , 封箱发送就是序列化和传输.

1. 创建 Spring 项目

接下来使用 Maven 来创建一个 Spring 项目 , 大致流程和创建 Servlet 类似 , 总共分为以下三步:

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

1.创建一个 Maven 项目

选择 Maven 之后直接点击 next 即可.

配置好路径之后直接点击 Finsh 即可.

文件显示如下图所示则初始化完毕

image-20230501212620237

2. 添加 Spring 依赖

1.配置 Maven 国内源

添加 Spring 依赖 , 为了保证项目可以方面的下载 , 我们需要配置Maven 国内源.

但 IDE 有个很反人类的操作 , 我们需要配置两次 seting (一个是当前配置文件 , 一个是新项目的配置文件)

当前配置文件:

新配置文件:

配置文件只需打两个对钩 , 最下面的对钩不选.

image-20230501212652777

通过复制 User seting file 路径找到settings.xml , 如果没有settings.xml . 可以直接下载我分享的配置.

settings.xml

image-20230501212708787

用 vscode 或 notepad++ , 打开该文件 , 找到 mirrors , 添加阿里的国内源.

   <mirror>
        <id>alimaven</id>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
        <mirrorOf>central</mirrorOf>        
      </mirror>

image-20230501212724934

重新下载 jar 包

点击Maven中的Reload.

image-20230501212732106

继续配置 新配置文件 中的 Maven , 步骤与上述一致.

2.添加 Maven 依赖

Maven Repository: spring (mvnrepository.com)

在 Maven 仓库中找到 spring.

image-20230501212735689

最好使用 5.xxx 的版本 , 因为 6.xx 版本对 jdk 的最低要求是 17.

image-20230501212742200

在 pom.xml 中引入 spring 依赖 , 并记得 Reload.

image-20230501212748611

如果出现如下目录代表下载完毕.

image-20230501212753805

3.添加启动项

启动类是为之后操作 spring 做准备的.

image-20230501212758783


2.存储Bean对象

存储 Bean 分为以下 2 步:

  1. 创建一个Bean (在 java 中一个对象如果被使用多次 , 就可以称之为 Bean)
  2. 将创建的 Bean 注册到 Spring 容器中.

1.创建 Bean

public class Student {
    private void sayHi(){
        System.out.println("hi student");
        
    }
}

2.注册 Bean

在创建好的项目中添加 Spring 配置文件 spring-config.xml , 将此文件放到 resources 的根目录下.

image-20230501212811209

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

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

image-20230501212816356

3.获取并使用 Bean 对象

从 Spring 容器中读取到 Bean

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

1. 得到 Spring 对象

常见方式有两种:
ApplicationContext context = 
  new ClassPathXmlApplicationContext("spring-config.xml"); 
BeanFactory beanFactory = 
  new XmlBeanFactory(new ClassPathResource("spring-config.xml"));

ApplicationContext 与 BeanFactory 获取对象的效果是一样的 , 只不过 Application 是 BeanFactory 的子类 , 它们的区别如下:

image-20230501212821111

  • 在继承和功能方面: Spring 容器有两个顶级的接口: BeanFactory 和 ApplicationContext , 其中 BeanFactoty 提供最基础的访问容器的功能 ,

    而 ApplicationContext 除了继承 BeanFactory 所以功能之外 , 还添加了对国际化支持 , 资源访问 , 以及事件传播等方面的支持.

  • 从性能方面来讲: ApplicationContext 会一次性加载并初始化所有的 Bean 对象(饿汉模式) , 而 BeanFactory 则是需要哪个才去加载哪个 , 因此更加轻量.

ClassPathXmlApplicationContext 属于 ApplicationContext 的子类 , 拥有 ApplicationContext 的所有功能 , 是通过 xml 的配置来获取所有的 Bean 容器.

image-20230501212828319

2. 获取 Bean 对象

Bean 的三种获取方式
  1. 根据名称
Student student = (Student) beanFactory.getBean("student");

Tips: Bean 的 Id 要一一对应.

image-20230501212832799

  1. 根据类名
Student student = context.getBean(Student.class);

根据类名获取 Bean 对象看似简单 , 但如果 Spring 中一个类型存储了多个实例 , 那么使用类型获取 Bean 就会报错.

image-20230501212841897

image-20230501212847482

  1. 根据类型和名称一起获取
Student student  = context.getBean("student", Student.class);

第三种方式看似与第一种相似 , 但第一种相对更加暴力 , 如果通过类名找不到 Bean , 依然坚持强制类型转换 , 就会空指针异常. 而第三种方式更加优雅.

3.使用 Bean 对象

代码示例:

spring-config.xml 中注册的 bean 并如下:

    <bean id="stu" class="com.spring.demo.Student"></bean>

    <bean id="student" class="com.spring.demo.Student"></bean>

    <bean id="teacher" class="com.spring.demo.Teacher"></bean>

Student 类中代码:

public class Student {
    public Student(){
        System.out.println("do student init");
    }
    public void sayHi(){
        System.out.println("hi student");

    }
}

Teacher 类中的代码:

public class Teacher {
    public Teacher(){
        System.out.println("do teacher init");
    }
    public void sayHi(){
        System.out.println("hi teacher");
    }
}

通过 ApplicationContext 获取 Spring 对象 , 并使用 bean 对象.

public class App {
    public static void main(String[] args) {
        //1.得到 Spring 上下文对象
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        //2. Spring 容器中获取到 bean 对象
        Student student  = context.getBean("student", Student.class);
        //3.使用 Bean 对象
        student.sayHi();
    }
}

通过运行结果可以看出 , ApplicationContext 会初始化容器中所有 Bean 对象.

image-20230501212852709

通过 BeanFactory 获取 Spring 对象 , 并使用 bean 对象

public class App2 {
    public static void main(String[] args) {
        // 1.得到 Spring 上下文对象
        BeanFactory beanFactory =
                new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
        //2. 从 Spring 容器中获取 bean 对象
        Student student = (Student) beanFactory.getBean("student");
        //3. 使用 Bean
        student.sayHi();
    }
}

通过运行结果可以看出 , BeanFactory 只有调用 getBean 才会加载对应的 Bean对象.

image-20230501212858292

类型相同的 bean 对象 , 实例化一样吗?
public class App {
    public static void main(String[] args) {
        //1.得到 Spring 上下文对象
        ApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        //2. Spring 容器中获取到 bean 对象
        Student student  = context.getBean("student", Student.class);
        Student stu = context.getBean("stu", Student.class);

        System.out.println("student == stu -->" + (student == stu));
    }
}

通过运行结果 , 我们可以得知 , 每一个存储在 Spring 中的bean , Spring 都会单独的为它们创建一个 bean 对象 , 不会因为类型相同就使用同一个对象.

image-20230501212904201

总结

Spring 的操作流程如下:

在这里插入图片描述

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

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

相关文章

SpringMVC中使用LocalDateTime、LocalDate等参数作为入参数据转换问题

1、接收GET请求方式及POST请求表单方式时间类型传参&#xff0c;需要自定义参数转换器或者使用ControllerAdvice配合initBind&#xff0c;不设置的话表单方式会报以下错误&#xff1a; 这种情况要和时间作为Json字符串时区别对待&#xff0c;因为前端json转后端pojo底层使用的是…

什么是Auto GPT-4? OpenAI 最新语言模型概览

动动发财的小手&#xff0c;点个赞吧&#xff01; 人工智能正在快速发展&#xff0c;近年来最令人兴奋的发展之一是创建可以生成类似人类文本的语言模型。领先的人工智能研究机构 OpenAI 最近发布了其最新的语言模型 Auto GPT-4。 在什么是 Auto GPT-4&#xff1f; OpenAI 最新…

【Java笔试强训 29】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525;求正数数…

AtCoder Beginner Contest 300(D-G)

D - AABCC (atcoder.jp) &#xff08;1&#xff09;题目大意 给你个数N&#xff0c;问你不超过N的三个质数abc组成的数有多少个。 &#xff08;2&#xff09;解题思路 考虑到枚举的数不会特别多&#xff0c;因此预处理出1e6的质因子&#xff0c;暴力枚举即可。 &#xff08;3&a…

在体育新闻文本中提取关键词可以使用什么技术

在体育新闻文本中提取关键词可以使用以下技术&#xff1a; 1. 领域词典&#xff1a; 通过构建体育领域的词汇表&#xff0c;将其中的词语作为关键词&#xff0c;可以较好地提取体育新闻中的关键词。 就当下的研究情况&#xff0c;国内外有哪些体育领域的词汇表http://t.csdn…

Reactive Streams介绍与应用分析

目录 一、Reactive Streams基本知识 &#xff08;一&#xff09;基本介绍 &#xff08;二&#xff09;反应式流的特点 基本特性1:事件驱动&变化传递 基本特性2:数据流 基本特性3:声明式 高级特性1:流量控制&#xff08;回压&#xff09; 高级特性2:异步边界 &…

ALBEF:基于动量蒸馏的视觉语言表示学习

Align before Fuse&#xff1a;Vision and Language Representation Learning with Momentum Distillation ALBEF&#xff1a;基于动量蒸馏的视觉语言表示学习 摘要 大规模的视觉和语言表征学习在各种视觉-语言任务上显示出有希望的改进。大多数现有的方法采用了基于Transform…

【平衡二叉搜索树(AVL)-- 旋转】

目录&#xff1a; 前言1、二叉搜索树的插入2、AVL树的旋转&#xff08;1&#xff09;右单旋&#xff08;LL&#xff09;&#xff08;2&#xff09;左单旋&#xff08;RR&#xff09;&#xff08;3&#xff09;右左双旋&#xff08;LR&#xff09;&#xff08;4&#xff09;左右…

第18章 项目风险管理

文章目录 18.1.2 风险的分类 54318.1.3 风险的性质 544项目风险管理6个过程&#xff08;风险管理、识别风险、实施定性风险分析、实施定量风险分析、规划风险应对、控制风险&#xff09;组织和干系人的风险态度影响因素18.3.3 规划风险管理的输出 550风险识别的原则18.4.2 识别…

vim编辑文件

目录 一、vi和vim &#xff08;1&#xff09;介绍 &#xff08;2&#xff09;相同点 &#xff08;3&#xff09;不同点 二、使用vim打开文件 三、使用vim编辑文件 &#xff08;1&#xff09;vim的四个模式 &#xff08;2&#xff09;命令模式下的编辑命令 删除 复制 …

树莓派4:跑通Tensorflow的Sequential模型用于图片分类

重要提示&#xff1a;由于树莓派相对孱弱的性能&#xff0c;直接在其上训练模型可能花&#xff08;lang4&#xff09;费非常长的时间。本文仅作为示例性的可行性参考&#xff0c;请酌情考虑实验平台。 著名的Tensorflow框架也可以运行在树莓派上。理论还没吃透&#xff0c;但使…

【量化交易笔记】5.SMA,EMA 和WMA区别

股票中的SMA&#xff0c;EMA和WMA是常用的技术分析指标。这些指标基于历史股价计算得出&#xff0c;可以帮助投资者了解股票的趋势&#xff0c;为决策提供依据。虽然它们都是平均值算法&#xff0c;但它们之间还是有一些区别的。 SMA 简单移动平均线&#xff08;Simple Moving…

参与辅助服务的用户侧储能优化配置及经济分析(matlab代码)

目录 1 主要内容 目标函数 2 部分程序 3 程序结果 4 程序链接 1 主要内容 该程序方法复现《参与辅助服务的用户侧储能优化配置及经济分析》&#xff0c;首先&#xff0c; 建立了用户侧储能的全生命周期成本和考虑辅助服务的收益模型&#xff1b;其次&#xff0c;在两部…

一文读懂UML用例图

一、概述 用例是描述系统需求的一种手段&#xff0c;即系统应该做什么。用例图由参与者、用例和主题组成。每个用例的主题都代表了一个用例所适用的系统。用户和任何其他可以与主体交互的系统都被表示为行动者。 用例是一种行为规范。用例的实例指的是紧急行为的发生符合相应…

【前端客栈】基于HTML、CSS、JavaScript的羊了个羊静态仿写页面小游戏

&#x1f3dc;哈喽&#xff0c;大家好&#xff0c;我是小浪。前段时间羊了个羊火遍了大江南北&#xff0c;大家是否都通过第二关了呢&#xff1f;哈哈&#xff0c;没关系&#xff0c;既然通不过&#xff0c;那咋们不如自己来做一个这样的羊了个羊的仿写页面&#xff0c;学会了赶…

文本中的关键词提取方法

目录 1. TF-IDF&#xff08;Term Frequency-Inverse Document Frequency&#xff09;算法&#xff1a; 2. TextRank算法&#xff1a; 3. LDA&#xff08;Latent Dirichlet Allocation&#xff09;算法&#xff1a; 4. RAKE&#xff08;Rapid Automatic Keyword Extraction&…

基于SLM调制器,MIT研发高效率全息显示方案

此前&#xff0c;青亭网曾报道过NVIDIA、三星、剑桥大学等对空间光调制器&#xff08;SLM&#xff09;全息方案的探索。空间光调制器可调节光波的空间分布&#xff0c;在电驱动信号控制下&#xff0c;可改变光在空间中传播的振幅、强度、相位、偏振态等特性&#xff0c;从而形成…

MySQL性能优化之(explain)工具

慢SQL的定位 在MySQL当中&#xff0c;我们有时候写的SQL执行效率太慢此时我们需要将其优化。但是SQL可能非常的多&#xff0c;难道我们一条一条的进行查看吗&#xff1f;在MySQL当当中我们可以查看慢查询日志&#xff0c;看看那些SQL这么慢。但是这个默认情况下这个慢查询日志…

sqoop使用

sqoop使用 1. 导入数据2. 从mysql向hive导入数据2.1 导入用户信息表 2.导入订单表2.2 导入订单表2.3 导入商品信息表2.4 导入国家信息表2.5 导入省份信息表2.6 导入城市信息表2.7 创建hive临时表文件 在使用sqoop之前&#xff0c;需要提前启动hadoop, yarn和对应的数据库mysql …

当音乐遇上Python:用Pydub自动分割音频

&#x1f3b5; &#x1f3b5; &#x1f3b5; 当音乐遇上Python&#xff1a;用Pydub自动分割音频 随着短视频应用的普及&#xff0c;越来越多人开始了解并尝试制作自己的短视频作品。而在制作短视频时&#xff0c;背景音乐的选择和使用也是非常重要的一步。很多人喜欢选择一首长…