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

BeanPostProcessor

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

		// 2.判断是否是postProcessorfor (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.判断是否有Componentfor (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的字段......

最后执行这些代码

				// initbeanFactory.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 {// @PostConstructList<Method> postConstruct = beanScanner.getPostConstruct(bean);for (Method method : postConstruct) {method.invoke(bean);}// InitializingBeanif (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 {@Overridepublic Object postProcessBeforeInitialization(Object bean) {System.out.println("postProcessBeforeInitialization");return BeanPostProcessor.super.postProcessBeforeInitialization(bean);}@Overridepublic 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;@Overridepublic void setBeanName(String beanName) {System.out.println(beanName);}@PostConstructpublic void init(){System.out.println("postConstruct");}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) {System.out.println(applicationContext.getBeanMap().toString());}@Overridepublic void setBeanFactory(BeanFactory beanFactory) {System.out.println(beanFactory.getBeanMap().toString());}@Overridepublic void afterPropertiesSet() {System.out.println("afterPropertiesSet");}
}

结果
在这里插入图片描述

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

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

相关文章

postgre 12.11单实例安装文档

一 下载 访问https://www.postgresql.org/download/&#xff0c;点击左侧的‘source进行下载&#xff0c;一般选择bz2的安装包。 二 安装 这里安装12.11版本的postgre&#xff0c;数据目录路径为/data/server/pgdata&#xff0c;端口为5432. 2.1 安装依赖包 #安装 yum in…

Redis图文指南

1、什么是 Redis&#xff1f; Redis&#xff08;REmote DIctionary Service&#xff09;是一个开源的键值对数据库服务器。 Redis 更准确的描述是一个数据结构服务器。Redis 的这种特殊性质让它在开发人员中很受欢迎。 Redis不是通过迭代或者排序方式处理数据&#xff0c;而是…

Jmeter系列-Jmeter面板介绍和常用配置(2)

Jmeter面板介绍 常用菜单栏 分布式运行相关的 选项&#xff0c;可以打开日志&#xff0c;修改语言、函数助手对话框&#xff0c;还有管理插件 常用的图标 从左到右依次 新建测试计划选择测试计划模板创建一个新的测试计划打开jmeter脚本保存jmeter脚本剪切复制粘贴展开目录…

IP地址、子网掩码、网络地址、广播地址、IP网段

文章目录 IP地址IP地址分类子网掩码网络地址广播地址IP网段 本文主要讨论iPv4地址。 IP地址 实际的 IP 地址是一串32 比特的数字&#xff0c;按照 8 比特&#xff08;1 字节&#xff09;为一组分成 4 组&#xff0c;分别用十进制表示然后再用圆点隔开&#xff0c;这就是我们平…

css实现滚动条一直显示,并且实现滚动条样式的修改

css实现滚动条一直显示&#xff0c;并且实现滚动条样式的修改 自带的滚动条只有当鼠标移上去的时候才会显示&#xff0c;其他时候隐藏&#xff0c;这样用户很难看出这个是能划动的&#xff0c;这就需要滚动条一直显示在页面上&#xff0c;并且需要按照自己一定的样式去修改。 …

Unity ProBuilder(自己创建斜面、拐角)

目录 基础操作 下载 打开面板 新增对象 材质保存 1.斜面实例 2.拐角实例 3.切割实例 4.单独面赋值 基础操作 下载 打开面板 新增对象 选中想创建的块体后&#xff0c;在编辑器见面拉出块体 材质保存 打开材质编辑器后&#xff0c;将材质赋值&#xff0c;之后&am…

Datawhale × 和鲸科技丨《2023 中国人工智能人才学习白皮书》发布!

2023 是一个历史性的年份&#xff0c;它标志着人工智能技术的崛起与普及&#xff0c;这一年里&#xff0c;AI 不仅在科技、经济、社会、文化等各个领域取得突破性的进展&#xff0c;也在人类日常生活中扮演愈加重要的角色。随着人工智能时代的加速到来&#xff0c;我国 AI 人才…

【SpringBoot】统一功能处理

目录 &#x1f383;1 拦截器 &#x1f380;1.1 拦截器的代码实现 &#x1f3a8;1.2 拦截器的实现原理 &#x1f9f6;2 拦截器应用——登录验证 &#x1f9ba;3 异常统一处理 &#x1f3ad;4 统一数据返回格式 &#x1f9e4;4.1 为什么需要统一数据返回格式 &#x1f9e3;4.2 统…

MySQL 存储引擎,你了解几个?

引言 MySQL是一种流行的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它支持多种不同的数据库引擎。数据库引擎是用于存储、管理和检索数据的核心组件&#xff0c;它们直接影响着数据库的性能、可靠性和功能&#xff0c;接下来本文介绍下一些常见的MySQL数据…

外滩大会今日开幕 近20位“两院”院士、诺贝尔奖和图灵奖得主齐聚

2023 Inclusion外滩大会9月7日在上海黄浦世博园正式开幕。这场以“科技创造可持续未来”为主题的大会为期三天&#xff0c;近20位“两院”院士、诺贝尔奖和图灵奖得主&#xff0c;全球超500位有影响力的科技领军企业和专家学者&#xff0c;将在此带来一场科技、人文和产业的思想…

Python入门自学进阶-Web框架——40、redis、rabbitmq、git——3

git&#xff0c;一个分布式的版本管理工具。主要用处&#xff1a;版本管理、协作开发。 常见版本管理工具&#xff1a; VSS —— Visual Source Safe CVS —— Concurrent Versions System SVN —— CollabNet Subversion GIT GIT安装&#xff1a;下载安装文件&#xff1a;…

大数据安全 | (一)介绍

目录 &#x1f4da;大数据安全 &#x1f407;大数据安全内涵 &#x1f407;大数据安全威胁 &#x1f407;保障大数据安全 ⭐️采集环节安全技术 ⭐️存储环节安全技术 ⭐️挖掘环节安全技术 ⭐️发布环节安全技术 &#x1f407;大数据用于安全 &#x1f4da;隐私及其…