首页/新闻资讯/正文详情

自己动手写一个spring之IOC_4

发布时间:2026/9/26 12:05:54 来源:云帆数科 栏目:资讯中心
自己动手写一个spring之IOC_4
写在前面本文继续完善IOC部分内容主要是增加beanfactory相关内容使其变得更加丰满以及增加事件通知相关内容从而能够更好的感知程序执行的进程以及时做出需要执行的动作。源码 。1增强beanfactory在Java程序语言中我们用一个interface代表一种特性如java.io.Closeable代表需要关闭释放资源或者是一种能力如java.lang.Cloneable代表具备克隆的能力这样特性以及能力互相独立某个类想要拥有某个特性或者是某个能力的话只需要实现对应的接口就行了。这种设计原则还有一个专门的名称interface segregation,即接口隔离原则。我们就来按照接口隔离原则来强化beanfactory。1.1具备信息列举能力的beanfactory/** * 拥有列举能力的bean工厂比如列举所有的bean名称某种类型的bean列表等 */publicinterfaceListableBeanFactoryextendsBeanFactory{booleancontainsBeanDefinition(StringbeanName);intgetBeanDefinitionCount();String[]getBeanDefinitionNames();String[]getBeanNamesForType(Class?type);TMapString,TgetBeansOfType(ClassTtype)throwsBeansException;}比如需要获取某个类型的bean名称列表就可以使用该接口了。1.2具有可配置能力的beanfactory/** * 支持配置的bean工厂比如配置bean处理器等 */publicinterfaceConfigurableBeanFactoryextendsBeanFactory,SingletonBeanRegistry{StringSCOPE_SINGLETONsingleton;StringSCOPE_PROTOTYPEprototype;voidaddBeanPostProcessor(BeanPostProcessorbeanPostProcessor);intgetBeanPostProcessorCount();voidregisterDependentBean(StringbeanName,StringdependentBeanName);String[]getDependentBeans(StringbeanName);String[]getDependenciesForBean(StringbeanName);}比如需要配置后置bean处理器就可以使用该接口。1.3具备信息列举能力的和可配置能力的beanfactory单点麻烦那就直接来个煎饼果子套餐/** * 可列举可配置的套餐接口 */publicinterfaceConfigurableListableBeanFactoryextendsListableBeanFactory,AutowireCapableBeanFactory,ConfigurableBeanFactory{}1.4优化AutowireCapableBeanFactory在前面的内容中AutowireCapableBeanFactory是一个具体的实现类它提供了解析Autowired注解注入bean的能力这里也按照当前的套路进行优化删除原有的AutowireCapableBeanFactory类然后定义AutowireCapableBeanFactory接口/** * 拥有Autowired注解处理能力的bean工厂 */publicinterfaceAutowireCapableBeanFactoryextendsBeanFactory{intAUTOWIRE_NO0;intAUTOWIRE_BY_NAME1;intAUTOWIRE_BY_TYPE2;ObjectapplyBeanPostProcessorsBeforeInitialization(ObjectexistingBean,StringbeanName)throwsBeansException;ObjectapplyBeanPostProcessorsAfterInitialization(ObjectexistingBean,StringbeanName)throwsBeansException;}定义抽象类给出默认的实现publicabstractclassAbstractAutowireCapableBeanFactoryextendsAbstractBeanFactoryimplementsAutowireCapableBeanFactory{}定义实现类publicclassDefaultListableBeanFactoryextendsAbstractAutowireCapableBeanFactoryimplementsConfigurableListableBeanFactory{}DefaultListableBeanFactory就是spring实际使用的bean工厂类了可以看作是IOC的发动机。是核心类。uml图2环境支持定义可以获取系统属性的接口publicinterfacePropertyResolver{booleancontainsProperty(Stringkey);StringgetProperty(Stringkey);StringgetProperty(Stringkey,StringdefaultValue);TTgetProperty(Stringkey,ClassTtargetType);TTgetProperty(Stringkey,ClassTtargetType,TdefaultValue);TClassTgetPropertyAsClass(Stringkey,ClassTtargetType);StringgetRequiredProperty(Stringkey)throwsIllegalStateException;TTgetRequiredProperty(Stringkey,ClassTtargetType)throwsIllegalStateException;StringresolvePlaceholders(Stringtext);StringresolveRequiredPlaceholders(Stringtext)throwsIllegalArgumentException;}按照接口隔离原则定义环境获取能力的接口publicinterfaceEnvironmentCapable{EnvironmentgetEnvironment();}定义总的环境接口publicinterfaceEnvironmentextendsPropertyResolver{String[]getActiveProfiles();String[]getDefaultProfiles();booleanacceptsProfiles(String...profiles);}3事件3.1事件对象/** * 定义应用事件 */publicclassApplicationEventextendsEventObject{privatestaticfinallongserialVersionUID1L;protectedStringmsgnull;publicApplicationEvent(Objectarg0){super(arg0);this.msgarg0.toString();}}继承了java.util.EventObject加入到jdk的事件体系中。3.2监听器对象publicclassApplicationListenerimplementsEventListener{voidonApplicationEvent(ApplicationEventevent){System.out.println(event.toString());}}继承了java.util.EventListener加入到了jdk的时间体系中。3.3容器刷新事件publicclassContextRefreshEventextendsApplicationEvent{privatestaticfinallongserialVersionUID1L;publicContextRefreshEvent(Objectarg0){super(arg0);}publicStringtoString(){returnthis.msg;}}3.4事件发布publicinterfaceApplicationEventPublisher{voidpublishEvent(ApplicationEventevent);voidaddApplicationListener(ApplicationListenerlistener);}实现类publicclassSimpleApplicationEventPublisherimplementsApplicationEventPublisher{ListApplicationListenerlistenersnewArrayList();OverridepublicvoidpublishEvent(ApplicationEventevent){for(ApplicationListenerlistener:listeners){listener.onApplicationEvent(event);}}OverridepublicvoidaddApplicationListener(ApplicationListenerlistener){this.listeners.add(listener);}}负责维护监听器和发布事件。4测试?xml version1.0 encodingUTF-8?beansbeanidbbsclasscom.hc.minispring.ioc.four_beanfactory_and_event.test.BaseBaseServiceinit-methodinitpropertytypecom.hc.minispring.ioc.four_beanfactory_and_event.test.AServiceImplnameasrefaservice//beanbeanidaserviceclasscom.hc.minispring.ioc.four_beanfactory_and_event.test.AServiceImplconstructor-argtypeStringnamenamevalueabc/constructor-argtypeintnamelevelvalue3/propertytypeStringnameproperty1valueSomeone says/propertytypeStringnameproperty2valueHello World!/propertytypecom.hc.minispring.ioc.four_beanfactory_and_event.test.BaseServicenameref1refbaseservice//beanbeanidbaseserviceclasscom.hc.minispring.ioc.four_beanfactory_and_event.test.BaseServiceinit-methodinit/bean/beans测试类publicclassTest1{publicstaticvoidmain(String[]args){ClassPathXmlApplicationContextctxnewClassPathXmlApplicationContext(four_beanfactory_and_event/beans.xml);AServiceaService;BaseServicebService;try{bService(BaseService)ctx.getBean(baseservice);bService.sayHello();}catch(BeansExceptione){e.printStackTrace();}}}运行Context Refreshed... Base Service says hello---four bean injected by annotation Autowired run... Process finished with exit code 0写在后面参考文章列表手把手带你写一个 Mini 。

相关推荐

QtScrcpy终极指南:3步实现电脑键鼠操控安卓手机,游戏办公两不误
QtScrcpy终极指南:3步实现电脑键鼠操控安卓手机,游戏办公两不误

QtScrcpy终极指南:3步实现电脑键鼠操控安卓手机,游戏办公两不误 【免费下载链接】QtScrcpy Android real-time display control software 项目地址: https://gitcode.com/GitHub_Trending/qt/QtScrcpy 想要在电脑大屏上流畅操控手机应用&#xff… · 2026/9/24 7:09:26

OpCore Simplify:5步革命性黑苹果自动化配置指南,轻松构建完美macOS系统
OpCore Simplify:5步革命性黑苹果自动化配置指南,轻松构建完美macOS系统

OpCore Simplify:5步革命性黑苹果自动化配置指南,轻松构建完美macOS系统 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为… · 2026/9/24 19:47:36

FDE大模型实战指南:小白程序员必备高薪技能,速收藏!
FDE大模型实战指南:小白程序员必备高薪技能,速收藏!

FDE(前沿部署工程师)是当前AI领域的新兴岗位,负责将大模型嵌入企业业务流程并优化。文章详细解析了FDE的工作内容、与AI产品经理的区别,以及其薪资待遇和工作形态。FDE需要懂技术和业务,常驻客户现场进行定制化开发&am… · 2026/9/25 0:27:18

十年后回头看,2026 年或许是程序员行业的转折点:用 TaoToken 统一 Key 打通 Codex 与 IDE 的 Agent 工作流
十年后回头看,2026 年或许是程序员行业的转折点:用 TaoToken 统一 Key 打通 Codex 与 IDE 的 Agent 工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 12:05:52

DeskcommCRM设计拆解:将沟通记录自动沉淀为客户资产
DeskcommCRM设计拆解:将沟通记录自动沉淀为客户资产

做CRM的团队我见了不少,大部分最后都死在同一个问题上:一线不愿意录。系统设计得再漂亮,字段规划得再全,只要销售觉得“维护客户资料”是额外负担,这个CRM迟早变成一个谁也不看的成本黑洞。DeskcommCRM这个项目的出发点… · 2026/9/26 12:05:52

SQL处理JOIN查询结果集过大的策略:分页查询与限制返回列实战
SQL处理JOIN查询结果集过大的策略:分页查询与限制返回列实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 12:05:52

嵌入式驱动开发本质:硬件与Linux内核间的翻译工程
嵌入式驱动开发本质:硬件与Linux内核间的翻译工程

1. 这不是写代码,是给硬件“翻译”人话“嵌入式驱动开发忙啥咧”——这句带着北方方言味儿的标题,其实精准戳中了行业里最常被误解的岗位真相。很多人以为驱动工程师就是Linux内核里敲C代码的“高级码农”,实则不然。我干这行十年&#xff0c… · 2026/9/26 12:05:52

WorkBuddy 养虾指南:用 TaoToken 统一 Key 打通 10 个 AI 助手配置
WorkBuddy 养虾指南:用 TaoToken 统一 Key 打通 10 个 AI 助手配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 12:05:45

deepseek免费api 调用指南:用 TaoToken 统一 Key 接入 Cline 的 config.json 配置骨架
deepseek免费api 调用指南:用 TaoToken 统一 Key 接入 Cline 的 config.json 配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 12:05:45

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码