【手写一个spring】spring源码的简单实现--初始化机制,回调机制

server/2024/11/23 20:56:33/

文章目录

  • A. 初始化机制
    • 实现初始化机制的方法
      • 1.实现`InitializingBean`接口
  • B. 回调机制(`Aware`)
  • 初始化机制和回调机制之间的区别

A. 初始化机制

Spring框架中,初始化机制是Bean生命周期管理的一个重要组成部分。它确保了Bean在创建和依赖注入完成后,能够执行必要的初始化逻辑,如资源分配、状态设置等。spring提供了多种方式来支持bean的初始化机制.

初始化机制发生时间:在完成了bean对象的创建和依赖注入后

实现初始化机制的方法

1.实现InitializingBean接口

spring框架提供了一个InitializingBean接口,该接口包含一个afterPropertiesSet()方法。当一个Bean实现了这个接口后,Spring容器会在Bean的所有属性被设置完毕后,自动调用afterPropertiesSet()方法。这允许Bean在依赖注入完成后执行一些初始化操作

//自定义一个InitializingBean 接口public interface InitializingBean {public void  afterPropertiesSet();
}
//bean对象实现该接口,并重写其中的afterPropertiesSet()方法@Component
@Scope("prototype")     //多例
public class UserService1 implements InitializingBean {@Overridepublic void afterPropertiesSet() {System.out.println("进行after :InitializingBean~~~~");}
}

那么具体是如何在bean对象的创建过程中执行的呢?
其实很简单,只需要在完成bean对象的创建和依赖注入后,判断该bean对象是否实现了InitializingBean 接口,如果实现了,调用该方法即可

		/**** 初始化机制** */if(instance instanceof InitializingBean){((InitializingBean)instance).afterPropertiesSet();}

instanceof :在Java编程语言中,instanceof 关键字被用于检查一个对象是否是指定类的实例(或其子类的实例)。这个操作符返回一个布尔值:如果对象是指定类型的实例,或者是指定类型子类的实例,则返回 true;否则返回 false。

  1. 使用@PostConstruct注解
    @PostConstruct注解是Java EE 5引入的,用于标记在依赖注入完成后需要被自动调用的初始化方法。在Spring框架中,当一个Bean的方法上使用了@PostConstruct注解时,Spring容器会在Bean实例化并且所有属性被注入后,自动调用该方法。这种方式比实现InitializingBean接口更加简洁和直观。
/**** 执行@PostConstruct注释的方法** *///当前遍历clazz的所有方法for(Method method:clazz.getDeclaredMethods()){if(method.isAnnotationPresent(PostConstruct.class)){//说明当前的方法上存在这个@PostConstruct注解,那么调用这个方法method.invoke(instance,null);//调用当前被注释的这个方法}}

B. 回调机制(Aware)

Spring框架中,回调机制是一种强大的特性,它允许Spring容器中的Bean生命周期的不同阶段执行特定的操作。这种机制为开发者提供了一种灵活的方式来管理和控制Bean的生命周期。
允许Bean在初始化过程中感知并获取Spring容器的相关信息或资源。这种机制通过一组预定义的Aware接口来实现,当Bean实现了这些接口后,Spring容器会在Bean初始化时自动调用相应的回调方法,并将相关的上下文或资源对象传递给Bean

举例BeanNameAware回调接口进行说明:

/*** beanName的回调机制(Aware)* */
public interface BeanNameAware {public void setBeanName(String beanName);
}

此处我们实现的bean对象,实现了BeanNameAware 接口,并且重写了其中的setBeanName方法:

@Component("userService")
public class UserService implements BeanNameAware{@Autowirdprivate OrderService orderService;private String beanName;@Overridepublic void setBeanName(String beanName) {this.beanName=beanName;}
}

那么,在spring容器中,我们应该怎么对aware机制的接口进行调用呢?

		/**** aware回调机制**/if(instance instanceof BeanNameAware){((BeanNameAware) instance).setBeanName(beanName);//强制类型转换,调用重写方法}

这里,我们判断是否实现了bean对象是否实现了BeanNameAware接口:如果实现,直接强制类型转换后,对该方法进行调用.

初始化机制和回调机制之间的区别

  • 应用的场景不同:
    • 初始化机制是spring容器对某个方法进行调用的一种机制,这里的方法是由开发人员设计的,由spring容器进行调用,具体执行的内容spring容器并不负责.
    • 回调机制是需要从spring容器中获取某个属性的时候进行调用的,当Bean实现了某个Aware接口后,Spring容器会在Bean初始化时自动调用该接口定义的回调方法,并将相关的上下文或资源对象作为参数传递给该方法。开发者可以在这些方法中获取Spring容器的相关信息或资源,并执行相应的逻辑

总结来说:初始化机制会对开发人员设置的方法进行调用,具体的执行内容并不负责;而回调机制是对spring容器中的某个参数进行获取.


http://www.ppmy.cn/server/144351.html

相关文章

C语言中的结构体,指针,联合体的使用

目录 1. 概述2. 定义和初始化3. 成员的使用4. 结构体数组5. 结构体套结构体6. 结构体赋值7. 结构体和指针8. 结构体作为函数参数9. 共用体(联合体)10. typedef就是取别名总结 1. 概述 数组:连续的相同数据类型的集合 结构体:不同…

第十章综合案例——————轮播广告

代码如下&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>图片轮播效果</title><style type"text/css">*{margin: 0;padding: 0;text-decoration: none;}body{padding: 20px;}#contain…

网络安全之接入控制

身份鉴别 ​ 定义:验证主题真实身份与其所声称的身份是否符合的过程&#xff0c;主体可以是用户、进程、主机。同时也可实现防重放&#xff0c;防假冒。 ​ 分类:单向鉴别、双向鉴别、三向鉴别。 ​ 主题身份标识信息:密钥、用户名和口令、证书和私钥 Internet接入控制过程 …

全面解析 JMeter 后置处理器:概念、工作原理与应用场景

在性能测试中&#xff0c;Apache JMeter是一个非常流行的工具&#xff0c;它不仅能够模拟大量用户进行并发访问&#xff0c;还提供了丰富的扩展机制来满足各种复杂的测试需求。后置处理器&#xff08;Post-Processor&#xff09;是JMeter中非常重要的组件之一&#xff0c;用于在…

如何用AI写小说(二):Gradio 超简单的网页前端交互

上一篇写了基本的生成小说的脚本&#xff0c;但脚本终归是很丑的代码&#xff0c;不符合优雅的调性&#xff0c;在 huggingface 大家经常用一个叫 gradio 的东西来写交互&#xff0c;虽然我没有什么前端基础&#xff0c;但是这个gradio最大的特点就是简单&#xff01;简单&…

深入解析Kernel32.dll与Msvcrt.dll

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 介绍Kernel32.dll&#xff1a;Windows操作系统的核心Msvcrt.dll&#xff1a;C运行时库的核心 使用举例使用Kernel32.dll的示例&#xff1a;文件操作使用Msvcrt.dll的…

【ArcGISPro】地理配准-影像校正

由于大部分数据安全性&#xff0c;以下是随意下载的图片&#xff0c;仅展示配置操作 地图-地理配准 添加控制点 修改控制点 可以导入、导出、添加和删除控制点 保存 关闭地理配准

C#实现blob分析——分别基于OpenCvSharp和Emgu实现

需求和效果预览 对于下图&#xff0c;需要检测左右两侧是否断开&#xff1a; 解决分析 设置左右2个ROI区域&#xff0c;找到ROI内面积最大的连通域&#xff0c;通过面积阈值和连通域宽高比判定是否断开。 可能遇到的问题&#xff1a;部分区域反光严重&#xff0c;二值化阈值不…