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

news/2024/5/19 5:20:36 标签: spring, java, 反射, 代理

BeanPostProcessor

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

java">		// 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,是的话就跳过就行

java">// 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的字段
                ......

最后执行这些代码

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

BeanFactory

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

java">/**
     * 进行初始化
     *
     * @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);
        }
    }

测试类

java">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);
    }
}

java">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.niftyadmin.cn/n/4994892.html

相关文章

[ROS]yolov8部署ROS

Yolov8是一种基于PyTorch深度学习框架的轻量级目标检测算法&#xff0c;具有高效、准确和快速的特点&#xff0c;因此在机器人领域得到了广泛的应用。而ROS&#xff08;Robot Operating System&#xff09;是一个用于机器人软件开发的框架&#xff0c;提供了各种工具和库&#…

【FlowDroid】一、处理流程学习

FlowDroid 一、处理流程学习 下载配置源码概况代码逻辑分析analyzeAPKFilerunInfoflowprocessEntryPointcalculateCallbacks(sourcesAndSinks)再次回到processEntryPoint 自己做一些笔记 下载配置 参照我前面的文章可以使用FlowDroid安装初体验 为了看代码了解FlowDroid如何处…

Spring工具类--Assert的使用

原文网址&#xff1a;Spring工具类--Assert的使用_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Spring的Assert工具类的用法。 Assert工具类的作用&#xff1a;判断某个字段&#xff0c;比如&#xff1a;断定它不是null&#xff0c;如果是null&#xff0c;则此工具类会报…

你知道用Woof创建的Linux吗?

Quirky 8.2 已发布&#xff0c;它是 Puppy Linux 的姊妹项目&#xff0c;是用一份叫 Woof 的定制工具创建的 Linux 发行。 新版本 Quirky 8.2 运行在 64 位的 x86 计算机上&#xff0c;主要提供了针对以前的 8.x 版本的增量改进。 Quirky Linux 8.2 x86_64 的代号是Xerus&…

libdrm全解析三十九 —— 源码全解析(36)

接前一篇文章&#xff1a;libdrm全解析三十八 —— 源码全解析&#xff08;35&#xff09; 本文参考以下博文&#xff1a; DRM 驱动程序开发&#xff08;VKMS&#xff09; 特此致谢&#xff01; 前一篇文章讲解完了资源的释放流程中的drmModeRmFB()&#xff0c;本回讲解munma…

基于Open3D的点云处理16-特征点匹配

点云配准 将点云数据统一到一个世界坐标系的过程称之为点云配准或者点云拼接。&#xff08;registration/align&#xff09; 点云配准的过程其实就是找到同名点对&#xff1b;即找到在点云中处在真实世界同一位置的点。 常见的点云配准算法: ICP、Color ICP、Trimed-ICP 算法…

lv3 嵌入式开发-3 linux shell命令(权限、输入输出)

1 Shell概述 随着各式Linux系统的图形化程度的不断提高&#xff0c;用户在桌面环境下&#xff0c;通过点击、拖拽等操作就可以完成大部分的工作。 然而&#xff0c;许多Ubuntu Linux功能使用shell命令来实现&#xff0c;要比使用图形界面交互&#xff0c;完成的更快、更直接。…

游戏服务器成DDoS最大攻击重灾区

游戏产业的迅猛发展也让游戏产业成为被黑客攻击的重灾区。什么原因让游戏行业成为DDoS的攻击重点。总结有如下原因和主要手段&#xff1a; 1.游戏行业的攻击成本较低&#xff0c;攻防成本1&#xff1a;N。随着DDoS攻击的打法越来越复杂&#xff0c;攻击点更是越来越多&#xff…