第一章--Spring工厂设计模式消除耦合
1.什么是Spring
Spring是一个轻量级的JavaEE解决方案,整合众多优秀的设计模式
- 轻量级
1.对于运行环境是没有额外要求的
开源 tomcat resion jetty
收费 weblogic websphere
2. 代码移植性高
不需要实现额外接口
- JavaEE的解决方案
- 整合设计模式
- 工厂
- 代理
- 模板
- 策略
2.设计模式
1.广义概念
面向对象设计中,解决特定问题的经典代码
2.狭义概念
GDF4人帮定义的23种设计模式:工厂、适配器、装饰器、门面、代理、模板......
2.1工厂设计模式
1.概念:通过工厂类创建对象
2.好处:解耦合
耦合:指的是代码间的强关联关系,一方的改变会影响另一方
问题:不利于代码维护
简单的理解为把接口的实现类,硬编码在程序中:
UserService userService = new UserServiceImpl();
2.2 如何理解耦合
下面通过一段代码帮助理解耦合:
1.创建持久层接口和实现类
package com.dao;
/** 模拟持久层操作 * */
public interface IAccountDao { void saveAccount();
}
//---------------------------------
package com.dao.impl;
import com.dao.IAccountDao;
public class AccountDaoimpl implements IAccountDao { public void saveAccount() {System.out.println("保存了账户");}
2.创建业务层接口和实现类package com.service; /** 模拟业务层接口 * */ public interface IAccountService {//模拟保存void saveAccount(); }// -----------------------------------package com.service.impl;import com.dao.IAccountDao; import com.dao.impl.AccountDaoimpl; import com.service.IAccountService; public class AccountServiceImpl implements IAccountService { //业务层中获取持久层对象 private IAccountDao accountDao=new AccountDaoimpl(); public void saveAccount() { //业务层调用持久层dao接口 accountDao.saveAccount();} }3.表现层调用import com.service.IAccountService; import com.service.impl.AccountServiceImpl; /** 模拟表现层调用业务层 * */public class Client { public static void main(String[] args) { //下面这句也有耦合,假如AccountServiceImpl改变功能成AccountServiceImplNew();//则就要 IAccountService accountService = new AccountServiceImplNew(); IAccountService accountService = new AccountServiceImpl(); accountService.saveAccount();} }
这个时候运行时毫无疑问的,但是该项目之间类与类之间的依赖关系是非常紧密的,这就是我们需要进行解决的问题,类与类之间的依赖过高,耦合性太强。(我们可以试想下,当把持久层的实现类给删掉的话,那么整个程序就会出现编译时期的错误,注意,这里是错误,而不仅仅是异常)
2.3工厂模式常见对象
public class BeanFactory {//工厂方法只用于创建对象 是个工具类public static UserService getUserService(){//让耦合出现在了这里return (UserService) new UserServiceImpl();}
}//====================
public class TestSpring {@Testpublic void test1(){//原本耦合代码:UserServiceImpl userService1 = new UserServiceImpl();//通过工厂类获取对象 消除耦合UserService userService =BeanFactory.getUserService();//在这里已经没有耦合 因为接口UserService的实现类在这句代码中是没有任何体现的。}
}
3.只使用反射可以消除耦合吗?
Class clazz = Class.forName("com.dy.basic.UserServiceImpl");
//(耦合字符串)在这句字符串中出现了耦合,因为如果UserServiceImpl要修改成UserServiceImplNew,又要改这句代码。
UserService userService = (UserService) clazz.newInstance();
return userService;
4.如何彻底消除(转移)耦合–(反射+配置文件)
#key-value形式
userService = com.dy.basic.UserServiceImpl
public class BeanFactory {//Properties类型的集合private static Properties env = new Properties();static {//第一步 获得IO输入流 getResourceAsStream()方法以InputStream对象的形式返回此类的指定资源。InputStream inputStream = BeanFactory.class.getResourceAsStream("/dy.properties");//第二步 在resources文件夹下 创建配置文件dy.properties 文件内容 封装 Properties集合中//key = userService value = com.dy.basic.UserServiceImpl//userService = com.dy.basic.UserServiceImpl//这一步将文件当中的key作为了Properties集合中的key,文件中的value作为了Properties集合中的value;env.load(inputStream);inputStream.close();}//工厂方法只用于创建对象 工具类public static UserService getUserService() {//userService作为key传过来,取到值com.dy.basic.UserServiceImplClass clazz = Class.forName(env.getProperty("userService"));UserService userService = (UserService) clazz.newInstance();return userService;}
}
/*
如果创建了新的实现类UserServiceImplNew,则只需要在配置文件中将
userService = com.dy.basic.UserServiceImpl改成
userService = com.dy.basic.UserServiceImplNew即可
*/
5.通用工厂的设计(简单工厂会存在代码冗余)
public static UserService getUserService() throws ClassNotFoundException, IllegalAccessException, InstantiationException {UserService userService = null;//userService作为key传过来,取到值com.dy.basic.UserServiceImplClass clazz = Class.forName(env.getProperty("userService"));//这个方法在上述的类BeanFactory 里 env是Properties集合的对象userService = (UserService) clazz.newInstance();return userService;
}
public static UserDao getUserDao() throws ClassNotFoundException, IllegalAccessException, InstantiationException {UserDao userDao = null;Class clazz = Class.forName(env.getProperty("userDao"));userDao = (UserDao) clazz.newInstance();return userDao;如上述代码所示,每次创建一个对象都需要创建一个方法,方法中有冗余代码(重复的代码多),不一样的代码就是env.getProperty("userDao")这一句。如何消除冗余代码呢?
一般方法的结构:修饰符+返回值+方法名+参数(可有可无)+异常(可有可无)
通过观察上述工厂的方法写出通用方法:public static Object getBean(String key){Object ret = null;try{//上述代码是直接抛出的异常,这里我们用try catchClass clazz = Class.forName(env.getProperty(key));ret = clazz.newInstance();}catch(Exception e){e.printStackTrace();}return ret;
} //通用代码写完后,将冗余代码注释掉,此时需要修改实现类UserServiceImpl和测试类的代码:private UserDao userDao;{try {//因为getBean()返回的是Object,实际我们需要的是UserDao,所以得强制类型转换userDao = (UserDao) BeanFactory.getBean("userDao");//修改之前是 userDao = (UserDao) BeanFactory.getUserDao();} catch (Exception e) {e.printStackTrace();}
通用工厂的使用方式
1.定义类型(类)
2.通过配置文件的配置告知工厂 key = value
3.通过工厂获得类的对象
Object ret = BeanFactory.getBean("key")
-------------------------------------------------
Spring本质:工厂 ApplicationContext( applicationContext.xml)
本系列文章从Spring5原理开始深入浅出,从工厂特性=>依赖注入–IOC=>AOP编程=>Spring事务=>纯注解开发。本文来自观看B站孙帅Spring教程后做的笔记。持续更新…
第一章--Spring工厂设计模式消除耦合相关推荐
- 第一章 Spring的简单剖析
第一章 Spring的简单剖析 简单的说Spring是什么呢?如果单从字面上理解它,可以解释为: 春天, 跃起, 弹性-.中国有句名言:"一年四季在于春".在字面可以想 ...
- spring in action学习-第一章 spring之旅
首先我先吐槽一下这本书的封面图,我能理解成一个包着头巾的男人举着个水壶昂首挺胸,最后给你个眼神....开玩笑的这幅插图是约旦西南部卡拉克省的居民,那里的山顶有座城堡,对死海和平原有极佳的视野,这幅图出 ...
- 框架设计--第一章 Spring的基本应用--习题答案
摘要:微信搜索[三桥君] 课程介绍:"框架技术"是软件工程专业的核心课程,是本专业限选课,是Java 应用开发课程,是本专业学生就业的主要方向. 说明:框架设计其他章节的习题答案也 ...
- 第一章 Spring基础
第一章 Spring基础 1.1 Spring介绍 Spring是一个框架,框架是高度抽取.可重用的代码的一种设计.Spring就是多个可重用的模块的集合,从而形成一个领域的整体解决方案. Sprin ...
- 19年8月 字母哥 第一章 spring boot 2.x基础及概念入门 这里全部看完了 热部署没出来 第二章在前面2页 用热点公司网不行
http://springboot.zimug.com/1233100 文档 http://www.zimug.com/page/5 字母哥个人博客 11111 第一章 spring bo ...
- 第一章 —— 简单工厂模式(节选自:《大话设计模式》)
1.4 面向对象编程 所有编程初学者碰到问题都会直觉地用计算机能够理解的逻辑来描述和表达待解决的问题及具体的求解过程.这其实是用计算机的方式去思考,比如计算器这个程序:先要求输入两个数和运算符号,然后 ...
- Spring实战 | 第一部分 Spring的核心(第一章 Spring之旅)
Spring的bean容器 介绍Spring的核心模块 更为强大的Spring生态系统 Spring的新功能 一.简化java开发 为了降低Spring开发的复杂性,Spring采取了以下4钟关键策略 ...
- 《Spring实战》第一章 — Spring之旅
2019独角兽企业重金招聘Python工程师标准>>> 1.1 使用Spring简化Java开发 为了降低Java开发,Spring使用了一下4种关键策略: 基于POJO的轻量级和最 ...
- 《Java EE企业级应用开发教程(SSM)》练习题答案---第一章Spring的基本应用(仅供参考)
多选题 1.以下有关Spring核心容器的说法正确的是(). A.Spring框架提供了两种核心容器,分别为BeanFactory和ApplicationContext B.BeanFactory由o ...
最新文章
- 分享一些国外推广的站点
- YUM更换源(1)--yum找不到安装包 2013-01-18 20:08 8687人阅读 评论(1) 收藏 举报 分类: linux(70) 公司提供的CentOS VM中,/etc/yum.r
- SpringCloud LoadBalancerClient 负载均衡原理
- 【工作笔记】ElasticSearch —— 常用插件/工具汇总
- 一文“妙”解逻辑斯蒂回归(LR)算法
- 每日一天:对象数组去重
- “NTLDR is missing”和”NTLDR is compressed”的解决办法
- Dynamics CRM 2015中的SSRS Report集成配置
- Java中Word转PDF解决方案
- 三国之空城计游戏攻略
- NoSQLBooster for MongoDB 7.0.5
- PostgreSQL命令行常用命令psql
- 油猴插件swagger复制路由等
- Domino V12 Beta新玩法
- Android轻松实现日期选择器、生日选择器、自定义起始时间
- Gvim插件NERDTree安装
- add as library是什么?有什么用?如何打开?
- (离散数学)用谓词逻辑推理的方法证明下面推理的有效性。要求按照推理的格式书写推理过程。
- dellr740服务器智能风扇开启,dell r740服务器 BIOS设置
- 基于java面对对象编程范式笔记
热门文章
- Tomcat配置(dbcp连接池、连接池加密、日志分割)
- HTML网页设计自动适应屏幕宽度
- jeee的基础知识(转载)
- 回溯算法2——填字游戏
- [BZOJ2154]Crash的数字表格 莫比乌斯反演
- Palette(调色板)
- Python中[m: ]、[ :n]、[m:n]、[m::n]的含义
- 论文笔记 | 中国区域文化地图:“大一统” 抑或“多元化”?
- 保存数组为二进制文件并读取
- 处理MTK中DuraSpeed(快霸)引起的app被莫名其妙kill掉