当前位置: 首页 > news >正文

从 Spring 的创建到 Bean 对象的存储、读取

目录

创建 Spring 项目:

1.创建一个 Maven 项目:

 2.添加 Spring 框架支持:

3.配置资源文件:

4.添加启动类:

Bean 对象的使用:

1.存储 Bean 对象:

1.1 创建 Bean:

1.2 存储 Bean 到容器内:

2.获取 Bean 对象:

2.1 创建 Spring 上下文:

2.2 获取指定 Bean 对象:

ApplicationContext 和 BeanFactory 的区别:

ApplicationContext:

BeanFactory:

总结:

三种常用的 getBean :

根据 id 获取:

对象类型获取:

id + 对象类型获取:

总结



创建 Spring 项目:

        创建一个 Spring 项目分为四步:

  1.  创建一个普通 Maven 项目;
  2.  添加 Spring 框架支持;
  3.  配置资源文件;
  4.  添加启动类;

1.创建一个 Maven 项目:

前提声明:个人尽量使用 idea2021,因为2022版之后的相关插件是收费的;

 2.添加 Spring 框架支持:

        将这段配置依赖添加到 Spring 项目的 pom.xml 文件中:刷新下载到本地仓库

    <dependencies><!-- https://mvnrepository.com/artifact/org.springframework/spring-context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.24</version></dependency></dependencies>

3.配置资源文件:

        在 resources 包中创建一个 xxx.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"><content:component-scan base-package="com.spring.demo"></content:component-scan>
</beans>

4.添加启动类:

        在 java 文件下创建一个类,专门用来启动测试:

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


Bean 对象的使用:

1.存储 Bean 对象:

        原理:Spring 框架有 spring-context 来管理 spring 上下文,还有 spring-beans 来管理对象的模块;

        什么是 Bean对象?项目中重复使用的对象都可以视为 Bean 对象,存储 Bean 对象也就是把项目所需的对象放入 Spring 容器中;

1.1 创建 Bean:

        现在创建了一个普通的 Student 类,其自带一个 sayHi() 方法,由于以后我还要频繁使用这个类,那么就可以将其视为一个 Bean:

public class Student {public void sayHi() {System.out.println("hi student");}
}

1.2 存储 Bean 到容器内:

        存储bean也相当于“声明”的作用,先打开刚才在 resources包里创建的 spring-config.xml 配置文件:

存储 Bean 的格式:

<bean id="" class=""><bean>

如果 bean 在多级包内,class属性设置时就要注意路径;

现在将 Student 这个类作为 bean 添加进去:注意路径

<!--    将Bean对象(com.spring.demo.com.spring.demo.Student)
存到 Spring容器中,它的 id 为 student--><bean id="student" class="com.spring.demo.Student"></bean>

2.获取 Bean 对象:

        获取 bean 对象分为三步:

  1. 得到 Spring 上下文对象:因为 Bean 对象交给了 Spring 来管理,所以得先得到 Spring 才能有权限操作容器;
  2. 通过 Spring 上下文获取容器内的 Bean 对象;
  3. 使用 Bean 对象;

2.1 创建 Spring 上下文:

        这里需要了解两个接口:ApplicationContext BeanFactory

        语法:

ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
 BeanFactory beanFactory =new XmlBeanFactory(new ClassPathResource("spring-config.xml"));

2.2 获取指定 Bean 对象:

        这里借助 ApplicationContext 来演示:

public class School {public static void main(String[] args) {// 1.得到 Spring 上下文ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");// 2.获取指定 Bean 对象Student student = (Student) context.getBean("student");// 3.使用 Bean 对象student.sayHi();}
}

至此 Spring 的创建、Bean 的存储和获取已经做了基本介绍;


ApplicationContext 和 BeanFactory 的区别:

        在上述代码中再添加一个 Teacher 类作为一个新的 Bean,添加到容器中:

public class Teacher {public Teacher() {System.out.println("do teacher init");}public void sayHi() {System.out.println("hi teacher");}
}
    <bean id="student" class="com.spring.demo.Student"></bean><bean id="teacher" class="com.spring.demo.Teacher"></bean>

此时我们的容器中有两个 Bean:一个是Student、一个是Teacher;

        分别使用 ApplicationContext 和 BeanFactory 来操作:都只尝试获取容器中 Student 这个 Bean,来看看它们的效果有什么不同.

ApplicationContext:

        原代码不用变: 

public class School {public static void main(String[] args) {// 1.得到 Spring 上下文ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");// 2.获取指定 Bean 对象Student student = (Student) context.getBean("student");// 3.使用 Bean 对象student.sayHi();}
}

BeanFactory:

        创建一个新的启动类:School2,获取 Spring 上下文和 ApplicationContext 不一样,其他也不用变。

public class School2 {public static void main(String[] args) {// 1.使用 BeanFactory 来获取 Spring 上下文 BeanFactory beanFactory =new XmlBeanFactory(new ClassPathResource("spring-config.xml"));// 2. 从 Spring 容器中获取 bean 对象Student student = (Student) beanFactory.getBean("student");student.sayHi();}
}

         对比运行结果,明明它们两个都时获取和使用 id 为 “student” 的 Bean 对象,ApplicationContext 对于上下文却把 Teacher 也拿了出来,BeanFactory 只拿到了 Student;

总结:

相同点:

  • ApplicationContext 和 BeanFactory 都是获取容器中Bean对象的;

不同点:

  •  ApplicationContext 是一次性加载并初始化容器里的所有 Bean 对象(饿汉模式),而 BeanFactory 是需要哪个才去加载哪个(懒汉模式);
  • ApplicationContext 其实是 BeanFactory 的子类,子类不仅继承了父类的所有功能外,还拥有自己独特的功能;而ClassPathXmlApplicationContext 又属于 ApplicationContext的子类;
  • BeanFactory 也是最早被设计出来的,设计之初由于机器硬件造价昂贵,就只加载需要的对象;而 ApplicationContext 是之后设计出来的,人们为了尽可能提高效率,就想到一次性加载出所有 Bean 对象;


三种常用的 getBean :

        getBean() 方法有很多重载,对比以下常用的三种:

  1. 根据 id 获取;
  2. 对象类型获取;
  3. id,对象类型获取;

根据 id 获取:

    <bean id="student" class="com.spring.demo.Student"></bean><bean id="teacher" class="com.spring.demo.Teacher"></bean>
        // 2.获取指定 Bean 对象Student student = (Student) context.getBean("student");Teacher teacher = (Teacher) context.getBean("teacher");

这种方式显然比较粗暴,不可取,存在强转;另外如果通过id获取的对象为null,也会出现异常;

对象类型获取:

    <bean id="student" class="com.spring.demo.Student"></bean><bean id="teacher" class="com.spring.demo.Teacher"></bean>
        // 2.获取指定 Bean 对象Student student = context.getBean(Student.class);Teacher teacher = context.getBean(Teacher.class);

这种方式虽然不粗暴,但存在一个问题:

        当同一类型的 Bean 在容器中注册了两次,编译器就会报 NoUniqueBeanDefinitionException 异常;

id + 对象类型获取:

        这种方式安全性较高;

    <bean id="student" class="com.spring.demo.Student"></bean><bean id="student2" class="com.spring.demo.Student"></bean><bean id="teacher" class="com.spring.demo.Teacher"></bean>
        // 2.获取指定 Bean 对象Student student = context.getBean("student2",Student.class);Teacher teacher = context.getBean("teacher",Teacher.class);

思考:
        既然刚才提到了同一个类型可能在容器中注册多次,虽然它们只是 id 不同,那它们指向的是否为同一块空间呢?

        代码验证一下:

    <bean id="student" class="com.spring.demo.Student"></bean><bean id="student2" class="com.spring.demo.Student"></bean><bean id="teacher" class="com.spring.demo.Teacher"></bean>
public class School {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");Student student1 = context.getBean("student", Student.class);Student student2 = context.getBean("student2", Student.class);System.out.println(student1 == student2);System.out.println(student1.equals(student2));}
}

于是证明它们本身就是不同的对象的引用;


总结:

Spring 项目的创建及 Bean 的基本使用流程:

相关文章:

从 Spring 的创建到 Bean 对象的存储、读取

目录 创建 Spring 项目&#xff1a; 1.创建一个 Maven 项目&#xff1a; 2.添加 Spring 框架支持&#xff1a; 3.配置资源文件&#xff1a; 4.添加启动类&#xff1a; Bean 对象的使用&#xff1a; 1.存储 Bean 对象&#xff1a; 1.1 创建 Bean&#xff1a; 1.2 存储 B…...

【一文吃透归并排序】基本归并·原地归并·自然归并 C++

目录 1 引入情境基本归并排序实现 C 2 原地归并排序2-1 死板的解法2-2 原地工作区2-3 链表归并排序 3 自底向上归并排序4 两路自然归并排序4-1 形式化描述4-2 代码实现 1 引入情境 归并思想&#xff1a;假设有两队小孩&#xff0c;都是从矮到高排序&#xff0c;现在通过一扇门后…...

读《Spring Boot 3核心技术与最佳实践》有感

我是谁&#xff1f; &#x1f468;‍&#x1f393;作者&#xff1a;bug菌 ✏️博客&#xff1a;CSDN、掘金、infoQ、51CTO等 &#x1f389;简介&#xff1a;CSDN/阿里云/华为云/51CTO博客专家&#xff0c;C站历届博客之星Top50&#xff0c;掘金/InfoQ/51CTO等社区优质创作者&am…...

板子短路了?

有段时间没更新了&#xff0c;主要是最近有点忙&#xff0c;当然也因为有点“懒”。 做这行业的都知道&#xff0c;下半年都是比较忙的&#xff0c;相信大家也是&#xff01; 相信做硬件的小伙伴们&#xff0c;遇到过短路的板子已经不计其数了。 短路带来的危害&#xff1a;…...

一行代码绘制高分SCI限制立方图

一、概述 Restricted cubic splines (RCS)是一种基于样条函数的非参数化模型&#xff0c;它可以可靠地拟合非线性关系&#xff0c;可以自适应地调整分割结点。在统计学和机器学习领域&#xff0c;RCS通常用来对连续型自变量进行建模&#xff0c;并在解释自变量与响应变量的关系…...

spring 容器结构/机制debug分析--Spring 学习的核心内容和几个重要概念--IOC 的开发模式--综合解图

目录 Spring Spring 学习的核心内容 解读上图: Spring 几个重要概念 ● 传统的开发模式 解读上图 ● IOC 的开发模式 解读上图 代码示例—入门 xml代码 注意事项和细节 1、说明 2、解释一下类加载路径 3、debug 看看 spring 容器结构/机制 综合解图 Spring Spr…...

excel实战小测第四

【项目背景】 本项目为某招聘网站部分招聘信息&#xff0c;要求对“数据分析师”岗位进行招聘需求分析&#xff0c;通过对城市、行业、学历要求、薪资待遇等不同方向进行相关性分析&#xff0c;加深对数据分析行业的了解。 结合企业真实招聘信息&#xff0c;可以帮助有意转向数…...

什么是SpringBoot自动配置

概述&#xff1a; 现在的Java面试基本都会问到你知道什么是Springboot的自动配置。为什么面试官要问这样的问题&#xff0c;主要是在于看你有没有对Springboot的原理有没有深入的了解&#xff0c;有没有看过Springboot的源码&#xff0c;这是区别普通程序员与高级程序员最好的…...

基于IC5000烧录器使用winIDEA烧写+调试程序(S32K324的软件烧写与调试)

目录 一、iSYSTEM简介二、如何使用iSYSTEM winIDEA烧写调试程序2.1 打开winIDEA&#xff1a;2.2 新建一个Workspace;2.3 硬件配置:2.4 选择CPU芯片型号&#xff1a;2.5 加载烧写文件&#xff1a;2.6 开始烧录程序&#xff1a;2.7 程序调试Debug&#xff1a;2.7.1 运行程序&…...

新手开始学【网络安全】要怎么入门?

前言&#xff1a;网络安全如何从零开始学习&#xff0c;少走弯路&#xff1f; 目录&#xff1a; 一&#xff0c;怎么入门&#xff1f; 1、Web 安全相关概念&#xff08;2 周&#xff09;2、熟悉渗透相关工具&#xff08;3 周&#xff09;3、渗透实战操作&#xff08;5 周&…...

Linux指令 快捷键

热键 上一次我们说到了linux的基本指令&#xff0c;这次我们先说一下热键 TAB TAB键在linux中有什么作用呢&#xff1f;&#xff1f; 在Linux中&#xff0c;假设我们想要输入的指令忘记了&#xff0c;我们可以TAB两下&#xff0c;帮我们补全命令或者假如命令太多&#xff0…...

Testing and fault tolerence考试要点

文章目录 ATPGFault modelScanFunctional testMemory BISTLogic BISTboundary scanATEIddq testingFault tolerant designRisk analysis ATPG ATPG工作流程fault collapsing的原则 Fault model 有哪些fault model以及他们的工作原理 Scan Scan寄存器结构Scan Chain的连接方…...

记一次springboot项目漏洞挖掘

前言 前段时间的比赛将该cms作为了题目考察&#xff0c;这个cms的洞也被大佬们吃的差不多了&#xff0c;自己也就借此机会来浅浅测试下这个cms残余漏洞&#xff0c;并记录下这一整个流程&#xff0c;谨以此记给小白师傅们分享下思路&#xff0c;有错误的地方还望大佬们请以指正…...

R语言 | 数据框

目录 一、认识数据框 7.1 建立第一个数据框 7.2 验证与设定数据框的列名和行名 二、认识数据框的结构 三、获取数据框内容 3.1 一般获取 3.2 特殊字符$ 3.3 再看取得的数据 四、使用rbind()函数增加数据框的行数据 五、使用cbind()函数增加数据框的列数据 5.1 使用$符号…...

基于SpringBoot的招生管理系统的设计与实现

背景 本次设计任务是要设计一个招生管理系统&#xff0c;通过这个系统能够满足管理员和学生的招生公告管理功能。系统的主要功能包括首页、个人中心、学生管理、专业信息管理、专业报名管理、录取通知管理、系统管理等功能。 管理员可以根据系统给定的账号进行登录&#xff0…...

Oracle Profile详解

Profile的作用主要表现在三个方面 1、密码策略 2、对用户所能使用的资源进行管理 3、profile存放在数据字典里面&#xff0c;默认有一个名字为default的profile set linesize 160 set pagesize 30 select resource_name,resource_type,limit from dba_profiles where profile‘…...

r语言tidyverse教程:5 字符串处理stringr

文章目录 R语言系列&#xff1a; 编程基础&#x1f48e;循环语句&#x1f48e;向量、矩阵和数组&#x1f48e;列表、数据帧排序函数&#x1f48e;apply系列函数tidyverse&#xff1a;readr&#x1f48e;tibble&#x1f48e;tidyr&#x1f48e;dplyr&#x1f48e;stringr stri…...

知识变现海哥:知识变现的本质就是卖

知识变现的本质就是卖&#xff0c;而有人买的本质&#xff0c;就是你解决了某方面的需求。 好的成交&#xff0c;从来都是相互的&#xff0c; 只靠一边主动推销来维系是远远不够的。 绝对不是靠忽悠&#xff0c;而是靠实力。 先讲一个故事。 19世纪时&#xff0c;一个年轻的…...

jdbc和druid和mybatis之间的关系

第一种方式 jdbc整合了:加载数据库驱动,创建连接,写原生语句,执行,关闭这些东西. 第二种方式 mybatis对jdbc进行封装,他允许你通过配置的形式,配置数据库参数,并且允许你通过xml来写动态sql语句.if:test让你可以把sql变得灵活起来.并且还能将你的查询结果直接映射到你想要的…...

云原生Istio案例实战

目录 1 Istio监控功能1.1 prometheus和grafana1.2 访问prometheus1.3 访问grafana 2 项目案例&#xff1a;bookinfo2.1 理解什么是bookinfo2.2 sidecar自动注入到微服务2.3 启动bookinfo2.4 通过ingress方式访问2.5 通过istio的ingressgateway访问2.5.1 确定 Ingress 的 IP 和端…...

解读赛力斯年报:华为智选车的B面

作者 | Amy 编辑 | 德新 赛力斯&#xff0c;华为智选车的B面。 2021年&#xff0c;赛力斯SF5进入华为渠道销售&#xff0c;华为自此开启了智选车模式。到年末&#xff0c;双方更是推出AITO品牌。AITO凭借M5/M7等车型在2022年拿下了超过7.5万台的销量&#xff0c;成为增长最快的…...

互联网内卷严重?你咋不看看其他行业呢?无非是三十晚上无月亮,大家都一样

一千个人眼中有一千个哈姆雷特&#xff0c;互联网行业就像一座围城&#xff0c;城外的人想进来&#xff0c;城内的人要么卷要么躺要么润 ​ 真实的感受你可以现在约几个面试体验一下。内卷到什么程度&#xff1f; 产品和运营岗&#xff0c;业务经验不完全对口简历都过不了&am…...

CompletableFuture异步任务编排使用

CompletableFuture异步任务编排使用 runAsync 和 supplyAsyncallOf 和 anyOfjoin 和 getwhenComplete 和 whenCompleteAsync 和 exceptionallyhandle 和 handleAsync 串行编排runAsync().thenRunAsync()supplyAsync().thenAcceptAsync((res) ->{})supplyAsync().thenApplyAs…...

Scala的高级用法

文章目录 1. 默认参数值1.1 方法默认参数1.2 类默认参数 2. 特质 (Traits)2.1 子类型2.2 扩展特征&#xff0c;当做接口来使用 3.元组3.1 定义与取值3.2 元组用于模式匹配3.3 用于for循环 4 高阶函数4.1 常见的高阶函数map4.2 简化涨薪策略代码 5.嵌套方法6.多参数列表&#xf…...

【31.在排序数组中查找元素的第一个和最后一个位置】

给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 示例 1&#xff1a…...

如何构建“Buy Me a Coffee”DeFi dApp

&#x1f978; 本教程来自官网&#xff1a;https://docs.alchemy.com/docs。对原文部分内容进行了修改。教程中所有实例经过本人实践&#xff0c;代码可见&#xff1a;https://github.com/ChuXiaoYi/web3Study 区块链技术令人惊叹&#xff0c;因为它使我们能够使用代码和软件编…...

Redis 实战篇:巧用 Bitmap 实现亿级海量数据统计

目录 二值状态统计判断用户登陆态SETBIT 命令GETBIT 命令第一步&#xff0c;执行以下指令&#xff0c;表示用户已登录。第二步&#xff0c;检查该用户是否登陆&#xff0c;返回值 1 表示已登录。第三步&#xff0c;登出&#xff0c;将 offset 对应的 value 设置成 0。 用户每个…...

3 天,入门 TAURI 并开发一个跨平台 ChatGPT 客户端

TAURI 是什么 TAURI 是一个使用 Rust 编写的程序框架&#xff0c;它允许我们使用 Web 技术和 Rust 语言构建跨端应用。它提供了大量特性&#xff0c;例如系统通知、网络请求、全局快捷键、本地文件处理等&#xff0c;它们都可以在前端通过 JavaScript 便捷的调用。 TAURI 应用…...

14个最佳创业企业WordPress主题

要创建免费网站&#xff1f;从易服客建站平台免费开始 500M免费空间&#xff0c;可升级为20GB电子商务网站 创建免费网站 您网站的设计使您能够展示产品的独特卖点。通过正确的主题&#xff0c;您将能够解释为什么客户应该选择您的品牌而不是其他品牌。 在本文中&#xff0…...

MySQL基础(三十)PowerDesigner的使用

1 PowerDesigner的使用 PowerDesigner是一款开发人员常用的数据库建模工具&#xff0c;用户利用该软件可以方便地制作 数据流程图 、概念数据模型 、 物理数据模型&#xff0c;它几乎包括了数据库模型设计的全过程&#xff0c;是Sybase公司为企业建模和设计提供的一套完整的集…...