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

news2024/11/17 21:57:05

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();
    }

    @Override
    public Map<String, Object> getBeanMap() {
        return beanMap;
    }
}

测试

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

				if (beanScanner.isImplAware(BeanNameAware.class, clazz)) {
                    beanFactory.doBeanNameAware(bean);
                }
                // BeanFactoryAware
                if (beanScanner.isImplAware(BeanFactoryAware.class, clazz)) {
                    beanFactory.doBeanFactoryAware(beanFactory, bean);
                }
                // ApplicationContextAware
                if (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;


    @Override
    public void setBeanName(String beanName) {
        System.out.println(beanName);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) {
        System.out.println(applicationContext.getBeanMap().toString());
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) {
        System.out.println(beanFactory.getBeanMap().toString());
    }
}

测试结果

在这里插入图片描述

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

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

相关文章

老胡的周刊(第106期)

老胡的信息周刊[1]&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 &#x1f3af; 项目 quivr[2] Quivr 是您在云中的第二个大脑&…

Mysql数据库事务隔离级别造成死锁

场景:如下代码,获取数据库连接,删除权限的时候,会造成数据库死锁. 代码 日志&#xff1a; 数据库&#xff1a; SHOW OPEN TABLES where In_use > 0; 问题分析&#xff1a;测试环境Centos7操作系统&#xff0c;Mysql5.7.40版本程序运行正常&#xff0c;开发环境Windows操…

设计模式行为型-模板模式

文章目录 一&#xff1a;模板方法设计模式概述1.1 简介1.2 定义和目的1.3 关键特点1.4 适用场景 二&#xff1a;模板方法设计模式基本原理2.1 抽象类2.1.1 定义和作用2.1.2 模板方法2.1.3 具体方法 2.2 具体类2.2.1 定义和作用2.2.2 实现抽象类中的抽象方法2.2.3 覆盖钩子方法 …

学生信息管理系统MIS(前端)

改造HTML文件 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>学生信息管理系统MIS</title><!-- link在HTML文件中,引入外部的css文件 rel的值是固定写法,stylesheet样式表href用来指定样式表的位置--><lin…

CleanMyMac X2024软件最新版本更新下载

CleanMyMac X是一款颇受欢迎的专业清理软件&#xff0c;拥有十多项强大的功能&#xff0c;可以进行系统清理、清空废纸篓、清除大旧型文件、程序卸载、除恶意软件、系统维护等等&#xff0c;并且这款清理软件操作简易&#xff0c;非常好上手&#xff0c;特别适用于那些刚入手苹…

企业架构LNMP学习笔记5

Nginx&#xff1a; 常见用法&#xff1a; 1&#xff09;web服务器软件 httpd http协议 同类的web服务器软件&#xff1a;apache Nginx&#xff08;俄罗斯&#xff09;IIS&#xff08;微软&#xff09;lighttpd&#xff08;德国&#xff09; 2&#xff09;代理服务器 反向代…

springboot:时间格式化的5种方法(解决后端传给前端的时间格式转换问题)推荐使用第4和第5种!

本文转载自&#xff1a;springboot&#xff1a;时间格式化的5种方法&#xff08;解决后端传给前端的时间显示不一致&#xff09;_为什么前端格式化日期了后端还要格式化_洛泞的博客-CSDN博客 时间问题演示 为了方便演示&#xff0c;我写了一个简单 Spring Boot 项目&#xff…

设计模式-工厂模式Factory

工厂模式 b.工厂方法模式 (Factory Method) (重点)1) 简单工厂 Simple Factory1.a) 简单工厂的好处 2) 工厂方法 Factory Method2.a) 对工厂进行抽象化 (版本一)2.b) 对工厂进行缓存 (版本二)2.c) 加载配置文件到缓存中 (版本三)c.1) 产品线 c.抽象工厂模式 (Abstract Factory)…

五子棋游戏禁手算法的改进

五子棋游戏禁手算法的改进 五子棋最新的禁手规则&#xff1a; 1&#xff0e;黑棋禁手判负、白棋无禁手。黑棋禁手有“三三”&#xff08;包括“四三三”&#xff09;、“四四”&#xff08;包括“四四三”&#xff09;和“长连”。黑棋只能以“四三”取胜。 2&#xff0e;黑方…

B端系统设计之【权限】详解

衡量B端产品系统好坏的一个重要标准就是它的权限是否细致&#xff0c;拓展性是否强。 权限管理是B端产品系统的基础&#xff0c;好的权限管理系统延展性较强&#xff0c;即使业务发生变化也能避免大改和推倒重建。 权限分类 1、功能权限 功能权限是指用户登录系统之后&#xff…

前端面试中Vue的有经典面试题三

11. 网页从输入网址到渲染完成经历了哪些过程&#xff1f; 大致可以分为如下7步&#xff1a; 输入网址&#xff1b; 发送到DNS服务器&#xff0c;并获取域名对应的web服务器对应的ip地址&#xff1b; 与web服务器建立TCP连接&#xff1b; 浏览器向web服务器发送http请求&a…

【自用】西门子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;把红色按钮…

【代码随想录day23】不同路径 II

题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑网格中有障碍物。那么从左上角到…

3.1.6 练习 基于GPA排名计算本专业保研名单

C自学精简教程 目录(必读) GPA概念回顾 平均学分绩点GPA(Grade Point Average)是对一个学生大学学习成绩的综合的衡量指标。 在前面的文章 本科生学分绩点GPA计算 中&#xff0c;我们知道了什么是平均学分绩点GPA&#xff0c;以及如何计算它。 基于GPA给学生排名 现在我们…

介绍几种使用工具

FileWatch&#xff0c;观测文件变化&#xff0c;源码地址&#xff1a;https://github.com/ThomasMonkman/filewatch nlohmann::json&#xff0c;json封装解析&#xff0c;源码地址&#xff1a;https://github.com/nlohmann/json optionparser&#xff0c;解析选项&#xff0c;源…

4.(Python数模)0-1规划

Python解决0-1规划问题 参考下面文章 源代码 import pulp # 导入 pulp 库# 主程序 def main():# 投资决策问题&#xff1a;# 公司现有 5个拟投资项目&#xff0c;根据投资额、投资收益和限制条件&#xff0c;问如何决策使收益最大。"""问题建模&#x…

9. 微积分 - 导数

文章目录 导数求导实例代码演示:迭代法求解二次函数最小值阶Hi, 大家好。我是茶桁。 我们终于结束了极限和连续的折磨,开启了新的篇章。 不过不要以为我们后面的就会很容易,只是相对来说, 没有那么绕而已。 那么,我们今天开始学习「导数」。 导数 在之前的导论,也就是…

【算法竞赛宝典】求分数精确值

【算法竞赛宝典】求分数精确值 题目描述思路讲解代码展示 题目描述 思路讲解 代码展示 //计算分数的精确值 #include<iostream>using namespace std; int remainder[101], quotient[101]; //remainder:存放除法的余数;quotient:依次存放商的每一位int main() {int m, n,…

[CISCN 2019初赛]Love Math

文章目录 前言考点解题过程 前言 感慨自己实力不够&#xff0c;心浮气躁根本做不来难题。难得这题对我还很有吸引力&#xff0c;也涉及很多知识。只能说我是受益匪浅&#xff0c;总的来说加油吧ctfer。 考点 利用php动态函数的特性利用php中的数学函数实现命令执行利用php7的特…

项目验收有哪些流程?

验收流程 科技计划项目验收/课题验收测试服务的被测对象是国家重大专项、科研课题的软件成果物&#xff0c;可以是一个模块、软件或系统等&#xff0c;也可以是软件套件或软件原型等。测试范围主要来源于课题的合同书/可行吧报告/申报书中的技术指标要求。所出具的科技项目验收…