您现在的位置是:首页 >其他 >spring创建和使用网站首页其他

spring创建和使用

bushi橙子༄༅ 2024-10-20 00:01:03
简介spring创建和使用

1.创建Spring项目

Spring既是容器,那么就有两个最基本的功能:

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

在Java中对象也叫做Bean,一个对象使用多次,就可以叫做Bean.所以后期遇到对象就称之为Bean.

使用Maven创建一个Spring项目,共分为3步:

  • ​ 创建一个普通的Maven项目
  • 添加Spring框架支持(添加spring-context 、spring-beans依赖)。
  • 添加启动类(main方法)

此处使用的是Idea 2021.3.2版本(2021.3版本插件免费),JDK8

1.1 创建一个Maven项目

在这里插入图片描述
在这里插入图片描述

点击“Finish”

  • 注意:整个路径等名称不能出现中文,必须全部英文,否则会报错

1.2 添加Spring框架支持[依赖] (重点/易错)

1.2 配置settings.xml 下载jar包

链接:【settings.xml

1.3 引入依赖

添加Spring框架支持,在项目的pom.xml中添加Spring的框架支持,如下:

  • 打开Maven远程仓库,搜索spring,选择Spring Context » 5.3.26(5.3x对应的是JDK8,JDK版本对应依赖版本)
  • 【如下代码是:5.3.26依赖代码,点击maven里的下载进行加载】
    <dependencies>
        
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.26</version>
        </dependency>

    </dependencies>


在这里插入图片描述

  • 加载完成后就会有这些内容,spring-context:spring上下文,spring-beans:管理对象的模块

在这里插入图片描述

1.4添加启动类

在java目录下创建一个App类(application),并加给main方法就完成了【所谓启动类】

在这里插入图片描述

2.存储Bean对象

存储Bean对象分为2步:

  1. 存储Bean之前,得现有Bean,创建一个Bean
  2. 把Bean注册到Spring容器中

2.1创建Bean

所谓Bean对象就是Java中的一个普通类,如果一个对象被使用多次,即称为Bean对象

在这里插入图片描述

2.2将Bean注册到容器中

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里的属性,id和class

把bean存入到spring中,这个bean的名字可以叫做student【建议名字能望文生义】。
id:为bean对象命名;
class:存放的这个类,如果本身是有路径的【比如在com下的spring下的demo里】,就填“com.spring.demo.Student”

在这里插入图片描述

3.从容器里取出Bean并使用

获取并使用分3步:

  1. 创建Spring上下文对象,因为所有的bean对象都交给了spring管理,所以要得到spring上下文
  2. 通过Spring上下文获取bean对象
  3. 使用bean对象

在这里插入图片描述

ApplicationContext这个接口就代表着Spring,得到这个接口需要new一个子类ClassPathXmlApplicationContext,这个子类里的配置信息必须和之前创建的xml配置文件名字一致(建议直接ctrl+C 复制xml文件名).
除了ApplicationContext还有BeanFactory也可以得到Spring对象。
context.getBean(“student”),【括号里的名称必须要和注册Bean时里的id名称一致】说明名为student这个对象已经成为了Bean对象,只有存储到Spring里才能获取到.由于getBean返回类型为Object 所以需要强转为Student,这有个缺陷:如果在注册Bean时,没有Student这个类,此时getBean获取时为null强转为Student,那么在使用bean对象时就会报错,因为压根没有Student对象

4.面试题ApplicationContext Vs BeanFactory

使用BeanFactory得到Spring上下文对象

在这里插入图片描述

用这种方式也可以获取bean对象,可以看见XmlBeanFactory有一条杠,表示为过时的,意思是官方不推荐用,但还是可以硬用的,然后在里面new一个ClassPathResource并且设置路径.

那么ApplicationContext和BeanFactory有什么区别呢?

再创建一个Teacher类,注册到Bean里.【可以自己按照上述步骤,自己创建一个Bean对象,并注册Bean到容器里】

我们把两种方法的代码只留下第1步:获取Spring对象;可以发现第1种使用ApplicationContext的方法,在第1步获取Spring对象时,就把xml中所有的Bean对象存储到了Spring容器里。【可以看运行结果的构造方法打印的init ....

BeanFactory则没有进行存储Bean对象,BeanFactory是在第2步GetBean()时才会进行存储Bean对象,属于lazy load(惰性加载),只有在使用某个Bean对象时才把对应的Bean对象存储进容器。

在这里插入图片描述
在这里插入图片描述

常见面试题:ApplicationContext VS BeanFactory

  • 从继承关系和功能方面:ApplicationContext 和 BeanFactory都是Spring容器的两个等级比较高的接口。BeanFactory是ApplicationContext 的父类,它只提供了基础的访问容器的功能。

    ApplicationContext 是BeanFactory的子类,它除了基础的访问容器的功能,还有其他特有的功能,例如:支持国际化、资源访问,以及时间传播等方面。

  • 从性能方面
    1、BeanFactory 更加轻量(耗内存少),性能低。

    ​ 2、ApplicationContext 更加重量(耗内存大),性能高。

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

5.获取指定Bean对象

获取Bean对象的方法总共有3种:

1.使用名字获取(id)

在这里插入图片描述

这样获取Bean对象有个缺陷:如果在在通过Spring上下文获取Bean对象时,在getBean方法里填写的名称与xml里注册的id 不一致,即使强制类型转换,一样会报错:”没有名为‘stu’的Bean可获得“。正确的书写:getBean里的名字一定要和id一致!!!

2.根据类型获取,此时就不需要强制类型转换了

在这里插入图片描述

该获取方法有一个缺陷:在获取Bean对象时,就不需要关注id(名字)是什么,因为此时是根据类型获取的,在获取时,到spring里寻找有没有,类型为Student的。但是如果在xml里注册了两次类型为Student的【Spring中一个类型可以存储多个实例】,id不同,此时就会报错:Student不唯一,找了两个,student和aaa。 student 和aaa都是Student 的实例,是会创建两个不同对象,并不会因为类型相同,名称不同,只创建一个对象.

在这里插入图片描述

3.根据名称和类型一起获取:此时即不需要强转也不担心Spring中一个类型存储了多个实例.【常用】

在这里插入图片描述

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。