2. Spring 的创建和使用

news2024/11/29 6:32:51

目录

1. 创建 Spring 项目

1.1 创建一个 maven 项目

1.2 添加 Spring 框架支持

1.3 添加启动类

2. 存储 Bean 对象

2.1 创建 Bean

2.2 将 Bean 注册到容器

3. 获取并使用 Bean 对象

3.1 创建 Spring 上下文

 ApplicationContext 和 BeanFactory 的区别(重点) 

3.2 获取指定的 Bean 对象

3.2.1 通过 id 获取 

3.2.2 通过类型获取

3.2.3 通过 id + 类型 获取

3.3 使用 Bean

4. Spring 创建和使用总结

5. 根据日志定位问题

5.1 NoUniqueBeanDefinitionException -- 无唯一BeanDefinition异常

5.2  BeanDefinitionParsingException -- BeanDefinition解析异常

5.3 FileNotFoundException -- 文件未找到异常

5.4 NoSuchBeanDefinitionException -- 没有这样的对象


在上篇文章中,我们了解了 Spring 的核心与设计思想:Spring 是一个包含了众多工具方法的 IoC 容器。Spring 具备的两个功能:

  • 将对象存储到 Spring 中
  • 从 Spring 中将对象取出来

在 Java 中,对象也叫 Bean。

1. 创建 Spring 项目

接下来我们使用 maven 方式来创建一个 Spring 项目,分以下三步:

  1. 创建⼀个普通 Maven 项目
  2. 添加 Spring 框架支持spring-context、spring-beans)。
  3. 添加启动类

1.1 创建一个 maven 项目

1.2 添加 Spring 框架支持

在项⽬的 pom.xml 中添加 Spring 框架的⽀持,xml 配置如下:
<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 上下⽂,还有 spring-beans:管理对象的模块。

1.3 添加启动类

在创建好的项目 Java 文件夹下新创建一个包含 main 方法的启动类:

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

    }
}

2. 存储 Bean 对象

存储 Bean 分以下两步:

  1. 存储 Bean 之前,得先有 Bean,因此需要先创建一个 Bean
  2. 将创建的 Bean 注册到 Spring 容器中

2.1 创建 Bean

所谓的 Bean 是Java 语言中的一个普通对象,实现代码如下:

public class User {
    public String sayHi(String name){
        return name + "Hi";
    }
}

2.2 将 Bean 注册到容器

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

<?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>
接下来,再将 User 对象注册到 Spring 中就可以,具体操作是在 <beans> 中添加如下配置:
<bean id="" class=""></bean>

id 我们设置为 user,class 后应为全限定名,即带路径的名称。

那么如何知道我们的路径是否正确呢?

按住 CTRL键 鼠标点击 User 可以跳转到 User 类,则说明路径正确。

3. 获取并使用 Bean 对象

获取并使用 Bean 对象分为以下3步:

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

如果获取多个 Bean 则重复第2、3步骤。

3.1 创建 Spring 上下文

ApplicationContext 可以认为是 Spring 的运行环境,翻译过来就是上下文。

使用 ApplicationContext 创建 Spring 的上下文对象,创建的时候需要配置 Spring 配置信息:

ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

除了 ApplicationContext 我们还可以使用 BeanFactory 来获取 Spring 的上下文:

BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
 ApplicationContext 和 BeanFactory 的区别(重点) 

 ApplicationContext 和 BeanFactory 效果是一样的,ApplicationContext 属于 BeanFactory 的子类,它们有以下区别

  • 继承关系功能方面:Spring 容器有两个顶级的接口:BeanFactory 和 ApplicationContext. 其中 BeanFactory 提供了基础的访问容器的能力,而 ApplicationContext 属于 BeanFactory 的子类,它除了继承了 BeanFactory 的所有功能之外,它还拥有独特的特性,还添加了对国际化支持、资源访问支持、以及事件传播等方面的支持
  • 性能方面来说:ApplicationContext 是一次性加载并初始化所有的 Bean 对象(空间换时间),而 BeanFactory 是需要哪个才加载哪个(懒加载),因此更加轻量。

CalssPathXmlApplicationContext 属于 ApplicationContext 的子类,拥有 ApplicationContext 的所有功能,是通过 xml 的配置来获取所有 Bean 的。

3.2 获取指定的 Bean 对象

通过以下几种方法可以获取 Bean,最常用的为上面三种:

3.2.1 通过 id 获取 
User user = (User)context.getBean("user"); // 通过 Id 获取

需要注意的是,Id 是唯一的,Bean 的 Id 需要一一对应

3.2.2 通过类型获取
// 通过类名获取
User user = context.getBean(User.class);

优点:不需要进行类型转换

缺点:如果一个类有多个对象时,不能使用该方式 

3.2.3 通过 id + 类型 获取
// 通过 id + 类型获取
User user = context.getBean("user",User.class);

那么 通过类型获取 Bean 和 id + 类型 获取 Bean 有什么区别呢?

区别:当有⼀个类型被重复注册到 spring-config.xml 中时,只能使用根据名称获取了,比如以

下程序:

错误日志:
Exception in thread "main" org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'BuildSpring.User' available: expected single matching bean but found 2: user,user2

可以看到错误日志大致为:期待找到一个匹配的 bean 但是 找到了两个分别是:user 和 user2.

User user = (User)context.getBean("user");
System.out.println(user);
User user1 = (User)context.getBean("user");
System.out.println(user1);
User user2 = context.getBean(User.class);
System.out.println(user2);
User user3 = context.getBean("user",User.class);
System.out.println(user3);

可以看到,无论获取多少次对象或者使用哪种方式获取,依然拿到的是同一个 Bean。

3.3 使用 Bean

public class App {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
//        BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
        // 通过 ID 获取
        User user = (User)context.getBean("user");
        // 通过类名获取
//        User user = context.getBean(User.class);
        // 通过 id + 类型获取
//        User user = context.getBean("user",User.class);
        System.out.println(user.sayHi("小明"));
    }
}

4. Spring 创建和使用总结

Spring 的创建和使用的整体流程为:

  1. Spring 项目的创建
    1. 创建项目
    2. 引入依赖
    3. 创建一个启动类
  2. 存对象
    1. 创建 Bean(类)
    2. 将 Bean 注册到 spring-config 中
  3. 取对象
    1. 得到 Spring 的上下文,并读取到 Spring 的配置文件(ApplicationContext)
    2. 获取某一个 Bean 的对象(getBean())
    3. 使用 Bean 对象

5. 根据日志定位问题

日志只有一段时只看一段的最前面就可以(从上往下看),当有多段时从下往上看。

5.1 NoUniqueBeanDefinitionException -- 无唯一BeanDefinition异常

Exception in thread "main" org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'BuildSpring.User' available: expected single matching bean but found 2: user,user2

 期待找到一个匹配的 bean 但是找到了两个分别是:user 和 user2。

5.2  BeanDefinitionParsingException -- BeanDefinition解析异常

Exception in thread "main" org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Bean name 'user' is already used in this <beans> element
Offending resource: class path resource [spring-config.xml]

Bean名称“user”已在此<beans>元素路径资源[spring config.xml]中使用。

5.3 FileNotFoundException -- 文件未找到异常

 Caused by: java.io.FileNotFoundException: class path resource [spring-config1.xml] cannot be opened because it does not exist
    at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:180)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:331)
    ... 13 more

[spring-config1.xml]无法打开,因为它不存在。

5.4 NoSuchBeanDefinitionException -- 没有这样的对象

Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'user1' available

没有名为“user1”的bean可用。

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

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

相关文章

《零基础入门学习Python》第054讲:论一只爬虫的自我修养2:实战

0. 请写下这一节课你学习到的内容&#xff1a;格式不限&#xff0c;回忆并复述是加强记忆的好方式&#xff01; 今天我们决定在实战中来进行学习&#xff0c;会举两个例子&#xff0c;第一个例子是我们会下载一只猫&#xff0c;第二个例子是我们用Python来模拟浏览器通过在线的…

MySQL数据库中 IF函数的使用

文章目录 使用IF函数进行简单条件判断IF函数的应用场景总结 IF函数作为MySQL数据库中的一个函数&#xff0c;可以在查询语句中进行条件判断并返回不同的结果。它有多种语法形式&#xff0c;包括简单的IF语句和复杂的CASE语句。在本篇文章中&#xff0c;我们将介绍IF函数的基本用…

Android 实现仿淘宝地址多级选择器

先看下效果图 仿淘宝的选择完城市出来的选择省市区之类的&#xff0c;这个支持自定义层级&#xff0c;多少层都可以使用&#xff0c;接下来是代码: BottomPopUtils.class&#xff0c;我写了一个工具类&#xff0c;方便全局调用 public class BottomPopUtils {public static P…

JAVA-正则表达式基本语法规则和Pattern,Matcher,PatternSyntaxException三大类

目录 引言 一&#xff0c;正则表达式基本语法规则 二&#xff0c;正则表达式的三大类方法 2.1&#xff0c;Pattern类 2.1.1&#xff0c;Pattern的常用方法matches&#xff08;&#xff09; 2.2&#xff0c;Matcher类 2.2.1&#xff0c;Matcher的常用方法find() 2.2.2&a…

vue3-Vite原理

1. vite的优势 1. 极速的服务启动2. 轻量快速的预加载.....2. 对vite的理解&#xff08;和webpack对比说明&#xff09; webpack要经过打包&#xff0c;然后在开发阶段启动服务器vite不需要打包 下图的"准备"就是编译的意思。 css的内容会编译程一个字符串。 组件会…

[SSM]手写Spring框架

目录 十一、手写Spring框架 第一步&#xff1a;创建模块myspring 第二步&#xff1a;准备好要管理的Bean 第三步&#xff1a;准备myspring.xml配置文件 第四步&#xff1a;核心接口实现 第五步&#xff1a;实例化Bean 第六步&#xff1a;给Bean属性赋值 第七步&#xff…

arcgis-利用等高线数据生成dem栅格

1、打开cass&#xff0c;展高程点&#xff0c;绘制三角网&#xff0c;绘制等高线&#xff0c;删除三角网和高程点。如下&#xff1a; 2、得到的等高线图&#xff0c;如下&#xff1a; 3、保存文件为dwg格式&#xff0c;随后打开arcmap软件&#xff0c;打开dwg的线层数据&#x…

【项目设计】基于负载均衡的在线oj平台

目录 一、项目介绍 二、开发环境以及技术 三、概要设计 四、关键算法 五、项目演示 六、代码实现 一、项目介绍 该项目是基于负载均衡的在线oj&#xff0c;模拟平时刷题网站&#xff08;leetcode和牛客&#xff09;写的一个在线判题系统 项目主要分为五个模块&#xff…

DevOps系列文章之 Git知识大全

refs和reflog Git的所有操作都基于提交&#xff1a;你会暂存提交&#xff0c;创建提交&#xff0c;查看过去的提交记录&#xff0c;或者使用很多很多Git命令在不同的仓库之间转移提交内容。这些命令中的很大一部分都会以某种形式来操作提交&#xff0c;其中很多还会以提交ID作…

结构型设计模式之代理模式【设计模式系列】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列 期待你的关注哦&#xff01;&#xff01;&#xff01; 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everythi…

【iOS】对象底层学习

学习博客&#xff1a;[iOS]-OC对象底层探索 1. 类与对象 1.1 类和对象的本质 1.1.1 对象 对象的本质是结构体。 interface TestPerson : NSObject {// 成员变量// publicNSString *_age; // 4个字节 } property (nonatomic, copy) NSString *name; // 属性endimplementati…

C程序环境及预处理

​​​​​文章目录 一、程序的翻译环境和执行环境 1.程序编译过程 2.编译内部原理 3.执行环境 二、程序运行前的预处理 1.预定义符号归纳 2.define定义标识符 3.define定义宏 4.define替换规则 5.宏和函数的对比 三、头文件被包含的方式 四、练习&#xff1a;写一…

F.interpolate 数组采样操作

功能&#xff1a;利用插值方法&#xff0c;对输入的张量数组进行上\下采样操作&#xff0c;换句话说就是科学合理地改变数组的尺寸大小&#xff0c;尽量保持数据完整。 在计算机视觉中&#xff0c;interpolate函数常用于图像的放大(即上采样操作)。比如在细粒度识别领域中&…

【C#】MVC页面常见的重定向方式和场景

本篇文章主要简单讲讲&#xff0c;C# MVC 页面常见跳转或者重定向的方式和场景。 在实际项目开发中&#xff0c;在一些特定场景肯定会用到重定向&#xff0c;比如&#xff1a;不同角色跳转到不同视图地址 目录 一、种常见重定向方式1.1、RedirectToAction1.2、RedirectToRoute1…

猿人学14题—备而后动-勿使有变

猿人学14题—备而后动-勿使有变 抓包分析大致流程 mz参数生成m的值定位&参数组成补环境首先简单处理下十六进制编码问题提示&#xff1a;ReferenceError: window is not defined提示&#xff1a;document is not defined提示&#xff1a;$ is not definedASN1 is not defin…

【探索人工智能】我与讯飞星火认知大模型的对话

文章目录 讯飞星火认知大模型的地址概要讯飞星火认知大模型的发展历程讯飞星火认知大模型的主页利用讯飞星火大模型解决一些基本的数学问题讯飞星火认知大模型与OpenAI,ChatGPT没有关系&#xff01;让讯飞星火认知大模型编写传奇代码hello world小结 讯飞星火认知大模型的地址 …

chatgpt使用及辅助编程方面的体验

chatgpt使用及辅助编程方面的体验 文章目录 chatgpt使用及辅助编程方面的体验1 引言2 辅助编程体验2.1 辅助编写代码2.2 找出代码问题2.3 代码优化2.4 解释代码结束语 1 引言 最近几个月什么最火&#xff0c;那一定时chatgpt,虽然在国内使用存在各种限制&#xff0c;但是还是挡…

el-select和el-checkBox实现下拉菜单全选功能

el-select 和 el-checkbox 实现下拉菜单全选功能 示例代码&#xff1a; <el-selectpopper-class"select-container"v-model"ids"placeholder"请选择目标":multiple-limit"20"multiplefilterablecollapse-tagsclass"wd400&qu…

20230721 Essex UK, Dongbing Gu 公开讲座--机器人前沿

个人主页&#xff1a; https://www.essex.ac.uk/people/GUDON81301/dongbing-gu 机器人领域任务的特点&#xff1a;dull, dirty, dangerous tasks in remote spaces 机器鱼&#xff1a; 实时港口环境监测 机器鱼群探索算法 化学传感器 水面声呐定位系统/SLAM/通信问题 Robotic …

RocketMQ教程-安装和配置

Linux系统安装配置 64位操作系统&#xff0c;推荐 Linux/Unix/macOS 64位 JDK 1.8 Maven3.0 yum 安装jdk8 yum 安装maven 1.下载安装Apache RocketMQ RocketMQ 的安装包分为两种&#xff0c;二进制包和源码包。 点击这里 下载 Apache RocketMQ 5.1.3的源码包。你也可以从这…