2. Spring 的创建和使用

这篇具有很好参考价值的文章主要介绍了2. Spring 的创建和使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

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 -- 没有这样的对象


2. Spring 的创建和使用,java ee,spring,java,mysql

在上篇文章中,我们了解了 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>

添加以上代码后,刷新,显示如下图所示:

2. Spring 的创建和使用,java ee,spring,java,mysql

从上述配置中可以看出,添加的框架有 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 的根目录下, 如下图所示:

2. Spring 的创建和使用,java ee,spring,java,mysql

<?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 后应为全限定名,即带路径的名称。

2. Spring 的创建和使用,java ee,spring,java,mysql

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

按住 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,最常用的为上面三种:

2. Spring 的创建和使用,java ee,spring,java,mysql

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

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

2. Spring 的创建和使用,java ee,spring,java,mysql

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 中时,只能使用根据名称获取了,比如以

下程序:

2. Spring 的创建和使用,java ee,spring,java,mysql

错误日志:
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);

2. Spring 的创建和使用,java ee,spring,java,mysql

可以看到,无论获取多少次对象或者使用哪种方式获取,依然拿到的是同一个 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("小明"));
    }
}

2. Spring 的创建和使用,java ee,spring,java,mysql

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。

2. Spring 的创建和使用,java ee,spring,java,mysql

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]中使用。

2. Spring 的创建和使用,java ee,spring,java,mysql

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]无法打开,因为它不存在。

2. Spring 的创建和使用,java ee,spring,java,mysql

5.4 NoSuchBeanDefinitionException -- 没有这样的对象

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

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

2. Spring 的创建和使用,java ee,spring,java,mysql文章来源地址https://www.toymoban.com/news/detail-613313.html

到了这里,关于2. Spring 的创建和使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java EE】Spring请求如何传递参数详解

    访问不同的路径,就是发送不同的请求.在发送请求时,可能会带⼀些参数,所以我们在学习Spring的请求时,主要是学习如何传递参数到后端以及后端如何接收. 下面博主会对传递参数进行一个详解,咱们主要是使⽤浏览器和Postman来模拟 当我们运行后,用浏览器进行访问 http://127.0.

    2024年04月12日
    浏览(51)
  • 【Java EE】Spring核心思想(一)——IOC

    通过前⾯的学习, 我们知道了Spring是⼀个开源框架, 他让我们的开发更加简单. 他⽀持⼴泛的应⽤场 景, 有着活跃⽽庞⼤的社区, 这也是Spring能够⻓久不衰的原因. 但是这个概念相对来说, 还是⽐较抽象. 我们⽤⼀句更具体的话来概括Spring, 那就是: Spring 是包含了众多⼯具⽅法的

    2024年04月23日
    浏览(52)
  • 【Java EE】初识Spring Web MVC

    Spring Web MVC 是 基于 Servlet API 构建的原始 Web 框架 ,从⼀开始就包含在Spring框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为)Spring MVC). Servlet是⼀种实现动态⻚⾯的技术.准确来讲Servlet是⼀套Java Web 开发的规范,或者说是⼀套Java Web 开发的

    2024年04月10日
    浏览(55)
  • Java EE 突击 9 - Spring Boot 日志文件

    这个专栏给大家介绍一下 Java 家族的核心产品 - SSM 框架 JavaEE 进阶专栏 Java 语言能走到现在 , 仍然屹立不衰的原因 , 有一部分就是因为 SSM 框架的存在 接下来 , 博主会带大家了解一下 Spring、Spring Boot、Spring MVC、MyBatis 相关知识点 并且带领大家进行环境的配置 , 让大家真正用好

    2024年02月13日
    浏览(48)
  • Java EE 突击 11 - Spring MVC 程序开发 (2)

    这个专栏给大家介绍一下 Java 家族的核心产品 - SSM 框架 JavaEE 进阶专栏 Java 语言能走到现在 , 仍然屹立不衰的原因 , 有一部分就是因为 SSM 框架的存在 接下来 , 博主会带大家了解一下 Spring、Spring Boot、Spring MVC、MyBatis 相关知识点 并且带领大家进行环境的配置 , 让大家真正用好

    2024年02月13日
    浏览(69)
  • Java EE 突击 10 - Spring MVC 程序开发 (1)

    这个专栏给大家介绍一下 Java 家族的核心产品 - SSM 框架 JavaEE 进阶专栏 Java 语言能走到现在 , 仍然屹立不衰的原因 , 有一部分就是因为 SSM 框架的存在 接下来 , 博主会带大家了解一下 Spring、Spring Boot、Spring MVC、MyBatis 相关知识点 并且带领大家进行环境的配置 , 让大家真正用好

    2024年02月13日
    浏览(44)
  • 【JAVA EE】Spring Boot中maven环境的搭建和设置

    Sping Boot是Spring推出的框架,是Spring家族的一个子项目,其设计初衷是为了简化Spring配置,从而让用户可以轻松构建独立运行的程序,并极大提高工作效率。 本系列将学习Spring Boot的相关原理和简单开发。 在Spring Boot框架出现以前,java EE开发常用的框架是Spring,该框架开始于

    2024年02月06日
    浏览(52)
  • Java(一):创建 Spring Boot 项目并实现连接操作MySQL数据库

    MySQL 命令 Maven 相关地址 下载地址: https://maven.apache.org/ maven配置方法地址: https://developer.aliyun.com/mvn/guide 仓库搜索地址: https://mvnrepository.com/ https://repo.maven.apache.org/ maven 本地配置 conf/settings.xml 下载 idea 并配置本地环境 maven Maven 构建 生命周期 Maven 的构建 生命周期 包括 三

    2024年02月07日
    浏览(65)
  • (第六天)初识Spring框架-SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录

    ​ 昨天我们已经把Mybatis框架的基本知识全部学完,内容有Mybatis是一个半自动化的持久层ORM框架,深入学习编写动态SQL,Mybatis的关联映射,一对一、一对多、多对多、Mybatis的缓存机制,一二级缓存的开启和设置,缓存命中率、如何使用idea链接数据库自动生成pojo类等。我们学

    2024年02月10日
    浏览(63)
  • SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录(第三天)动态SQL

    昨天我们深入学习了 Mybatis的核心对象SqlSessionFactoryBuilder , 掌握MyBatis核心配置文件以及元素的使用 ,也掌握MyBatis映射文件及其元素的使用。那么今天我们需要掌握的是更加复杂的查询操作。 学会编写MyBatis中动态SQL 学会MyBatis的条件查询操作 学会MyBatis的更新操作 学会MyBati

    2024年02月11日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包