JAVA工厂模式(手写Spring IOC案例)
通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
源码地址:https://gitee.com/yang-kairui/design-pattern
通过简单模拟spring的IoC容器来尝试工厂模式的使用:
先请出主角ObjectFactory,他只有一个方法getObject(),用来生产对象
@FunctionalInterface
public interface ObjectFactory<T> {/*** 返回由该工厂管理的对象的一个实例(可能是共享的或独立的)。* @return 对象的一个实例*/T getObject() throws Exception;}
再写一个接口BeanFactory用来封装管理bean对象的方法,我只模拟两个方法,一个用来获取bean,一个用来获取bean的工厂
public interface BeanFactory {/*** 通过名称获取bean* @param name bean的名称* @param requiredType bean的字节对象* @param <T> bean的类型* @return*/<T>T getBean(String name,Class<T> requiredType) throws Exception;/*** 获取生成bean的工厂** @param <T> bean的类型* @return bean生产工厂*/<T>ObjectFactory<T> getObjectFactory(Class<T> requiredType);
}
最后实现spring的ioc容器
public class ApplicationContext implements BeanFactory {private final HashMap<String, Object> context = new HashMap<>();@Override@SuppressWarnings("unchecked")public <T> T getBean(String name, Class<T> requiredType) throws Exception {synchronized (this.context) {Object bean = this.context.get(name);if (null != bean) {return (T) bean;}bean = getObjectFactory(requiredType).getObject();this.context.put(name, bean);return (T) bean;}}@Overridepublic <T> ObjectFactory<T> getObjectFactory(Class<T> requiredType) {return requiredType::newInstance;}
}
创建一个map,作为容器保存我们的bean对象,当我们通过name去获取bean,如果容器中存在则直接返回,如果容器中不存在,则通过我们的工厂去生产bean,然后存储在容器中,值得一提的事,工厂中生产bean的方法可以随意实现,这里采用了反射去生产,这也是工厂模式的作用。
23种设计模式JAVA案例
JAVA工厂模式(手写Spring IOC案例)相关推荐
- spring根据名称获取bean_带你从零开始手写 spring ioc 框架,深入学习 spring 源码
IoC Ioc 是一款 spring ioc 核心功能简化实现版本,便于学习和理解原理. 创作目的 使用 spring 很长时间,对于 spring 使用非常频繁,实际上对于源码一直没有静下心来学习过 ...
- 打怪上分! 手写Spring ioc 框架,狠狠的“撸撸”Spring 源码
估计很多朋友使用 spring 很长时间,对于 spring 使用非常频繁,实际上对于源码一直没有静下心来学习过. 你是不是有这样的感觉呢? 但是 spring 源码存在一个问题,那就是过于抽象,导致 ...
- 手写 Spring 事务、IOC、DI 和 MVC
Spring AOP 原理 什么是 AOP? AOP 即面向切面编程,利用 AOP 可以对业务进行解耦,提高重用性,提高开发效率 应用场景:日志记录,性能统计,安全控制,事务处理,异常处理 AOP 底 ...
- 手写Spring DI依赖注入,嘿,你的益达!
手写DI 提前实例化单例Bean DI分析 DI的实现 构造参数依赖 一:定义分析 二:定义一个类BeanReference 三:BeanDefinition接口及其实现类 四:DefaultBean ...
- JAVA项目代码手写吗_一个老程序员是如何手写Spring MVC的
见人爱的Spring已然不仅仅只是一个框架了.如今,Spring已然成为了一个生态.但深入了解Spring的却寥寥无几.这里,我带大家一起来看看,我是如何手写Spring的.我将结合对Spring十多 ...
- 十年java架构师分享:我是这样手写Spring的
人见人爱的 Spring 已然不仅仅只是一个框架了.如今,Spring 已然成为了一个生态.但深入了解 Spring 的却寥寥无几.这里,我带大家一起来看看,我是如何手写 Spring 的.我将结合对 ...
- 30个类仿真手写spring框架V2.0版本
相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...
- 一步一步手绘Spring IOC运行时序图二(基于XML的IOC容器初始化)
相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...
- 05. 手写Spring核心框架
目录 05 手写Spring核心框架 Pt1 手写IoC/DI Pt1.1 流程设计 Pt1.2 基础配置 application.properties pom.xml web.xml Pt1.3 注 ...
最新文章
- jenkins访问页面是那个html,Jenkins自动化代码上线-静态网页篇
- 使用 Stream API 高逼格 优化 Java 代码!
- opencv实现图片HDR功能
- shell脚本执行php文件_分享两个shell脚本实例--批量生成随机字符文件名和批量改名...
- LeetCode 面试题57 - II(剑指offer) 和为s的连续正数序列
- __attribute__编绎属性、关于__init、__initdata、__exit、__exitdata及类似的宏、关于initcall的一些宏定义、__setup宏的来源及使用...
- 【AD】如何将喜欢的图案导出成为丝印层和PCB形状
- leetcode题解3-无重复字符的最长子串
- eclipse导入源码
- c语言10000以内最大的质数,for语句计算输出10000以内最大素数怎么搞最简单??各位大神们...
- Publish over FTP发布报错
- 平滑滤波器模板尺寸与平滑效果的关系_冲压模具丨折弯尺寸、毛刺、、卯合、滑块不顺的根源...
- Nitrux安装JDK-10(Linux通用)教程
- 关于private继承
- 春赏百花秋望月,夏沐凉风冬听雪
- 如何对待每逢佳节被逼婚
- 操作系统管理计算机资源
- autojs网络验证,权朗网络验证源码
- 【ADS学习笔记(一)——ADS介绍】
- HDU - 1173 采矿
热门文章
- 用python解决百马百担问题_利用C语言实现“百马百担”问题方法示例
- android 滚轮刻度尺的实现
- 苹果x重启方法_iPhone12关机的三种方法,哪种最简单?
- idea字体设置--主题下载推荐及使用
- idea 注解制表符_如何在IntelliJ IDEA中使用制表符进行缩进?
- blender3.2 ShaderToRgb 节点修改 导致一些次表面材质 透光失效 解决
- 我爱瞎逛,我爱煮饭。
- 【word文档使用方法记录】论文格式修改
- 【C++进阶】智能指针(万字详解)
- python编程从入门到实践 练习7-8:熟食店