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

这篇具有很好参考价值的文章主要介绍了【仿写spring之ioc篇】四、实现bean的初始化阶段。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

BeanPostProcessor

在Bean的初始化阶段有前置和后置方法,这个方法是通过BeanPostProcessor来管理的,下面我们对原有的项目结构做小小的更改。
【仿写spring之ioc篇】四、实现bean的初始化阶段,源码仿写,spring,java,反射,代理
对启动类作出修改,先检查有没有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");
    }
}

结果
【仿写spring之ioc篇】四、实现bean的初始化阶段,源码仿写,spring,java,反射,代理文章来源地址https://www.toymoban.com/news/detail-691666.html

到了这里,关于【仿写spring之ioc篇】四、实现bean的初始化阶段的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CentOS Stream 10 计划已启动,即将进入初始化阶段

    导读 但初始化的 CentOS Stream 10 暂时不会对外开放,也不会有太多活跃信息。从 Fedora 周期的规律来看,至少还有六个月的时间,CentOS Stream 10 才会正式启动开发流程,接受来自外部的贡献。周五的公告指出:你会看到 CentOS Stream 10 的活动,但现在还不是时候参与进来。可用性

    2024年02月11日
    浏览(36)
  • Spring 填充属性和初始化流程源码剖析及扩展实现

    在上一篇博文 讲解 Spring 实例化的不同方式及相关生命周期源码剖析 介绍了 Spring 实例化的不同方式,本文主要围绕实例化过后对象的填充属性和初始化过程进行详细流程剖析 回顾前言知识,doCreateBean-createBeanInstance,通过 Supplier 接口、FactoryMethod、构造函数反射 invoke,创建

    2024年02月06日
    浏览(33)
  • 【Vue2.0源码学习】生命周期篇-初始化阶段(initInjections)

    本篇文章介绍生命周期初始化阶段所调用的第四个初始化函数—— initInjections 。从函数名字上来看,该函数是用来初始化实例中的 inject 选项的。说到 inject 选项,那必然离不开 provide 选项,这两个选项都是成对出现的,它们的作用是:允许一个祖先组件向其所有子孙后代注

    2024年02月09日
    浏览(40)
  • 【Vue2.0源码学习】生命周期篇-初始化阶段(initState)

    本篇文章介绍生命周期初始化阶段所调用的第五个初始化函数—— initState 。 从函数名字上来看,这个函数是用来初始化实例状态的,那么什么是实例的状态呢?在前面文章中我们略有提及,在我们日常开发中,在 Vue 组件中会写一些如 props 、 data 、 methods 、 computed 、 watc

    2024年02月09日
    浏览(39)
  • 基于Xml方式Bean的配置-初始化方法和销毁方法

    Bean的初始化和销毁方法配置 Bean在被实例化后,可以执行指定的初始化方法完成一些初始化的操作,Bean在销毁之前也可以执行指定的销毁方法完成一些操作,初始化方法名称和销毁方法名称通过 指定的方法名于自己创建的方法名一致即可 测试类 运行结果如下 我们还可以通

    2024年02月07日
    浏览(43)
  • Spring Boot实现第一次启动时自动初始化数据库

    在现在的后端开发中,只要是运用联系型数据库,信任SSM架构(Spring Boot + MyBatis)已经成为首选。 不过在咱们第一次运转或许布置项目的时分,一般要先手动衔接数据库,履行一个SQL文件以创立数据库以及数据库表格完结 数据库的初始化作业 ,这样咱们的SSM应用程序才能够

    2024年02月03日
    浏览(40)
  • Spring初始化项目

    访问地址:https://start.spring.io idea配置:https://start.spring.io 访问地址:https://start.aliyun.com/bootstrap.html idea配置:https://start.aliyun.com 官网 阿里巴巴 版本 最新 稍旧 国内软件 大部分没有(mybatis plus) 有的支持(如:mybatis plus)

    2024年02月09日
    浏览(36)
  • spring事物初始化过程分析

    1.注入4个bd 2.执行 org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#postProcessBeforeInstantiation 逻辑分析:遍历所有的bd: 获取beanname-判断beanname是否有长度并且没有被处理过-是否遍历放入advisedBeans- 是否是基础类-是否该跳过  4大基础类 3.执行org.springframework.aop.framework.autoprox

    2024年02月02日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包