Spring学习(二)(Spring创建和使用)

news2024/11/25 14:30:05

经过前⾯的学习我们已经知道了,Spring 就是⼀个包含了众多⼯具⽅法的 IoC 容器。既然是容器那么 它就具备两个最基本的功能: 将对象(Bean)存储到容器(Spring)中; 从容器中将对象取出来。那么该怎么将Bean存储的Spring以及再将其拿出来使用呢??别着急其实很简单,只需要跟着学习就可以掌握。

目录

1. 创建Spring项目

 1.1 创建一个Maven项目

1.2 添加Spring依赖(Maven国内源)

 1.3 添加 Spring 框架⽀持

1.4 添加启动类

 2.存储Bean对象

 2.1 创建Bean

2.2 将Bean注册到容器当中

 3. 获取并使用Bean对象

 3.1 创建Spring上下文

 3.3 使用Bean

4.总结


1. 创建Spring项目

接下来使⽤ Maven ⽅式来创建⼀个 Spring 项⽬,创建 Spring 项⽬和 Servlet 类似,总共分为以下 3 步:

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

 1.1 创建一个Maven项目

按照下面的截图操作即可。

1.2 添加Spring依赖(Maven国内源)

这两个都要设置。前者是当前文件,后者是以后新建文件配置。

 然后找到settings.xml

我的在C:\Users\用户名\.m2\下面,打开settings.xml。在<mirrors>里面加上下面的配置代码。

<!-- 阿里云仓库 -->
        <mirror>
            <id>alimaven</id>
            <mirrorOf>central</mirrorOf>
            <name>aliyun maven</name>
            <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
        </mirror>

 1.3 添加 Spring 框架⽀持

在项⽬的 pom.xml 中添加 Spring 框架的⽀持,xml 配置如下:

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.24.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.4 添加启动类

我们刚才创建好的项目此时应该已经成功创建,在java文件下创建一个启动类,包含main方法即可:

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

    }
}

 2.存储Bean对象

既然一直在说Spring是一个包含众多工具的IoC容器,现在我们的Spring项目也创建好的,那么怎么将Bean对象存进Spring呢??听起来十分的高大上,其实也是很简单的套路。存储Bean可以分为两步:

  • 1. 存储Bean之前,我们必须得现有Bean啊,因此先要创建一个Bean。
  • 2. 将创建的Bean注册到Spring容器之中。

 2.1 创建Bean

Bean,听起来很高级,其实就是Java中的一个普通的对象,我们可以简单实现一个:

public class Student {
    public Student() {
        System.out.println("Student无参构造");
    }

    public void play(){
        System.out.println("我喜欢打篮球!");
    }
}

2.2 将Bean注册到容器当中

在创建好的项⽬中添加 Spring 配置⽂件 spring-config.xml,将此⽂件放到 resources 的根⽬录下, 如下图所示:(鼠标右键新建file,文件名称spring-config.xml)

 这里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中了,怎么存呢?先介绍通过配置文件的方式来存储。具体的操作就是在刚才的配置文件中的<beans>中添加:

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

 3. 获取并使用Bean对象

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

  • 1. 得到 Spring 上下⽂对象,因为对象都交给 Spring 管理了,所以获取对象要从 Spring 中获取,那 么就得先得到 Spring 的上下⽂。
  • 2. 通过 Spring 上下⽂,获取某⼀个指定的 Bean 对象。
  • 3. 使⽤ Bean 对象。

 3.1 创建Spring上下文

这里介绍两种方式来创建Spring上下文。

第一种就是使用ApplicationContext,实现代码如下:(ApplicationContext是接口 ClassPathXmlApplicationContext是它的一个实现类。)

ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
第二种就是使⽤ BeanFactory 来作为 Spring 的上下⽂,如下代码所示:
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));

这里第二种方式其实并不推荐,这是早期的用法,现在官方已经不推荐使用了,IDEA使用时会看到已经被划线了。既然提到了两种方式必然要做出比较,这也是一道十分常见的面试题。

ApplicationContext VS BeanFactory(常⻅⾯试题)

  • 继承关系和功能⽅⾯来说:Spring 容器有两个顶级的接⼝:BeanFactory 和 ApplicationContext。其中 BeanFactory 提供了基础的访问容器的能⼒,⽽ ApplicationContext 属于 BeanFactory 的⼦类,它除了继承了 BeanFactory 的所有功能之外,它还拥有独特的特性, 还添加了对国际化⽀持、资源访问⽀持、以及事件传播等⽅⾯的⽀持(这几个支持通过后面的学习应该会提到,目前不展开说明)。
  • 从性能⽅⾯来说:ApplicationContext 是⼀次性加载并初始化所有的 Bean 对象,⽽ BeanFactory 是需要那个才去加载那个,因此更加轻量。

 第一点很好理解,BeanFactory 是很早之前使用的接口,现在使用的ApplicationContext 是继承自BeanFactory所以除了具有父类的特点之外还具有自己的独特的特性。那么第二点ApplicationContext 是⼀次性加载并初始化所有的 Bean 对象,⽽ BeanFactory 是需要那个才去加载那个,因此更加轻量怎么来理解呢??之后会从代码角度展示出来它们的区别。

3.2 获取指定的Bean对象

// 1.得到Spring  ApplicationContext是接口 ClassPathXmlApplicationContext是它的一个实现类
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

        // Student student1 = new Student();  传统方式----缺点已经讲过

        // 2. 从Spring中获取Bean对象
        //Student student = (Student)context.getBean("student"); // 根据名称获取 十分不推荐 而且使用了强转
        //Student student = context.getBean(Student.class); // 根据类型获取 只有当此种类型的Bean有且只有一个的时候才可以使用
        Student student = context.getBean("student", Student.class); // 根据名称和类型来获取对象

注意:

1. 通过context.getBean()来获取Bean的时候,Bean的ID要和配置文件里的ID一一对应:

 2. 获取Bean的方法有很多这里提供了三种,他们是重载的关系,根据不同的场景来使用,当然更推荐第三种。第二种是通过类名来获取,当只存一个指定类的时候才可以使用,否则就会报错。第三种是通过名称+类型,这种方式是最靠谱最推荐的方式。如果一类类型的对象存入为两个不同的id使用Student student = context.getBean(Student.class)的时候就会报错。

3. 当一个类型被以不同的id注册进Spring时,两个Bean是同一个引用吗??比如

 答案是:不是同一个引用。他们分别存放,是不同的地址。

Student student = context.getBean("student", Student.class);
Student stu = context.getBean("stu", Student.class);
System.out.println("stu == student??:"+(stu==student))

运行结果是false。

 3.3 使用Bean

这里就是为了验证我们的Bean对象是否成功的被我们存进Spring中并且可以成功使用,因此不用设计太多的逻辑结构,直接利用我们获取到的Bean对象来调用它的共有方法,以此来验证是否成功。

student.play();

运行我们的APP:

 此时发现的确成功的进行了Bean的存储和获取使用,在这里我们没有通过new的方式来实例化对象,之前也讲过这样new的方式来实例化的花会有诸多弊端。详情可以移步前一节的博客了解。博客链接。

现在我们存储和获取使用一套流程可以完整的走下来了,但是之前提到的ApplicationContext VS BeanFactory的问题还没有用代码来展示,现在可以用代码展示。怎么来设计代码呢?先看我们要证明的东西:ApplicationContext 是⼀次性加载并初始化所有的 Bean 对象,⽽ BeanFactory 是需要那个才去加载那个。这样我们可以再配置文件中再存储一个Teacher类,然后再通过两种方式获取Student类只使用Student看看他们的区别。代码如下:

配置文件:

<?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">
    <!-- 将com.spring.demo.Student类存储到Spring容器中,他的名字叫做student -->
    <bean id="student" class="com.spring.demo.Student"></bean>
   <!-- <bean id="stu" class="com.spring.demo.Student"></bean>-->

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

Studeant类和Teacher类:

public class Student {
    public Student() {
        System.out.println("Student无参构造");
    }

    public void play(){
        System.out.println("我喜欢打篮球!");
    }
}
public class Teacher {
    public Teacher() {
        System.out.println("teacher 无参数构造");
    }
    public void play(){
        System.out.println("我喜欢打高尔夫!");
    }
}

App:(Application方式获取)

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.play();
    }
}

App2:(BeanFactory方式获取)

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"); // 根据名称获取
        //Student student = beanFactory.getBean(Student.class); // 根据类型获取

        //3. 使用bean
        student.play();
    }
}

分别运行发现:

并且Application方式在

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

这一行代码运行后就会直接初始化所有的Bean对象,可以自己实验一下,将后面的代码注释掉也会执行Student和Teacher的构造方法。

4.总结

1. 操作容器之前,先要有容器,所以先要得到容器。

2. 存对象

  • a. 创建 Bean(普通类)。
  • b. 将 Bean 注册(配置)到 spring-confing.xml 中。

3. 取对象

  • a. 得到 Spring 上下⽂,并读取到 Spring 的配置⽂件。
  • b. 获取某⼀个 Bean 对象。
  • c. 使⽤ Bean 对象。

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

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

相关文章

单片机系统架构

单片机系统架构 单片机概述 微型计算机的组成 微处理器、存储器加上I/O接口电路组成微型计算机。各部分通过地址总线&#xff08;AB&#xff09;、数据总线&#xff08;DB&#xff09;和控制总线&#xff08;CB&#xff09;相连。 微型计算机的应用形态 ​ 从应用形态上&am…

python数据可视化-日期折线图画法

引入 什么是折线图&#xff1a; 折线图是排列在工作表的列或行中的数据可以绘制到折线图中。折线图可以显示随时间&#xff08;根据常用比例设置&#xff09;而变化的连续数据&#xff0c;因此非常适用于显示在相等时间间隔下数据的趋势。 在折线图中&#xff0c;类别数…

【vue】- 简易版筛选组件可展开/收起

仅做记录&#xff0c;未整理格式 css部分未完全&#xff0c;每个筛选条件为固定宽度 实现效果 单行筛选条件时不触发更多按钮&#xff0c;且做占位处理 多行筛选条件时默认收起 同时设定最大/最小宽度并监听该组件宽度变化 filter.vue组件 <template><div :cla…

c#调用c++ dll,Release版本内存访问错误

最近遇到个比较经典的案例&#xff0c;在c#中调用yara进行文件检测&#xff0c;yara是c编写的一个非常强大库&#xff0c;github有个大佬用c#对其进行了封装&#xff0c;使其能在跨平台下&#xff0c;只需编译yara的so或dll就能直接跑。但总是在Release版本下时不时就崩溃&…

Hadoop 组成

4 Hadoop 优势(4 高) 1)高可靠性:Hadoop底层维护多个数据副本,所以即使Hadoop某个计算元素或存储出现故障,也不会导致数据的丢失。 2)高扩展性:在集群间分配任务数据,可方便的扩展数以千计的节点。 3)高效性:在MapReduce的思想下,Hadoop是并行工作的,以加快任务…

低代码平台在ERP软件中的作用

很多人认为 低代码开发平台的出现颠覆了传统的软件开发模式&#xff0c;对软件开发行业造成冲击&#xff0c;其实低代码开发平台的出现只是提高了软件开发的效率&#xff0c;并不是要颠覆软件开发的模式。低代码平台在erp软件开发中的作用还是比较明显的。下面一起来了解一下相…

Postman Mock快速入门

目录 前言&#xff1a; 1.Mock简介 1.1 Mock定义 1.2 Mock目的 1.3 Mock意义 1.4 Mock服务 2. Postman 创建Mock服务 2.1 创建Mock服务 2.2 Postman创建Mock服务 2.2.1 Postman 创建Mock服务器参数 2.2.2 Postman创建Mock步骤 3.访问Postman Mock服务 前言&#xf…

css基础知识十三:怎么理解回流跟重绘?什么场景下会触发?

一、是什么 在HTML中&#xff0c;每个元素都可以理解成一个盒子&#xff0c;在浏览器解析过程中&#xff0c;会涉及到回流与重绘&#xff1a; 回流&#xff1a;布局引擎会根据各种样式计算每个盒子在页面上的大小与位置重绘&#xff1a;当计算好盒模型的位置、大小及其他属性…

MySQL-SQL全部锁详解(下)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

老PM,到底在牛什么?

早上好&#xff0c;我是老原。 “成长为一名优秀的项目经理。”相信这是每一个刚入行的项目经理都会立的flag。 对于项目经理来说&#xff0c;这是一个能力和经验并重的岗位&#xff0c;你应该也经常听人说&#xff0c;这项目经理是一个越老越吃香的职业。 就拿我自己来说&a…

【java】HashMap扩容机制详解

文章目录 JDK1.7下的扩容机制JDK1.8下的扩容机制 JDK1.7下的扩容机制 JDK1.7下的resize()方法是这样的&#xff1a; void resize(int newCapacity) { Entry[] oldTable table; int oldCapacity oldTable.length; if (oldCapacity MAXIMUM_CAPACITY) { threshold Integer.…

零样本视频生成无压力,基于飞桨框架实现Text2Video-Zero核心代码及依赖库

项目背景 继 AI 绘画之后&#xff0c;短视频行业正迎来 AI 智能创作的新浪潮。AI 智能创作正在各个方面为创作者和用户带来新的体验和价值。AI 动漫视频、AI 瞬息宇宙、AI 视频风格化等诸多创作功能不仅为视频内容创作提供了全新灵感&#xff0c;而且大大降低了用户创作的门槛…

SpringMVC原理分析 | 数据处理:ModelAndView

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 重定向和转发 ModelAndView 设置ModelAndView对象&#xff0c;根据view的名称、视图解析器跳转到指定的页面 页面&#xff1a;{视图解析器前缀} viewName {视图解析器…

git常用命令之命令集

15. 命令集 场景1. 构造1个文件的10个commit 命令作用for i in {1..10}; do date >> 66.txt && git add . && git commit -sm "update"; done自证 场景2. 构造10个文件 命令作用for i in {1..10}; do date >> "file_$i.log&quo…

Quiz 7: Files | Python for Everybody 配套练习_解题记录

文章目录 课程简介Quiz 7: Files 单选题&#xff08;1-10&#xff09;编程题Exercise 7.2 课程简介 Python for Everybody 零基础程序设计&#xff08;Python 入门&#xff09; This course aims to teach everyone the basics of programming computers using Python. 本课程…

项目——学生信息管理系统1

目录 创建项目 1. 修改Eclipse的编码为UTF-8,具体参考给的文档 1.1 设置代码自动保存 2. 创建Java项目 分包 添加数据库驱动jar包依赖 复制数据库驱动jar包到lib目录下 添加依赖 创建登陆页面 在 org.xingyun.view 包下创建 LoginFrm 选择 WindowBuilder下的 Swing D…

oracle 重复启动监听程序故障

又是一起 oracle 无法连接问题&#xff0c;检查配置都是正常的。 原来是碰到一个oralce的bugl了。 还真就是这个问题&#xff0c;子进程一kill掉&#xff0c;就恢复了。

微服务实战项目-学成在线-课程发布模块

学成在线-课程发布模块 1 模块需求分析 1.1 模块介绍 课程信息编辑完毕即可发布课程&#xff0c;发布课程相当于一个确认操作&#xff0c;课程发布后学习者在网站可以搜索到课程&#xff0c;然后查看课程的详细信息&#xff0c;进一步选课、支付、在线学习。 下边是课程编辑…

视频解说小程序看点小程序搭建上线,流量主对接实现广告收益

什么是视频解说小程序&#xff1f; 影视剪辑和解说&#xff0c;我们都知道有这类的抖音号&#xff0c;这时候就用到我们小程序了&#xff0c;流量主产生了收益。把视频解说上传到小程序&#xff0c;设置为广告观看&#xff0c;这样引导用户去小程序看&#xff0c;就产生一个广告…

(一)等值线 (Spatial Analyst)

等值线 (Spatial Analyst) 1.摘要 根据栅格表面创建等值线(等值线图)的线要素类。 等值线是用于连接各类等值点(如高程、温度、降雨量、污染或大气压力)的线。线的分布显示表面值的变化方式。值的变化量越小,线的间距就越大。值上升或下降得越快,线的间距就越小。 2.…