【仿写spring之ioc篇】三、检查是否实现了Aware接口并且执行对应的方法

Aware接口

Aware接口中只是设置了对应的set方法,目前只定义了三个Aware

在这里插入图片描述
以BeanNameAware为例

package com.ez4sterben.spring.ioc.factory.aware;/*** bean名字清楚** @author ez4sterben* @date 2023/08/31*/
public interface BeanNameAware {/*** 设置beanName* @param beanName*/void setBeanName(String beanName);
}

检查Aware接口

	/*** @param aware* @param clazz* @return boolean*/public boolean isImplAware(Class<?> aware, Class<?> clazz){Class<?>[] interfaces = clazz.getInterfaces();for (Class<?> anInterface : interfaces) {if (anInterface.equals(aware)) {return true;}}return false;}

通过invoke执行实现方法

	/*** beanNameAware* @param bean* @throws Exception*/public void doBeanNameAware(Object bean) throws Exception {Class<?> aClass = bean.getClass();String beanName = parseBeanName(bean);Method setBeanName = aClass.getMethod("setBeanName", String.class);setBeanName.invoke(bean, beanName);}/*** 解析beanName* @param bean* @return {@link String}*/public String parseBeanName(Object bean){Class<?> aClass = bean.getClass();Component annotation = aClass.getAnnotation(Component.class);String value = annotation.value();if ("".equals(value)){String name = aClass.getSimpleName();String s = name.substring(0, 1).toLowerCase();value = s + name.substring(1);}return value;}/*** beanFactoryAware* @param beanFactory* @param bean* @throws NoSuchMethodException* @throws InvocationTargetException* @throws IllegalAccessException*/public void doBeanFactoryAware(BeanFactory beanFactory, Object bean) throws Exception {Class<?> aClass = bean.getClass();Method setBeanName = aClass.getMethod("setBeanFactory", BeanFactory.class);setBeanName.invoke(bean, beanFactory);}/*** applicationContextAware* @param beanFactory* @param bean* @throws Exception*/public void doApplicationContextAware(BeanFactory beanFactory, Object bean) throws Exception {Class<?> aClass = bean.getClass();Method setBeanName = aClass.getMethod("setApplicationContext", ApplicationContext.class);setBeanName.invoke(bean, new ApplicationContext(beanFactory));}

ApplicationContext是如何设计的

因为父类BeanFactory中的beanMap是私有的,为了保持一致,我们就要将对应的beanFactory对象传入构造方法然后给ApplicationContext中的beanMap赋值,由于java是值传递所以这两个对象中指向的beanMap是同一个

package com.ez4sterben.spring.ioc.context;import com.ez4sterben.spring.ioc.factory.support.BeanFactory;import java.util.Map;/*** 应用程序上下文** @author ez4sterben* @date 2023/08/30*/
public class ApplicationContext extends BeanFactory {private final Map<String, Object> beanMap;public ApplicationContext(BeanFactory beanFactory) {beanMap = beanFactory.getBeanMap();}@Overridepublic Map<String, Object> getBeanMap() {return beanMap;}
}

测试

为了方便测试,在BeanNameAware时向beanMap中put一下
在这里插入图片描述
主程序中的代码

				if (beanScanner.isImplAware(BeanNameAware.class, clazz)) {beanFactory.doBeanNameAware(bean);}// BeanFactoryAwareif (beanScanner.isImplAware(BeanFactoryAware.class, clazz)) {beanFactory.doBeanFactoryAware(beanFactory, bean);}// ApplicationContextAwareif (beanScanner.isImplAware(ApplicationContextAware.class, clazz)) {beanFactory.doApplicationContextAware(beanFactory, bean);}

测试类中的代码

/*** 测试组件** @author ez4sterben* @date 2023/09/01*/
@Component
@Data
public class TestComponent implements BeanNameAware, BeanFactoryAware, ApplicationContextAware {@Value("ez4sterben")private String name;private String age;@Overridepublic void setBeanName(String beanName) {System.out.println(beanName);}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) {System.out.println(applicationContext.getBeanMap().toString());}@Overridepublic void setBeanFactory(BeanFactory beanFactory) {System.out.println(beanFactory.getBeanMap().toString());}
}

测试结果

在这里插入图片描述

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

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

相关文章

stable diffusion实践操作-常见lora模型介绍

本文专门开一节写Lora相关的内容&#xff0c;在看之前&#xff0c;可以同步关注&#xff1a; stable diffusion实践操作 模型分两种&#xff0c;一种是sd大模型&#xff0c;一种是类似Lora的小模型 国内的是&#xff1a;https://www.liblibai.com 国外的是&#xff1a;https:/…

【kubernetes】Argo Rollouts -- k8s下的自动化蓝绿部署

蓝绿(Blue-Green)部署简介 在现代软件开发和交付中,确保应用程序的平稳更新和发布对于用户体验和业务连续性至关重要。蓝绿部署是一种备受推崇的部署策略,它允许开发团队在不影响用户的情况下,将新版本的应用程序引入生产环境。 蓝绿部署的核心思想在于维护两个独立的环…

Anaconda Prompt输入jupyter lab无反应

问题&#xff1a;Anaconda Prompt界面输入指令无反应 原因&#xff1a;公司电脑勒索病毒防御工具阻止了进程 解决&#xff1a;找到黑名单恢复进程

three.js(四):react + three.js

绘制多个立方体 1.搭建reactts 项目 npx create-react-app basics-demo --template typescriptreactts 的用法可参考此链接&#xff1a; https://react-typescript-cheatsheet.netlify.app/docs/basic/setup 2.安装three依赖 npm install three types/three --save3.安装路…

antd5:form组件底层封装库field-form-1.37.0启动

一开始node版本是18.16.0 npm install发现安装依赖成功 npm start发现启动出错 node:internal/crypto/hash:71this[kHandle] new _Hash(algorithm, xofLen);^Error: error:0308010C:digital envelope routines::unsupportedat new Hash (node:internal/crypto/hash:71:19)…

Git Bash 和 Git GUI中文汉化

目录 为什么要中文汉化&#xff1f;Git Bash的汉化Git GUI的汉化 为什么要中文汉化&#xff1f; 看到中文大概能猜出是什么意思&#xff0c;便于使用&#xff0c;特别是Git GUI&#xff0c;中文版的菜单很容易理解是要做什么&#xff0c;如下图&#xff1a; Git Bash的汉化 …

开箱报告,Simulink Toolbox库模块使用指南(五)——S-Fuction模块(C MEX S-Function)

文章目录 前言 C MEX S-Function 算法原理 原始信号创建 编写S函数 仿真验证 Tips 分析和应用 总结 前言 见《开箱报告&#xff0c;Simulink Toolbox库模块使用指南&#xff08;一&#xff09;——powergui模块》 见《开箱报告&#xff0c;Simulink Toolbox库模块使用…

Qt —UDP通信QUdpSocket 简介 +案例

1. UDP通信概述 UDP是无连接、不可靠、面向数据报&#xff08;datagram&#xff09;的协议&#xff0c;可以应用于对可靠性要求不高的场合。与TCP通信不同&#xff0c;UDP通信无需预先建立持久的socket连接&#xff0c;UDP每次发送数据报都需要指定目标地址和端口。 QUdpSocket…

CS144环境配置问题

使用wsl来做CS144实验&#xff0c;可能会在编译的时候遇到以下问题&#xff0c;很明显是找不到LIBPCAP&#xff0c;参考链接 使用sudo apt-get install libpcap-dev命令下载该库即可。 CMake Error: The following variables are used in this project, but they are set to N…

大数据HBase学习圣经:一本书实现HBase学习自由

学习目标&#xff1a;三栖合一架构师 本文是《大数据HBase学习圣经》 V1版本&#xff0c;是 《尼恩 大数据 面试宝典》姊妹篇。 这里特别说明一下&#xff1a;《尼恩 大数据 面试宝典》5个专题 PDF 自首次发布以来&#xff0c; 已经汇集了 好几百题&#xff0c;大量的大厂面试…

unity3d:功能验证,收集开源项目的工程合集

unity3d功能验证&#xff0c;和收集开源项目的工程合集 目录持续更新地址 【腾讯文档】UnityForTest目录 https://docs.qq.com/doc/DWm9HSkVhTGdyUUVo 源码 https://github.com/luoyikun/UnityForTest 动画 创建骨骼动画 BoneAnimation场景 代码创建Mesh&#xff0c;骨骼…

网络安全法+网络安全等级保护

网络安全法 2014年2月&#xff0c;中央网络安全和信息化领导小组成立&#xff0c;习主席当组长 2017年6月1日&#xff0c;网络安全法正式成立 网络安全是国家安全的重要组成部分没有网络安全就没有国家安全&#xff0c;没有信息化就没有现代化 网络安全法21条 网络安全法31条 …

使用Arrays.asList生成的List集合,操作add方法报错

早上到公司&#xff0c;刚到工位&#xff0c;测试同事就跑来说"功能不行了&#xff0c;报服务器异常了&#xff0c;咋回事";我一脸蒙&#xff0c;早饭都顾不上吃&#xff0c;要来了测试账号复现了一下&#xff0c;然后仔细观察测试服务器日志&#xff0c;发现报了一个…

Linux线程互斥

目录 一、线程不安全 1.线程不安全现象 2.线程不安全程序的特质 3.线程不安全程序的原因 二、线程互斥 1.基本概念 2.锁 &#xff08;1&#xff09;认识锁 &#xff08;2&#xff09;互斥锁的使用 &#xff08;3&#xff09;代码的改造 3.锁的本质 &#xff08;1&a…

达梦8 在CentOS 系统下静默安装

确认系统参数 [rootlocalhost ~]# ulimit -a core file size (blocks, -c) unlimited data seg size (kbytes, -d) unlimited【1048576(即 1GB)以上或 unlimited】 scheduling priority (-e) 0 file size (blocks, -f) unlimite…

多路波形发生器的控制

本次波形发生器&#xff0c;主要使用运算放大器、NE555以及一些其他的电阻电容器件来实现。整体电路图如下所示&#xff1a; 产生的三角波如下&#xff1a; 正弦波如下 方波如下&#xff1a; 运算放大器&#xff08;Operational Amplifier&#xff0c;简称OP-AMP&#xff09;是…

PSP - 蛋白质结构预测 OpenFold Multimer 重构训练模型的数据加载

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132602155 OpenFold Multimer 在训练过程的数据加载时&#xff0c;需要将 MSA 与 Template 信息转换成 Feature&#xff0c;再进行训练&#xff0…

【数据结构回顾】

数据结构回顾 一、单链表二、单循环链表 一、单链表 #include <stdio.h> #include <stdlib.h>typedef struct Node {int data;Node *next; }Node;Node* initList() {Node *list (Node*)malloc(sizeof(Node));list->data 0;list->next NULL;return list; }…

【自用】西门子s7-200连接显示屏和物联网盒子完整配置过程

总览 1.PLC配置 2.显示屏配置 3.物联网盒子配置 一、PLC配置 1.连接PLC软件 STEP-7MicroWIN V4.0 SP9完整版 链接&#xff1a;https://pan.baidu.com/s/17LMEXnbkQZMPI8Bte24Eug?pwdjsi3 提取码&#xff1a;jsi3 2.PLC配置 打开 PLC 上面的小盖子&#xff0c;把红色按钮…

桌面端后台项目笔记

套用模板 vue-pure-admin 所用主要框架笔记 1. electron app const { app } require(electron) app.on(事件名, () > {} // 回调函数)常用事件 will-finish-launching 当应用程序完成基础的启动的时候触发ready&#xff1a;electron完成初始化时触发window-all-close…