Spring框架学习 -- 创建与使用

目录

(1) 创建spring 项目

① 创建maven项目

②添加spring框架支持

③ 添加启动项

(2) 创建 Bean对象

(3) 将Bean注入到容器

(4) 获取Bean对象

(5) 注意事项

(6) Spring的创建和使用流程图 


创作不易多多支持


 

(1) 创建spring 项目

        首先我们使用的开发工具为idea 专业版.

        想要创建一个spring项目, 首先需要使用到maven, 所以我们创建spring项目的方式和servelet类似, 可以总结为下面几个步骤:

  1. 创建一个maven项目
  2. 添加spring的框架支持
  3. 添加启动类

        下面我们来依次分析这几个步骤

① 创建maven项目

        这个想必大家都很熟, 如果不知道如何创建maven项目的可以参考我的其他文章.

②添加spring框架支持

        首先我们需要在pom.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:管理对象的模块.

        接下来配置spring设置文件, 如下:

我们在resources目录中创建文件 springConfig.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
</beans>

         然后刷新(reload)Maven项目:

        如果下载速度慢的话, 是因为maven仓库在国外, 访问速度很慢, 这个时候就需要配置国内源, 具体如何配置国内源, 大体就是在maven的setting.xml文件中设置国内源镜像结点, 具体如何操作可以自行搜索.

③ 添加启动项

        也就是添加主类, 这个和普通程序无异.

(2) 创建 Bean对象

        只有先创建Bean对象, 才能把对象注入到容器中去, 首先我们应该学习如何创建Bean对象.

        首先我们先创建一个User类如下:

public class User {
    public void sayHi() {
        System.out.println("hello, how are you?");
    }
}

        所谓的Bean对象, 其实就是java里面一个类的对象.

        然后将Bean注入到容器

(3) 将Bean注入到容器

        在我们配置好的springConfig.xml文件中的注入Bean, 如下:

         下面我们来看看springConfig.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        <bean id="user" class="org.example.User"></bean>
</beans>

        其中 一个<bean> 标签, 就代表一个bean对象, class是指的类的路径, 指明注入的是哪个类, id是这个类对象的名称, 方便于后面取出这个对象.

<beans>
 <bean id="user" class="org.example.User"></bean>
</beans>

(4) 获取Bean对象

        获取Bean对象大致可以分为下面几步:

  • 得到spring的上下文支持, 因为对象都交给spring管理了, 所以要获取注入到spring容器中的类就需要得到spring的上下文
  • 通过spring的上下文对象, 获取到指定的Bean对象
  • 使用Bean对象

        首先获取spring上下文:

public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("springConfig.xml")
                
    }
}

        其中ApplicationContext就是spring的上下文类, ClassPathXmlApplicationContext是他的具体实现类. ClassPathXmlApplicationContext中的参数为我们配置好的spring配置文件名: springConfig.xml

        除了ApplicationContext之外, 还可以使用BeanFactory类来获取spring上下文, 具体操作为:

public class Main {
    public static void main(String[] args) {
        BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("springConfig.xml"));

    }
}

        ApplicationContext 和 BeanFactory 效果是⼀样的,ApplicationContext 属于 BeanFactory 的⼦类,

        那么ApplicationContext和BeanFactory具体有什么区别? (这是一个常见的面试题)

  •  继承关系和功能方面来说: Spring容器有两个顶级的接口, 那就是BeanFactory 和ApplicationContext, 其中BeanFactory提供了基础访问容器的能力, 而ApplicationContext属于BeanFactory的子类, 它除了继承了BeanFactory的所有功能之外, 它还拥有其他独特的特性, 还添加了对国际化的支持, 资源访问支持, 以及事件传播等方面的支持
  • 从性能来说, ApplicationContext是一次性加载并初始化所有的Bean对象, 而BeanFactory是需要哪个才去加载哪个, 因此BeanFactory更加的轻量. 而ApplicationContext加载慢但是使用(这里的使用是指的取出Bean对象)非常的快速.

        然后就是如何获取Bean对象了, spring的上下文对象中提供了一个getBean方法, 用来获取指定的对象, 他的参数为一个字符串, 用来指定一个Bean对象的id  , 如下:

// 1.得到 Spring 上下⽂对象
ApplicationContext context = new ClassPathXmlApplicationContext("springcon
fig.xml");
// 2.加载某个 bean
User user = (User) context.getBean("user");

         此处我们再回过头来看看我们注入的类:

        此处的路径为: org.example.User,  springConfig.xml中的文件中注入的Bean如下:

        <bean id="user" class="org.example.User"></bean>

         可以看出这个路径和对象是一一对应的.

         获取到Bean之后, 使用Bean对象就可以像普通开发程序中那样使用类了:

        BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("springConfig.xml"));
        User user = (User)beanFactory.getBean("user");
        user.sayHi();

        -- 输出:

        需要注意的是, getBean方法返回的是Object类型, 因此使用的时候还需要强制类型转换, 将其转换为对应的类才可以使用, 或者是使用getBean的重载方法, 里面有两个参数, 一个是字符串对象, 代表要使用的Bean对象的id,  第二个参数是使用反射来获取这个对象所属的类:

        BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("springConfig.xml"));
        User user = beanFactory.getBean("user", User.class);
        user.sayHi();

        此时getBean就会直接返回get的Bean对象的类型.

        下面是其原码的定义 : 

 

(5) 注意事项

        spring配置文件的容器中注入的Bean对象的id要和getBean中的id一致:

         除此之外, 我们在获取Bean对象的时候, 其实也可以直接传入一个Bean对应的类就可以将其取出来:

       sping 配置文件如下:

<?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">
        <bean id="user" class="org.example.User"></bean>
</beans>

        main方法中来获取这个id为user的Bean对象, 但是我们getBean的时候只传入这个类, 而不是这个类的id名:

        BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("springConfig.xml"));
        User user = beanFactory.getBean(User.class);
        user.sayHi();

        运行 -- 输出如下:

        可以看出来, 可以成功取出Bean然后使用此Bean对象

        但是我们思考一下, 任何情况下都能这样获取到Bean对象吗? 显然不是, 我们传入的是对应的Bean对象的类, 因此我们传入的是类名, 但是想想, 如果我们在spring容器中注入两个相同的类对象, 但是id不同, 再次使用传入类名的情况会成功吗? 

<?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">
        <bean id="user1" class="org.example.User"></bean>
        <bean id="user2" class="org.example.User"></bean>
</beans>

        可以看到spring容器中已经被注入了两个Bean对象, 这两个Bean对象都属于User类, 我们再次去使用getBean(Class<T> var) 的方法去获取Bean对象

 

        Bean对象获取:

        BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("springConfig.xml"));
        User user = beanFactory.getBean(User.class);
        user.sayHi();

        -- 输出:

Exception in thread "main" org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.example.User' available: expected single matching bean but found 2: user1,user2
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1180)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:416)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:349)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:342)
	at org.example.Main.main(Main.java:12)

        关键报错信息展示:

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

        可以翻译一下就是:

         可以看出找到了两个Bean对象: user1 和 user2, 但是spring不知道使用哪一个, 所以报错.

(6) Spring的创建和使用流程图 

 



 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

渲染器——双端Diff算法

简单 Diff 算法利用虚拟节点的 key 属性&#xff0c;尽可能地复用 DOM 元素&#xff0c;并通过移动 DOM 的方式来完成更新&#xff0c;从而减少不断地创建和销毁DOM 元素带来的性能开销。但是&#xff0c;简单 Diff 算法仍然存在很多缺陷&#xff0c;这些缺陷可以通过双端 Diff…

[userfaultfd] 2019-BalsnCTF_KrazyNote

前言 题目不算难, 但是这代码逆向可逆死个人:) 悲悲悲 程序分析 内核版本: v5.1.9 保护: 开了 kaslr, smep, smap. 现在的题目基本都开了, 都不用看. 其中 note 模块中注册了一个 misc 设备, 其函数表中就只有 note_open 和 note_unlocked_ioctl 两个函数, 其中 note_open…

GAMES101—Lec 05~06:光栅化

目录 概念回顾&#xff08;个人理解&#xff09;光栅化1.采样2.采样出现的问题&#xff1a;走样 反走样 概念回顾&#xff08;个人理解&#xff09; 屏幕&#xff1a;在图形学中&#xff0c;我们认为屏幕是一个二维数组&#xff0c;数组里的每一个元素为一个二维像素。 光栅化…

1.8w 字详解 SQL 优化

来源&#xff1a;捡田螺的小男孩 1、MySQL的基本架构 2、SQL优化 3、explain执行计划常用关键字详解 很多朋友在做数据分析时&#xff0c;分析两分钟&#xff0c;跑数两小时&#xff1f; 在使用SQL过程中不仅要关注数据结果&#xff0c;同样要注意SQL语句的执行效率。 本文…

【阿里云】图像识别 摄像模块 语音模块

USB 摄像头模块测试及配置 一、首先将 USB 摄像头插入到 Orange Pi 开发板的 USB 接口中二、然后通过 lsmod 命令可以看到内核自动加载了下面的模块三、通过 v4l2-ctl 命令可以看到 USB 摄像头的设备节点信息为 /dev/video0四、使用 fswebcam 测试 USB 摄像头五、使用 motion …

C#期末速成推荐看的知识和免费视频

【拯救者】C#期末速成 (基础讲解整套题讲解文档下载) 4K ​ 这里讲的是【 &#x1f337;速成&#x1f337; 速成&#x1f337; 速成】版本&#xff0c;按课本章节来&#xff0c; 抽取重点&#xff0c;翻译为人话&#xff01;&#xff01;&#xff01;&#x1f49d; 文末附上 免…

Python+Selenium定位不到元素常见原因及解决办法(报:NoSuchElementException)

这篇文章主要介绍了PythonSelenium定位不到元素常见原因及解决办法(报&#xff1a;NoSuchElementException),文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值&#xff0c;需要的朋友们下面随着小编来一起学习学习吧 在做web应用的自动…

两种Deformable Attention的区别

先分别写一下流程 Deformable DETR(2020)的Deformable Attention 解释&#xff1a; Deformable Attention如下图所示K3, M3K是指每个zq会和K个offset算attention&#xff0c;M是指M个head&#xff0c; z q z_q zq​有NHW个&#xff1a; 参考点&#xff1a;reference points&am…

基于Apache部署虚拟主机网站

文章目录 Apache释义Apache配置关闭防火墙和selinux 更改默认页内容更改默认页存放位置个人用户主页功能基于口令登录网站虚拟主机功能基于ip地址相同ip不同域名相同ip不同端口 学习本章完成目标 1.httpd服务程序的基本部署。 2.个人用户主页功能和口令加密认证方式的实现。 3.…

gitlab安装以及创建用户创建组,修改密码 邮箱配置 数据备份与恢复--保姆级教学!

GitLab是一种基于Web的Git仓库管理工具&#xff0c;它允许您在组织或个人级别上创建和管理Git仓库&#xff0c;以便在一个中心位置上执行代码管理和协作工作。GitLab提供了强大的功能&#xff0c;如代码审查、问题跟踪、CI/CD、容器注册表、Wiki和持续集成等。 以下是GitLab的…

【高级网络程序设计】Week2-3 HTML

一、The Basics 1. HTML&HTML file HTMLMarkup languageHyper Text Markup LanguageHTML fileText file with markup tags.htm/.html extension Create an html file Open an editor Type: <html><head><titile><body> Save it as .html Open i…

了解:iperf网络性能测试工具

当进行网络性能测试时&#xff0c;可以使用iperf这个开源工具。iperf是一款网络测试工具&#xff0c;它能够测试TCP或UDP带宽质量&#xff0c;以及单向和双向吞吐量。使用iperf进行网络性能测试首先需要在被测试的两台计算机上安装iperf。 如何安装iperf&#xff1f; 在Debia…

日志技术logback

一&#xff0c;日志概括 二&#xff0c;日志技术的特点 三&#xff0c;日志技术的体系 三&#xff0c;入门 四&#xff0c;案例 package XinZheng;import org.slf4j.Logger; import org.slf4j.LoggerFactory;public class Main58 {//1,创建一个Logger日志对象public static fi…

泵类设备常见的5种故障及监测方法

在各种工业领域中&#xff0c;泵是一种关键设备&#xff0c;用于输送液体或气体。然而&#xff0c;泵类设备常常会面临各种故障&#xff0c;这可能导致生产停顿和生产效率下降。为了及时监测并解决这些故障&#xff0c;设备状态监测系统成为一种重要的工具。本文将介绍泵类设备…

细节决定成败——我的日志去哪了?

概述 编写本文档的目的有两点。 本周遇到了一个日志丢失的问题&#xff0c;经过分析&#xff0c;觉得挺有意思的。向大家分享一下我的分析及解决思路。应该在很多项目中都会有该问题。领导和我私下讨论过多次&#xff0c;当前的autodomain代码对文件读取的频率太高了,如何去避…

01-制作人和迈克尔杰克逊-《人月神话》中译本纠错及联想

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 2001年&#xff0c;我们翻译《人月神话》的时候&#xff0c;由于水平有限&#xff0c;译文中存在不少错误。 这些年&#xff0c;随着阅历的增长&#xff0c;在重读的时候偶尔也会有“…

msvcp120.dll缺失的解决方法与作用介绍

大家好&#xff01;我是小编。今天&#xff0c;我想和大家分享一下关于“找不到msvcp120.dll无法继续执行代码的5个解决方法”的话题。 首先&#xff0c;让我们来了解一下msvcp120.dll的作用。msvcp120.dll是Microsoft Visual C Redistributable Package的一部分&#xff0c;它…

JMM并发三大特性

并发和并行 目标都是最大化CPU的使用率 并行(parallel)&#xff1a;指在同一时刻&#xff0c;有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看&#xff0c;二者都是一起执行的。 并发(concurrency)&#xff1a;指在同一时刻只能有一条指令执行&#xff0c;…

媲美有线操作,支持4KHz响应和无线充电的游戏鼠标,雷柏VT3S上手

对于无线鼠标来说&#xff0c;操作延迟和精度对游戏操作影响很大&#xff0c;常见的游戏鼠标至少都有1KHz的回报率&#xff0c;而雷柏今年已经出了很多支持4KHz回报的鼠标了&#xff0c;像是我现在用的这款VT3S游戏鼠标&#xff0c;就搭载了旗舰级的原相3395引擎&#xff0c;支…

SpringBean的配置详解

Bean的基础配置 例如&#xff1a;配置UserDaoImpl由Spring容器负责管理 <beanid"userDao"class"com.xfy.dao.Impl.UserDaoImpl"></bean> 此时存储到Spring容器中的Bean的beanName是userDao&#xff0c;值是UserDaoImpl&#xff0c;可以根据bea…