Spring4.x(3)---工厂模式设计IOC容器
工厂模式设计IOC容器
IOC容器的底层实现其实就是利用工厂设计模式。接下来我们通过工厂设计模式模拟一个小型的IOC容器,让大家对IOC的底层原理更加清晰些。
一、搭建案例程序
1)CustomerDao接口:
package com.yiidian.dao;public interface CustomerDao {public void save();}
2)CustomerDaoMySQLImpl:(模拟MySQL版本的Dao实现)
package com.yiidian.dao.impl;import com.yiidian.dao.CustomerDao;
/*** * @author http://www.yiidian.com**/
public class CustomerDaoMySQLImpl implements CustomerDao {@Overridepublic void save() {System.out.println("把客户数据保存到mysql数据");}}
3)CustomerService接口:
package com.yiidian.service;
/*** * @author http://www.yiidian.com**/
public interface CustomerService {public void save();
}
4)CustomerServiceImpl实现类:
package com.yiidian.service.impl;import com.yiidian.dao.CustomerDao;
import com.yiidian.dao.impl.CustomerDaoImpl;
import com.yiidian.service.CustomerService;
/*** * @author http://www.yiidian.com**/
public class CustomerServiceImpl implements CustomerService {//1.传统方法,直接new对象.private CustomerDao customerDao = new CustomerDaoImpl();@Overridepublic void save() {customerDao.save();}}
5)ActionDemo类(模拟Struts2的Action):
package com.yiidian.web;import com.yiidian.service.CustomerService;
import com.yiidian.service.impl.CustomerServiceImpl;
/*** * @author http://www.yiidian.com**/
public class ActionDemo {public static void main(String[] args) {//传统方式调用业务,直接new对象CustomerService customerService = new CustomerServiceImpl();customerService.save();}
}
6)运行ActionDemo的main方法,执行结果为:
二、扩展程序,发现问题
1)给CustomerDao接口添加多一个实现类,CustomerDaoOracleImpl(模拟Oracle的Dao实现):
package com.yiidian.dao.impl;import com.yiidian.dao.CustomerDao;
/*** * @author http://www.yiidian.com**/
public class CustomerDaoOracleImpl implements CustomerDao {@Overridepublic void save() {System.out.println("保存客户数据保存Oracle");}}
2)这时我们需要在CustomerServiceImpl类中调用CustomerDaoOracleImpl的方法,需要手动修改代码实现:
package com.yiidian.service.impl;import com.yiidian.dao.CustomerDao;
import com.yiidian.dao.impl.CustomerDaoOracleImpl;
import com.yiidian.service.CustomerService;
/*** * @author http://www.yiidian.com**/
public class CustomerServiceImpl implements CustomerService {//1.传统方法,直接new对象.//private CustomerDao customerDao = new CustomerDaoMySQLImpl();private CustomerDao customerDao = new CustomerDaoOracleImpl(); //(弊端:耦合性太高,修改源代码)@Overridepublic void save() {customerDao.save();}}
3)运行ActionDemo,查看结果:
总结问题:我们每次为CustomerDao接口扩展了实现类,业务层需要修改代码才可以实现切换具体的实现类,这种做法为“硬编码”
方式,扩展性不好!接下来开始引用工厂设计模式
改造程序。
三、利用工厂设计模式,改造程序
1)编写一个BeanFactory类,用于读取配置文件,创建程序需要的对象:
package com.yiidian.ioc;import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;/*** 创建对象的工厂(模拟简单IOC容器)* @author http://www.yiidian.com**/
public class BeanFactory {/*** 初始化beans.properties文件*/private static Properties props = new Properties();static{InputStream in = BeanFactory.class.getResourceAsStream("/beans.properties");try {props.load(in);} catch (IOException e) {e.printStackTrace();System.out.println("加载beans.properties文件失败");}}/*** 从工厂获取一个对象* @return*/public static Object getBean(String name){//根据name创建不同的对象//1.通过name在properties文件找到类名称String className = props.getProperty(name);//2.通过反射构造类的对象try {return Class.forName(className).newInstance();} catch (Exception e) {e.printStackTrace();}return null;}
}
2)在src目录编写beans.properties配置文件:
beans.properties:
customerDao=com.yiidian.dao.impl.CustomerDaoMySQLImpl
3)改造CustomerServiceImpl类:
/*** * @author http://www.yiidian.com**/
public class CustomerServiceImpl implements CustomerService {//1.传统方法,直接new对象.//private CustomerDao customerDao = new CustomerDaoMySQLImpl();//private CustomerDao customerDao = new CustomerDaoOracleImpl(); //(弊端:耦合性太高,修改源代码)//2.IOC容器private CustomerDao customerDao = (CustomerDao) BeanFactory.getBean("customerDao");@Overridepublic void save() {customerDao.save();}}
4)运行ActionDemo,这时可以调用Dao程序,这时如果需求切换到CustomerDaoOracleImpl,只需要修改beans.properties,改为:
customerDao=com.yiidian.dao.impl.CustomerDaoOracleImpl
再次运行ActionDemo,可以看到已经成功切换到Oracle的Dao实现啦!
到此为止,BeanFactory就是一个小型的IOC容器,可以创建我们程序中需要的一些对象。事实上,Spring的IOC容器的底层就是类似BeanFactory的原理
!
源码下载: http://pan.baidu.com/s/1geJrQCF
Spring4.x(3)---工厂模式设计IOC容器相关推荐
- Java:利用工厂模式设计加减乘除功能的计算器
使用简单工厂模式开发一个包含加减乘除功能的计算器. 思路如下: 1.构造一个计算器抽象类:属性:含有两个参与计算的数字:方法:获取返回计算结果. 2.创建加法.减法.乘法.除法功能子类,继承计算器,在 ...
- 二、工厂模式——在工厂里能找到你的对象
文章目录 工厂模式 1. 简单工厂 2. 缓存方式 3. 工厂模式 4. 工厂的工厂 5. 抽象工厂 6. 工厂模式与IOC容器 总结 设计模式是面向问题.场景而总结产生的设计思路.是解决问题的套路. ...
- Java23种设计模式之工厂模式
工厂模式 前言 一.简单工厂模式 二.工厂方法模式 优点: 缺点: 三.工厂方法模式适合应用场景 总结 前言 核心本质: 1.实例化对象不使用new,用工厂方法代替, 2.将选择实现类,创建对象统一管 ...
- Unity实现IOC容器
测试代码链接 控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其中最常见的方式叫做依赖注入(Dependency ...
- getinstance方法详解_二、设计模式总览及工厂模式详解
二.架构师内功心法之设计模式 2.架构师内功心法之设计模式 2.1.课程目标 1.通过对本章内容的学习,了解设计模式的由来. 2.介绍设计模式能帮我们解决哪些问题. 3.剖析工厂模式的历史由来及应用场 ...
- java bean 工厂模式_Spring框架通过工厂创建Bean的三种方式实现
工厂模式 Spring中bean的创建,默认是框架利用反射new出来的bean实例.有时候也会有一些复杂的情况. 假设有一个飞机,属性如下,现在需要造很多同型号的飞机,那么唯一需要改变的属性只有Dri ...
- Spring框架学习[IoC容器高级特性]
1.通过前面4篇文章对Spring IoC容器的源码分析,我们已经基本上了解了Spring IoC容器对Bean定义资源的定位.读入和解析过程,同时也清楚了当用户通过getBean方法向IoC容器获取 ...
- IOC 容器中那些鲜为人知的细节(关于 FactoryBean 和 BeanFactory)
1.博客内容均出自于咕泡学院架构师第三期 2.架构师系列内容:架构师学习笔记(持续更新) 在 Spring 中,有两个很容易混淆的类:BeanFactory 和 FactoryBean. BeanFa ...
- Java工厂模式(随笔)
目录 前言 一.三大工厂模式以及特殊工厂模式介绍 1.简单工厂模式简介(Simple Factory Pattern) 2.工厂模式简介 (Factory Pattern) 3.抽象工厂模式简介 ...
最新文章
- linux信号使用,linux信号使用注意事项
- C++两个整数的总和是否为整数溢出的算法实现(附完整源码)
- 8.1 文件查找local;find使用
- python dict底层实现_dict实现原理和哈希表
- mysql5.6触发器,MYSQL5.6创建存储过程和触发器
- Java程序员的日常
- go 计算文件sha-256_Kubernetes入门实践--部署运行Go项目
- (转)服务器控件三个ID
- 论文用impact、effect、influence 什么区别
- 三维空间中的Pitch、Yaw、Roll值
- C++程序设计一、二(二元一次方程与函数、函数指针)
- UE4读取scv文件 -- 数据驱动游戏性元素
- 服务器日志默认存放位置,系统日志和IIS日志存放路径
- 百度图像识别明星或动物
- jupyter无法重命名,文件不可信,后台被自动关闭
- DTL相关知识整理初稿
- 苹果自带相册打马赛克_科普 | 谨慎使用苹果自带的笔打码订单哦!
- 华为使用计算机投屏要打开什么,华为手机怎么投屏到电脑?这些小屏变大屏的操作你会吗...
- Python Set 与 dict
- 我的Lenovo ThinkPad R60e 键盘按键失灵!
热门文章
- c语言的局部指针,C中局部变量指针问题
- 【Shell教程】四----输入输出,条件判断,循环
- ROS 教程之 navigation : 用 move_base 控制自己的机器人(2)
- 带你一文看懂--应用层、传输层的协议,HTTP协议及实现,UDP和TCP的报文格式以及为什么3次握手和4次挥手
- 卸载centos7自带mysql_centos7完全卸载mysql
- HttpClient调用http接口(POST)
- 原生javascript添加和删除class
- CSS设置背景透明字体不透明
- 取两堆石子(威佐夫博弈)
- git 空提交和重置提交者(转载)