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 {
    @Override
    public 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");
        //拿到bean
        Object 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");
        //拿到dog
        Dog 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

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值