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 注 ...
最新文章
- 从前端框架到前端架构参考资料
- C语言一个双向链表的实现
- boost::mpi模块实现测试mpi版本
- C语言多项式乘法模拟,急!!!!c语言:求n次多项式的加法和乘法
- DNS解析原理与Bind部署DNS服务
- 药房管理(信息学奥赛一本通-T1075)
- 【java】java boolean 源码分析
- mysql是否需要设置外键_数据库到底需不需要设置外键?
- Ubuntu18.04解决sudo执行慢的问题
- mysql从库追主库日志_centos 6.5设置mysql主从同步过程记录
- php mysql 跨库_PHP使用PDO进行跨数据库操作
- SCI科技论文写作成长营(完整版)
- jeecg框架中时间控件时分秒的显示
- 如何删除桌面右键菜单中的英特尔核心显卡选项
- c语言的虚拟变量,含有分类变量(categorical variable)的逻辑回归(logistic regression)中虚拟变量(哑变量,dummy variable)的理解...
- python基础知识
- 金庸感人的经典爱情对白
- 腾讯企业 html邮件模板,腾讯企业邮箱DMARC设置指南(TXT记录)
- 穹顶灯打不出阴暗面_微服务的阴暗面,解释
- 7-148 亲和数判断