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

发布于:2024-06-27 ⋅ 阅读:(42) ⋅ 点赞:(0)

目录

用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


网站公告

今日签到

点亮在社区的每一天
去签到