【仿写spring之ioc篇】四、实现bean的初始化阶段

news2024/11/16 5:53:26

BeanPostProcessor

在Bean的初始化阶段有前置和后置方法,这个方法是通过BeanPostProcessor来管理的,下面我们对原有的项目结构做小小的更改。
在这里插入图片描述
对启动类作出修改,先检查有没有BeanPostProcessor的实现类,有的话就使用,没有就使用默认的。

		// 2.判断是否是postProcessor
        for (String name : allJavaFile) {
            Class<?> clazz = beanScanner.getClazz(name);
            if (beanScanner.isImplBeanPostProcessor(clazz)){
                Object bean = beanFactory.createBean(clazz);
                beanPostProcessor = (BeanPostProcessor) bean;
                beanFactory.getCreatedBeanSet().add(bean);
            }
        }
        if (beanPostProcessor == null){
            beanPostProcessor = new DefaultBeanPostProcessor();
        }

第二次循环先检查是不是postProcessor,是的话就跳过就行

// 3.判断是否有Component
        for (String name : allJavaFile) {
            if (beanScanner.isComponent(name)) {
                // 4.是Component就开始bean的生命周期
                Class<?> clazz = beanScanner.getClazz(name);
                boolean flag = false;
                for (Object o : beanFactory.getCreatedBeanSet()) {
                    if (o.getClass().equals(clazz)) {
                        flag = true;
                        break;
                    }
                }
                if (flag){
                    continue;
                }
                Object bean = beanFactory.createBean(clazz);
                String beanName = beanFactory.parseBeanName(bean);
                // 查看@Value注解
                // 1.找到所有@Value的字段
                ......

最后执行这些代码

				// init
                beanFactory.getBeanMap().put(beanName,bean);
                beanPostProcessor.postProcessBeforeInitialization(bean);
                beanFactory.doInitialization(bean,beanScanner);
                beanPostProcessor.postProcessAfterInitialization(bean);

BeanFactory

这些方法都大差不差,思路就是找注解/接口,去invoke执行方法

/**
     * 进行初始化
     *
     * @param bean 豆
     * @throws Exception 例外
     */
    public void doInitialization(Object bean, BeanScanner beanScanner) throws Exception {
        // @PostConstruct
        List<Method> postConstruct = beanScanner.getPostConstruct(bean);
        for (Method method : postConstruct) {
            method.invoke(bean);
        }
        // InitializingBean
        if (beanScanner.isImplInitializing(bean)) {
            doInitialize(bean);
        }
    }

测试类

package com.ez4sterben.spring.test;

import com.ez4sterben.spring.ioc.annotation.Component;
import com.ez4sterben.spring.ioc.factory.BeanPostProcessor;

/**
 * 测试bean后处理器
 *
 * @author ez4sterben
 * @date 2023/09/02
 */
@Component
public class TestBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean) {
        System.out.println("postProcessBeforeInitialization");
        return BeanPostProcessor.super.postProcessBeforeInitialization(bean);
    }

    @Override
    public Object postProcessAfterInitialization(Object bean) {
        System.out.println("postProcessAfterInitialization");
        return BeanPostProcessor.super.postProcessAfterInitialization(bean);
    }
}

package com.ez4sterben.spring.test;

import com.ez4sterben.spring.ioc.annotation.Component;
import com.ez4sterben.spring.ioc.annotation.Value;
import com.ez4sterben.spring.ioc.context.ApplicationContext;
import com.ez4sterben.spring.ioc.factory.BeanPostProcessor;
import com.ez4sterben.spring.ioc.factory.InitializingBean;
import com.ez4sterben.spring.ioc.factory.aware.ApplicationContextAware;
import com.ez4sterben.spring.ioc.factory.aware.BeanFactoryAware;
import com.ez4sterben.spring.ioc.factory.aware.BeanNameAware;
import com.ez4sterben.spring.ioc.factory.support.BeanFactory;
import lombok.Data;

import javax.annotation.PostConstruct;

/**
 * 测试组件
 *
 * @author ez4sterben
 * @date 2023/09/01
 */
@Component
@Data
public class TestComponent implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean {

    @Value("ez4sterben")
    private String name;

    private String age;

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

    @PostConstruct
    public void init(){
        System.out.println("postConstruct");
    }

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

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

    @Override
    public void afterPropertiesSet() {
        System.out.println("afterPropertiesSet");
    }
}

结果
在这里插入图片描述

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

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

相关文章

搜索二维矩阵 II

题目链接 搜索二维矩阵 II 题目描述 注意点 矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 解答思路 最初想到使用深度优先遍历剪枝实现&#xff0c;但是运行后超出时间限制了可以直接遍历整个矩阵查找&#xff0c;虽然不超时…

【sgLazyTree】自定义组件:动态懒加载el-tree树节点数据,实现增删改、懒加载及局部数据刷新。

特性 可以自定义主键、配置选项支持预定义节点图标&#xff1a;folder文件夹|normal普通样式多个提示文本可以自定义支持动态接口增删改节点 sgLazyTree源码 <template><div :class"$options.name" v-loading"rootLoading"><div class&qu…

wireshark抓包分析

题目一&#xff1a;Cephalopod(图片提取) 打开下载好的数据包&#xff1a;CtrlF 按照如图选择分组字节流&#xff0c;选择字符串&#xff0c;输入‘flag’筛选出数据包&#xff1b; 点击筛选出来的一条数据包&#xff0c;右键选择追踪tcp流&#xff1b; 然后可以看到png的字样…

2.92-KFKG射频微波同轴连接器的电气特性

2.92mm连接器的名称是以其外导体内径命名的&#xff0c;采用空气介质工作频率高达40GHz,可与SMA和3.5mm连接器互换对插。优越的电性能、可靠的连接尤其适用于测试系统和武*装备&#xff0c;成为国际上应用最为广泛的毫米微波连接器之一。 电气特性&#xff1a; 特性阻抗&…

解读《生成式人工智能服务管理暂行办法》

《生成式人工智能服务管理暂行办法》 第一章 总 则第二章 技术发展与治理第三章 服务规范第四章 监督检查和法律责任第五章 附 则 以ChatGPT为代表的现象级互联网应用的出现&#xff0c;掀起了人工智能领域新一轮技术浪潮。作为新一代信息技术&#xff0c;生成式人工智能通过…

正点原子I.MX6ull应用编程 看门狗实验 /dev/watchdog: Device or resource busy

记录自己学习正点原子I.Mx6ull应用编程教程中遇到的坑点和问题 按着正点原子<<I.MX6U嵌入式Linux C应用编程指南>>学习看门狗应用编程&#xff0c;在运行程序的时候出现 open error: /dev/watchdog: Device or resource busy 可以看到watchdog忙碌&#xff0c;看起…

Python所有方向的学习路线图!!

学习路线图上面写的是某个方向建议学习和掌握的知识点汇总&#xff0c;举个例子&#xff0c;如果你要学习爬虫&#xff0c;那么你就去学Python爬虫学习路线图上面的知识点&#xff0c;这样学下来之后&#xff0c;你的知识体系是比较全面的&#xff0c;比起在网上找到什么就学什…

MyBatis——MyBatis数据源与连接池

摘要 博文主要介绍MyBatis数据源与连接池&#xff0c;更好的理解MyBatis数据源与连接池。 一、MyBatis数据源DataSource分类 MyBatis把数据源DataSource分为三种&#xff1a; UNPOOLED 不使用连接池的数据源POOLED 使用连接池的数据源JNDI 使用JNDI实现的数据源 MyBatis内…

ESP32C3 LuatOS RC522①写入数据并读取M1卡

LuatOS RC522官方示例 官方示例没有针对具体开发板&#xff0c;现以ESP32C3开发板为例。 选用的RC522模块 ESP32C3-CORE开发板 注意ESP32C3的 SPI引脚位置&#xff0c;SPI的id2 示例代码 -- LuaTools需要PROJECT和VERSION这两个信息 PROJECT "helloworld" VERSIO…

网络地址转换技术NAT(第九课)

一 什么是NAT&#xff1f; NAT是网络地址转换的缩写&#xff0c;是一种在计算机网络中使用的技术&#xff0c;可以将私有地址转换为公共地址&#xff0c;从而实现本地网络与公共网络的互联。NAT工作在网络层&#xff0c;可以隐藏内部网络中的IP地址和端口号&#xff0c;从而增…

在数字时代中,该怎么保留温暖的传统

在我们现代快节奏的数字时代&#xff0c;许多人会不禁思考&#xff0c;传统的壁炉是否还有存在的必要。毕竟&#xff0c;现代家庭通常配备了先进的暖气系统和电子设备&#xff0c;能够在寒冷的日子里提供温暖。然而&#xff0c;尽管科技的进步使得家庭取暖变得更加便捷&#xf…

SpringCloudAlibaba常用组件

SpringCloudAlibaba常用组件 微服务概念 1.1 单体、分布式、集群 单体 ⼀个系统业务量很⼩的时候所有的代码都放在⼀个项⽬中就好了&#xff0c;然后这个项⽬部署在⼀台服务器上就 好了。整个项⽬所有的服务都由这台服务器提供。这就是单机结构。 单体应⽤开发简单,部署测试…

Axure RP暗黑色高保真中后台原型组件模板库及组件库素材

Axure RP暗黑色高保真中后台原型组件模板库及组件库素材&#xff0c;黑色一直以来就可以给人以高级、神秘的语义象征&#xff0c;相比于浅色模式&#xff0c;暗色模式藏着更多可能性。色彩具有层级关系&#xff0c;深色会在视觉感官上自动后退&#xff0c;浅色部分则会向前延展…

docker 笔记1

目录 1.为什么有docker ? 2.Docker 的核心概念 3.容器与虚拟机比较 3.1传统的虚拟化技术 3.2容器技术 3.3Docker容器的有什么作用&#xff1f; 3.4应用案例 4. docker 安装下载 4.1CentOS Docker 安装 4.2 Docker的基本组成 &#xff1f;&#xff08;面试&#xff09…

MLC-LLM 部署RWKV World系列模型实战(3B模型Mac M2解码可达26tokens/s)

0x0. 前言 我的 ChatRWKV 学习笔记和使用指南 这篇文章是学习RWKV的第一步&#xff0c;然后学习了一下之后决定自己应该做一些什么。所以就在RWKV社区看到了这个将RWKV World系列模型通过MLC-LLM部署在各种硬件平台的需求&#xff0c;然后我就开始了解MLC-LLM的编译部署流程和…

分公司电脑访问总部服务器突然不通了走的是SSL隧道,如何排查处理?

环境: 1.总部:AF做为PN AF-2000-FH2130B-SC v8.0.4 2.分部:SSL设备做对接为PN SSL VPN V7.0 单臂架设 出口AF v8.0.75 核心交换机 RUIYI NBS5710-24GT4SFP-E 问题描述: 1.分部下面pc其中一个网段(192.168.8.0)ping总部服务器(172.16.10.10)不通,长ping 98%丢包,…

Java- 虚拟机学习总结

Java文件编译&#xff0c;加载过程 写好java文件&#xff0c;jdk会通过javac编译class文件&#xff0c;classLaoder通过classpath将字节码文件加载进入jre jvm数据区 包含栈&#xff0c;堆&#xff0c;程序计数器&#xff0c;方法区&#xff0c;本地方法栈 JAVA里的常量&…

‘XXX‘ module: ‘XXX‘ facet resources问题解决(已解决)

问题描述&#xff1a;XXX module: XXX facet resources 在创建web工程的时候&#xff0c;出现说模块没有创建&#xff0c;但是我们返回我们的模块&#xff0c;web模块是添加好的。 通过多次实验&#xff0c;解决问题&#xff1a;就是web框架它的名称不能是一样的&#xff0c;必…

用迅为i.MX6ULL开发板同一个网段概念

使用 nfs 之前&#xff0c;开发板、虚拟机 ubuntu、windows 电脑三者要互相 ping 通&#xff0c;这就涉及到了同一个网段 的概念。 概念&#xff1a;同一个网段是指 IP 地址和子网掩码相与得到的相同的网络地址。 快速判断同一个网段&#xff1a; &#xff08;1&#xff09…

一个面向MCU的小型前后台系统

JxOS简介 JxOS面向MCU的小型前后台系统&#xff0c;提供消息、事件等服务&#xff0c;以及软件定时器&#xff0c;低功耗管理&#xff0c;按键&#xff0c;led等常用功能模块。 gitee仓库地址为&#xff08;复制到浏览器打开&#xff09;&#xff1a; https://gitee.com/jer…