Spring底层原理之bean的加载方式一 用XML方式声明bean 自定义bean及加载第三方bean 2024详解

目录

用XML方式声明bean

首先我们创建一个空的java工程

我们要导入一个spring的依赖

注意在maven工程里瞅一眼

我们创建一个业务层接口

还有四个实现类

我们最初的spingboot生命bean的方式是通过xml声明

我们在resources文件夹下创建一个配置文件

我们书写代码

首先初始化上下文对象

接着拿到bean

打印输出

我们在xml里声明的时候

还可以不要这个id

这样进行配置

这样我们要传一个类加载器的对象进去

打印的是内存地址编号

类的全限定名,加上对象的哈希码(以十六进制表示)。

注意

然而我们要去拿同一个类的不同对象就会有些复杂

获取时指定名称

精准获取

否则会报未指定bean的异常

我们在初始化上下文对象

获取我们在spring的配置文件里定义的所有的bean的信息

打印

​编辑

我们尝试加载第三方bean

我们在配置文件里试试

用我们刚刚提到的方法遍历

拿到了第三方bean

说明bean被成功加载

个人号推广

博客主页

Web后端开发

Web前端开发

数据库开发

项目实战

算法与数据结构

计算机基础

回忆录


用XML方式声明bean

使用 XML 方式声明 Spring Bean 是 Spring 框架的一种传统配置方式。这种方法通过在 XML 文件中定义 bean 及其依赖关系,来组装应用程序的各个组件。以下是详细介绍如何使用 XML 方式声明 bean

首先我们创建一个空的java工程

用maven

现在一点spring的工程没有

我们要导入一个spring的依赖

<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.9</version>
</dependency>

注意在maven工程里瞅一眼

我们创建一个业务层接口

package com.bigdata1421.bean.service;public interface BookService {void check();
}

还有四个实现类

每个实体类打印输出一行数字

package com.bigdata1421.bean.service.impl;import com.bigdata1421.bean.service.BookService;public class BookServiceImpl1 implements BookService {@Overridepublic void check() {}
}

我们最初的spingboot生命bean的方式是通过xml声明

我们在resources文件夹下创建一个配置文件

我们书写代码

<!--        xml方式声明自己开发的bean--><bean id="cat" class="com.bigdata1421.bean.Cat"/>

我们接着创建一个应用

书写我们要执行的代码

我们看看我们能不能拿到bean

首先初始化上下文对象

接着拿到bean

打印输出

package com.bigdata1421.bean.app;import javafx.application.Application;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App1 {public static void main(String[] args) {//初始化上下文对象ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext1.xml");//拿到beanObject cat = ctx.getBean("cat");//打印System.out.println(cat);}
}

我们在xml里声明的时候

还可以不要这个id

这样进行配置

<bean class="com.bigdata1421.bean.Dog"/>

这样我们要传一个类加载器的对象进去

Dog.class 是 Java 语言中的一种特殊语法,表示获取 Dog 类的 Class 对象。Class 对象是 Java 中用于表示类的元数据信息的对象,它包含了类的名称、字段、方法、构造函数等信息。

使用 Dog.class 可以在编码阶段获得对 Dog 类的引用,通常用于反射、泛型、类型检查等场景。例如,在 Spring 框架中,可以使用 Dog.class 来指定需要从应用上下文中获取的 bean 的类型。

package com.bigdata1421.bean.app;import com.bigdata1421.bean.Dog;
import javafx.application.Application;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App1 {public static void main(String[] args) {//初始化上下文对象ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext1.xml");//拿到dogDog dog = ctx.getBean(Dog.class);System.out.println(dog);}
}

打印的是内存地址编号

类的全限定名,加上对象的哈希码(以十六进制表示)。

在 Java 中,对象的内存地址并不直接暴露给开发者。Java 提供的 hashCode() 方法生成的哈希码并不能被视为对象在内存中的实际地址。Java 虚拟机 (JVM) 通过垃圾收集机制管理内存,内存地址在运行时可能会变化,因此没有直接的方式获取对象的真实内存地址。

然而,对于调试和分析的目的,有时候我们确实需要类似于内存地址的标识符。System.identityHashCode(Object x) 方法可以用来获取对象的“身份哈希码”,这是一个与对象生命周期相关的整数值,尽管它仍然不是实际的内存地址,但在某些情况下可以被用作对象的唯一标识符。

Java 的设计初衷是让开发者专注于业务逻辑而不是内存管理,因此屏蔽了直接操作内存地址的复杂性。而像 C/C++ 这样的语言则允许更底层的内存操作,但也需要开发者对内存管理有更多的掌控和责任。

注意

然而我们要去拿同一个类的不同对象就会有些复杂

我们需要去指定名称

获取时指定名称

精准获取

否则会报未指定bean的异常

小窍门

我们在初始化上下文对象

配置文件的时候

可以调用里面的方法

获取我们在spring的配置文件里定义的所有的bean的信息

打印

我们现在声明的bean都是自己手写的

我们尝试加载第三方bean

我们在配置文件里试试

<!--        xml方式声明第三方开发的bean--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"/>

用我们刚刚提到的方法遍历

package com.bigdata1421.bean.app;import com.bigdata1421.bean.Dog;
import javafx.application.Application;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App1 {public static void main(String[] args) {//初始化上下文对象ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext1.xml");String[] arr = ctx.getBeanDefinitionNames();for (String s : arr) {System.out.println(s);}}
}

拿到了第三方bean

说明bean被成功加载

小结

个人号推广

博客主页

多多!-CSDN博客

Web后端开发

https://blog.csdn.net/qq_30500575/category_12624592.html?spm=1001.2014.3001.5482

Web前端开发

https://blog.csdn.net/qq_30500575/category_12642989.html?spm=1001.2014.3001.5482

数据库开发

https://blog.csdn.net/qq_30500575/category_12651993.html?spm=1001.2014.3001.5482

项目实战

https://blog.csdn.net/qq_30500575/category_12699801.html?spm=1001.2014.3001.5482

算法与数据结构

https://blog.csdn.net/qq_30500575/category_12630954.html?spm=1001.2014.3001.5482

计算机基础

https://blog.csdn.net/qq_30500575/category_12701605.html?spm=1001.2014.3001.5482

回忆录

https://blog.csdn.net/qq_30500575/category_12620276.html?spm=1001.2014.3001.5482

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

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

相关文章

AI Agent:技术原理与未来趋势

在人工智能的快速发展中&#xff0c;AI Agent作为一项创新技术&#xff0c;正逐渐成为研究和应用的热点。AI Agent不仅仅是执行命令的程序&#xff0c;它们能够感知环境、做出决策并采取行动&#xff0c;展现出类似人类的群体协作能力。本文将探讨AI Agent的技术原理、开源框架…

使用vite官网和vue3官网分别都可以创建vue3项目

问: npm init vitelatest 和 npm create vuelatest创建的vue3项目有什么区别? 回答: npm init vitelatest 和 npm create vuelatest 分别是使用 Vite 和 Vue CLI 工具创建 Vue 项目的两种方式&#xff0c;它们之间有几个主要区别&#xff1a; 1. **构建工具&#xff1a;** …

【PYG】定义数据集报错AttributeError: can‘t set attribute

当你遇到 AttributeError: cant set attribute 错误时&#xff0c;通常是因为你试图在一个类的实例上设置一个属性&#xff0c;但该类不允许直接设置属性。在Python中&#xff0c;某些类&#xff0c;特别是那些继承自某些基类&#xff08;比如 torch.utils.data.Dataset&#x…

忍法:声音克隆之术

前言&#xff1a; 最近因为一直在给肚子里面的宝宝做故事胎教&#xff0c;每天&#xff08;其实是看自己心情抽空讲下故事&#xff09;都要给宝宝讲故事&#xff0c;心想反正宝宝也看不见我&#xff0c;只听我的声音&#xff0c;干脆偷个懒&#xff0c;克隆自己的声音&#xf…

Linux CentOS 宝塔 Suhosin禁用php5.6版本eval函数详细图文教程

方法一&#xff1a;PHP_diseval_extension禁用 Linux CentOS 禁用php的eval函数详细图文教程_centos php 禁用 eval-CSDN博客 这个方法make报错&#xff0c;懒得费时间处理&#xff0c;直接用第二种 方法二&#xff1a;suhosin禁用 不支持PHP8&#xff0c;官方只支持PHP7以下…

【电源专题】为什么带电量计芯片的电池MOS保护要放在高侧

在实际的电量计电池开发中,发现一个很奇怪的现象。传统电池保护IC往往都是将充电保护和放电保护的两个MOS管放在低侧的。如下所示是文章:【电源专题】读一读单节锂电池保护IC规格书 可以看到M1和M2两个MOS管是放在PB-(也就是电池的负端),我们叫做低端。 而BQ28Z610电…

Python爬虫背后技术详解

在互联网时代&#xff0c;信息量巨大&#xff0c;如何高效地获取和处理这些信息变得尤为重要。Python 爬虫作为一种自动化获取网页信息的技术&#xff0c;已成为许多程序员和数据分析师必备技能之一。本文将深入探讨 Python 爬虫背后的技术原理&#xff0c;并结合实际代码示例来…

股票回购(Stock repurchases)和派发股息(Dividend distributions)有什么相同点和不同点?

中文版 股票回购和派发股息是公司将利润返还给股东的两种主要方式&#xff0c;二者各有优缺点。下面是它们的相同之处和不同之处&#xff0c;并通过具体公司数据进行说明。 相同之处 股东回报&#xff1a;股票回购和派发股息都是公司向股东返还利润的一种方式。股东从中受益…

目标检测常用涨点方法:注意力机制小结(空间注意力、通道注意力、CBAM等)

1.通道注意力 通道注意力&#xff08;Channel Attention&#xff09;是在通道维度上对输入数据进行学习&#xff0c;再对不同的通道分配相应的权重表示重要性&#xff0c;从而达到“分配注意力”的效果。SENet&#xff08;Squeeze and Excitation networks) 是一个典型的使用通…

论基于架构的软件设计方法及应用(ABSD)

论基于架构的软件设计方法及应用&#xff08;ABSD&#xff09; 一、引言 随着信息技术的快速发展&#xff0c;软件系统的复杂性和规模性不断增加&#xff0c;传统的软件开发方法已难以满足现代软件项目的需求。基于架构的软件设计方法&#xff08;Architecture-Based Softwar…

Swift宏的实现

上篇介绍了Swift宏的定义与生声明&#xff0c;本篇主要看看是Swift宏的具体实现。结合Swift中Codable协议&#xff0c;封装一个工具让类或者结构体自动实现Codable协议&#xff0c;并且添加一些协议中没有的功能。 关于Codable协议 Codable很好&#xff0c;但是有一些缺陷&…

编写Linux下共享库SDK

在Linux中&#xff0c;共享库&#xff08;也称为动态链接库&#xff09;是一种可以被多个程序共享的可执行代码和数据的集合。在编写共享库的SDK时&#xff0c;我们通常需要提供以下内容&#xff1a; 1. 头文件&#xff1a;包含了共享库提供的函数和数据结构的声明。这些头文件…

1688_item_search_shop接口技术详解

1688_item_search_shop接口技术详解 在B2B电商领域&#xff0c;当商家或消费者需要查找特定店铺的商品时&#xff0c;一个高效的店铺搜索接口显得尤为重要。1688平台作为中国领先的B2B电商平台&#xff0c;提供了item_search_shop接口&#xff0c;使得商家和消费者能够根据店铺…

一个c++的综合实例:log同步写入文件

1. 引言 功能 通过一个API函数把log写入到文件中&#xff0c;分4个log level 目录 ├── log ├── log.cpp ├── log.h ├── main.cpp └── Makefile 2.代码 文件&#xff1a;main.cpp #include "log.h"int main(int argc, char *argv[]) {Log::GetIns…

yaklang window安装 vscode运行得到“hello world”

资源来源&#xff1a;旅程伊始&#xff1a;Yak 语言环境安装与搭建环境 | Yak Program Language 安装yak语言非常简单&#xff0c;管理员权限打开命令行运行以下命令&#xff1a; powershell (new-object System.Net.WebClient).DownloadFile(https://yaklang.oss-cn-beijing…

1085 PAT单位排行(测试点5)

solution 测试点5&#xff1a;总分是在每个学生加权后再取整&#xff0c;所以用来存学生分数的变量要用浮点型学校排序&#xff1a; 若成绩不同&#xff0c;则按成绩降序若成绩相同&#xff0c;人数不同&#xff0c;则按成绩升序若成绩和人数都相同&#xff0c;则按单位名升序…

TS-字面量类型

字面量在代码中表示固定值。在TypeScript中&#xff0c;字面量包括字符串、数值、布尔值、长整型值、对象、数组、函数、正则表达式、null等&#xff0c;例如&#xff0c;以下都是字面量。 99.9 //数值字面量 true //布尔值字面量 "message" //字符…

理解GPT2:无监督学习的多任务语言模型

目录 一、背景与动机 二、卖点与创新 三、几个问题 四、具体是如何做的 1、更多、优质的数据&#xff0c;更大的模型 2、大数据量&#xff0c;大模型使得zero-shot成为可能 3、使用prompt做下游任务 五、一些资料 一、背景与动机 基于 Transformer 解码器的 GPT-1 证明…

NAS教程丨铁威马如何登录 SSH终端?

适用型号&#xff1a; 所有TNAS 型号 如您有特殊操作需要通过 SSH 终端登录 TNAS&#xff0c;请参照以下指引&#xff1a; (注意: 关于以下操作步骤中的"cd /"的指令,其作用是使当前 SSH/Telnet 连接的位置切换到根目录,以免造成对卷的占用.请不要遗漏它.) Windows…

数据分析的线上云端数据库搭建及Excel和Tableau连接

数据分析的线上云端数据库搭建及Excel和Tableau连接 SQL基础知识 线上SQL训练&#xff1a; SQlZOO: https://www.sqlzoo.net/wiki/SQL_Tutorial 牛客网SQL真题&#xff1a;https://www.nowcoder.com/ta/sql select,from,where, order by, limit, group by, having, substr(),…