Spring的使用

news2024/9/23 9:24:51

开篇点题:为什么要用到Spring?
参考这篇文章: http://t.csdn.cn/oR5lM

一、创建一个Maven项目

1.创建一个Maven项目

2.添加Spring依赖/框架支持

在pom.xml中添加框架的支持,xml配置如下:( 下载失败参考: http://t.csdn.cn/zUYhO

<dependencies>

//spring-context:spring 上下文
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.2.3.RELEASE</version>
    </dependency>

//spring-beans:管理对象的模块
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>5.2.3.RELEASE</version>
    </dependency>

</dependencies>

3.添加启动类

其实是非必要步骤,正常项目一般使用Tomcat,但是我们测试学习还是使用启动类方便

随便创建一个类,里面一个main方法就行,没有什么特殊含义,比如我们创建一个App类

二、存储Bean对象

bean:豆子 Enterprise Java Bean: Java的软件组件模型

1.创建一个bean

和平常创建一个类基本没啥区别

2.把Spring配置文件加入到resources中

在创建好的项目中 添加 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"
       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">
    <content:component-scan base-package="com.bit.service"></content:component-scan>
</beans>

3.将bean对象配置到spring配置文件当中

bean的id属性: 相当于一个别名/名称,区别是这个id是唯一的,不能重复
bean的class属性: 对象本身,一般是 包名+类名

三、读取Bean对象

在哪读? 在main方法中进行读取操作。

1.得到 Spring 上下文对象

对象都交给 Spring 管理了,获取对象要从 Spring 中获取,那么就得先得到 Spring 的上下文。
除了 ApplicationContext 之外,我们还可以使用 BeanFactory 来作为 Spring 的上下文。他们两种效果是一样的, ApplicationContext 属于 BeanFactory 的子类。
//1. 得到Spring对象
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");

2.获取某一个指定的 Bean 对象

在Spring中获取这个对象
//1. 得到Spring对象,传入的是xml文件
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
//2. 从Spring中取出对象
//要进行强制类型转换,getBean方法返回值是 Object
Bean bean = (Bean) context.getBean("bean");//传入的内容就是 bean 的 id

获取Bean的几种方式

① 通过Bean的id

推荐将id设置为类名的小写,便于在强制转换的时候不容易写错
Bean bean = (Bean) context.getBean("bean");//传入的内容就是 bean 的 id

② 通过Bean类型

不推荐使用,因为如果同时注入两个类名相同,会查询不到唯一的User。报错: single matching
bean but found 2:....
Bean bean = context.getBean(bean.class);//直接传入bean的类名+后缀

③ 两者都传入

将id传入进去,并且将类型传入进去,这样不易写错,如果不存在的时候,直接就是null了。没有了暴力转换的问题 .主流常用推荐方式。
Bean bean = context.getBean("bean",Bean.class);//直接传入bean的类名+后缀

3.使用 Bean 对象

//1. 得到Spring对象
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
//2. 从Spring中取出对象
//要进行强制类型转换,getBean方法返回值是 Object
Bean bean = (Bean) context.getBean("bean");//传入的内容就是 bean 的 id
//3. 使用bean对象
System.out.println(bean.sayOk());//简单的使用一下试试

如下图,可以看到能够正常打印结果。

四、ApplicationContext 和 BeanFactory

面试:请问ApplicationContext 和 BeanFactory 的区别和联系:

继承关系和功能方面来说:Spring 容器有两个顶级的接口:BeanFactory 和ApplicationContext。其中 BeanFactory 提供了基础的访问容器的能力,而 ApplicationContext属于 BeanFactory 的子类,它除了继承了 BeanFactory 的所有功能之外,它还拥有独特的特性,还添加了对国际化支持、资源访问支持、以及事件传播等方面的支持。

从性能方面来说:ApplicationContext 是一次性加载并初始化所有的 Bean 对象,而BeanFactory 是需要那个才去加载那个,因此更加轻量。BeanFactory是比较轻量化的,但是ApplicationContext是牺牲空间换取性能了,性能更高,但其实现在并不是全部加载而是根据硬件配置,根据多方面具体情况。能够几乎最大限度的找到取舍点,是比较智能的。比如资源足够的时候直接 饿汉模式,一次性加载全部。

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

五、总结

//1. 得到Spring对象,ClassPathXmlApplicationContext 属于 ApplicationContext 的子类,拥有ApplicationContext 的所有功能,是通过 xml 的配置来获取所有的 Bean 容器的。传入的参数就是xml
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
//2. 从Spring中取出对象,有三种方式,一般使用 id 和 class都传入的方法
Bean bean = context.getBean("bean",Bean.class);
//3. 使用bean对象
System.out.println(bean.sayOk());

通过这个代码的实现,再回顾上一篇博客http://t.csdn.cn/pkvz2

  • 就会有更加深刻的理解,比如xml的文件命名是随意的,因为只需要传入到ClassPathXMLApplicationContext的名字相同就可以(通常命名为 spring-config.xml)

  • 而Spring其实就是一种Ioc(控制反转)的思想,DI(依赖注入)实现的。提现到代码就是 直接从Spring容器中取出对象,不再进行new的方法来实现 低耦合。

  • 而这种 每个类都需要在xml中声明标注id和class的方法其实还是比较麻烦的,是几年前的旧方法了,后面还会有更加方便的方式。

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

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

相关文章

设计模式_自定义Spring框架(IOC)

设计模式_自定义Spring框架&#xff08;IOC&#xff09; 笔记整理自 黑马程序员Java设计模式详解&#xff0c; 23种Java设计模式&#xff08;图解框架源码分析实战&#xff09; Spring使用回顾 自定义spring 框架前&#xff0c;先回顾一下 Spring 框架的使用&#xff0c;从而分…

acwing基础课——快速幂

由数据范围反推算法复杂度以及算法内容 - AcWing 常用代码模板4——数学知识 - AcWing 基本思想&#xff1a; 求一个数的n次时&#xff0c;我们的时间复杂度为O(n),当n特别大时&#xff0c;效率会很低可能超时&#xff0c;此时我们就需要运用到快速幂&#xff0c;将我们的时间…

基于PHP和MySQL的新闻发布系统——【功能优化】

前言 2023年第一篇文章&#xff0c;祝大家在新的一年里“卯”足干劲&#xff0c;在技术上 “兔”飞猛进&#xff01; 上一篇文章 基于PHP和MySQL的新闻发布系统 给大家介绍了制作一个新闻发布系统的主要功能的实现&#xff0c;在文章的末尾还提出了一些需要完善的方面。那么…

Vue3【style-scoped、style-module、类和内联样式、props、练习】

文章目录style-scopedstyle-module类和内联样式props练习style-scoped 可以直接通过style标签来编写样式&#xff0c; 如果直接通过style标签写样式&#xff0c;此时编写的样式是全局样式会影响到所有的组件 可以为style标签添加一个scoped属性&#xff0c;这样样式将成为局部…

为什么会有右值引用?(移动构造、移动赋值)

目录 1、左值引用的缺陷 2、移动构造&#xff1a;解决临时对象的深拷贝 3、拓展&#xff1a;移动赋值 1、左值引用的缺陷 左值引用作为函数参数传递&#xff0c;减少了参数拷贝&#xff1b;但是作为函数返回值&#xff0c;并不适用于所有场景&#xff0c;比如要返回一个临…

Linux——innode

目录 回顾缓冲区 标准错误流的理解 文件系统 Inode VS 文件名 创建/删除/查看文件系统做了什么 软硬链接 动静态库 习题 回顾缓冲区 关掉1&#xff0c;log.txt中没文件是因为&#xff0c;字符串在缓冲区当中&#xff0c;缓冲区还没刷新&#xff0c;我们把fd给关了…

堆的实现及应用

下面用C语言介绍堆的实现以及应用 文章目录1. 堆的简介2. 堆的实现HeapInitHeapDestroyHeapPushHeapPop3. 堆的应用堆排序TopK问题1. 堆的简介 堆是一颗完全二叉树。这里所说的堆是一种非连续的数据结构&#xff0c;与操作系统内存分布的堆是两回事&#xff0c;它们没有任何联…

金融帝国实验室(Capitalism Lab)官方中文汉化包下载(v4.03)

<FCT汉化小组>Vol.001号作品 ————————————— ◎作品名称&#xff1a;金融帝国实验室&#xff08;CapLab&#xff09;官方汉化包 ◎汉化作者&#xff1a;FCT汉化小组&#xff08;Enlight Software认证&#xff09; ◎发布版本&#xff1a;CapLab Simplifi…

POJ 1845 Sumdiv题解(C++ 整数惟一分解定理+分治法求等比数列之和+快速幂)

文章目录整数惟一分解定理分治法求等比数列和完整代码传送门&#xff1a; POJ 1845 SumDiv 整数惟一分解定理 任何一个大于1的整数n都可以分解成若干个质因数&#xff08;素因数&#xff09;的连乘积&#xff0c;如果不计各个素因数的顺序&#xff0c;那么这种分解是唯一的&a…

王者荣耀入门技能树

前言 最近在学习技能树&#xff0c;我也试着写一写技能树&#xff0c;放松一下。 这里附上一张可爱的兔兔应景。仔细看&#xff0c;后边题目会提到&#xff0c;哈哈。 职业 以下哪个不属于王者荣耀中的职业&#xff1a; 射手法师辅助亚瑟 技能 以下哪个技能可以加快打野…

春节假期后,如何快速让员工恢复上班的元气和状态?

每当假期过后&#xff0c;总有一些员工无法快速恢复工作状态&#xff0c;团队的氛围也很难一下子热起来。而春节假期既是长假&#xff0c;又是过节氛围最浓厚的假期&#xff0c;节后返工的涣散问题自然更明显一些。但对于服装店铺来说&#xff0c;年后开工正处于旺季&#xff0…

【Vue】我的尚品汇项目笔记---20230109~20230120

014之前可参考官方笔记 https://blog.csdn.net/weixin_43424325/article/details/121684101 015-axios二次封装 api/index.js 设定 //当前模块&#xff0c;API进行统一管理&#xff0c;即对请求接口统一管理 import requests from "/api/request";//首页三级分类…

通达信插件获取并存储通达信商品指数的实时数据

一、引子 通达信商品指数一共有23个&#xff0c;如下图所示&#xff1a; 如果想获取历史数据&#xff0c;只需要通过通达信的数据下载和导出功能即可&#xff0c;现在我们需要获取这23个指数的实时数据&#xff0c;通过导出功能就没有办法了。 在最初的阶段&#xff0c;考虑的…

微服务自动化管理【IDEA使用Docker插件进行一键部署】

本章目标 IDEA使用Docker插件实现springboot项目的一键部署 要开两个虚拟机 server registry server上进行操作 Docker开启远程api端口(注意这种配置方式只适用于开发和学习&#xff0c;在公共网络中不要这样配置&#xff0c;容易引发安全问题) 默认情况下dokcer是不支持远程…

linux基本功系列之find命令实战

文章目录前言&#x1f680;&#x1f680;&#x1f680;一. find命令介绍二. find常用参数及语法格式三. 示范案例3.1 查找符合文件名规则的文件3.2 根据文件类型类查找文件3.3 按照更改时间或访问时间等查找文件3.4 查找并执行相应的命令3.5 按照文件大小来查找3.6 按照文件所有…

启动hive报错no hbase in

启动hive报错no hbase in 将hdfs和yarn都启动成功之后&#xff0c;启动hive&#xff0c;如下所示&#xff1a;[atguiguhadoop102 conf]$ cd /opt/module/hive/ [atguiguhadoop102 hive]$ bin/hive报错信息如下which: no hbase in (/usr/local/bin:/usr/bin:/usr/local/sbin:/us…

C++ · 类和对象 · 02 | 类的6个默认成员函数

啊我摔倒了..有没有人扶我起来学习.... &#x1f471;个人主页&#xff1a;《CGod的个人主页》\color{Darkorange}{《CGod的个人主页》}《CGod的个人主页》交个朋友叭~ &#x1f492;个人社区&#xff1a;《编程成神技术交流社区》\color{Darkorange}{《编程成神技术交流社区》…

【操作系统】—— 如何安装双系统与多系统(带你快速了解)

&#x1f4dc; “作者 久绊A” 专注记录自己所整理的Java、web、sql等&#xff0c;IT技术干货、学习经验、面试资料、刷题记录&#xff0c;以及遇到的问题和解决方案&#xff0c;记录自己成长的点滴。 &#x1f341; 操作系统【带你快速了解】对于电脑来说&#xff0c;如果说…

博客系统项目的自动化测试

作者&#xff1a;~小明学编程 文章专栏&#xff1a;测试开发 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 目录 博客界面 测试用例 界面测试 功能测试 性能测试 兼容性测试 易用性测试 安全性测试 ​编辑自动化测试 登录界面的测试 界面文字模块 测…

ubuntu使用教程与常用命令

ubuntu使用教程 一、 Ubuntu简介 Ubuntu&#xff08;乌班图&#xff09;是一个基于Debian的以桌面应用为主的Linux操作系统&#xff0c;据说其名称来自非洲南部祖鲁语或科萨语的“ubuntu”一词&#xff0c;意思是“人性”、“我的存在是因为大家的存在”&#xff0c;是非洲传…