Spring是什么?程序如何解耦?

Spring概述

Spring是什么?

Spring是一个分层的Java SE/EE full-stack(一站式)轻量级开源框架。

以 IoC(Inverse Of Control:反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核。

在java三层架构当中分别提供了相应技术:

表现层(web层) :SpringMVC 框架

业务层(service层) :Bean管理(IOC容器)

持久层(dao/Mapper层) :JdbcTemplate模板对象以及提供了ORM模块整合其他优秀的持久层技术

Spring框架发展历程

1997 年, IBM提出了EJB 的思想
1998 年,SUN制定开发标准规范 EJB1.0
1999 年,EJB1.1 发布
2001 年,EJB2.0 发布
2003 年,EJB2.1 发布
2006 年,EJB3.0 发布

Rod Johnson ( Spring 之父)
Expert One-to-One J2EE Design and Development(2002)
阐述了 J2EE 使用EJB 开发设计的优点及解决方案
Expert One-to-One J2EE Development without EJB(2004)
阐述了 J2EE 开发不使用 EJB的解决方式(Spring 雏形)

2017 年 9 月份发布了 Spring 的最新版本 Spring5.0 通用版(GA)

Spring框架的优势

方便解耦,简化开发 :Spring 就是一个大工厂,可以管理所有对象的创建和依赖关系维护,交给Spring管理

AOP 编程的支持 :可以方便的实现对程序进行权限拦截,日志记录,运行的监控

声明式事务的支持 :通过配置方式完成对事务的管理,无需手动编程

方便程序的测试 :对Junit支持,可以通过注解方便的对Spring程序进行测试

整合外部优秀技术 : Spring内部提供了对各种优秀框架(Hibernate,Mybatis,Quartz等)的直接支持

javaEE技术的封装 :Spring对javaEE开发当中复杂难用的API(JavaEmail, RMI等)进行封装,降低了这些API的使用难度

Spring的体系结构

在这里插入图片描述

程序的耦合和解耦合

什么是程序的耦合?

程序的耦合是程序之间的关联性,也就是多个类的联系是否紧密,多个对象之间的关系是否密切。

内聚:一个模块内各个元素彼此结合的紧密程度

偶然内聚;逻辑内聚;时间内聚;通信内聚;顺序内聚;


**1、偶然内聚:**指一个模块内的各处理元素之间没有任何联系。

**2、逻辑内聚:**指模块内执行几个逻辑上相似的功能,通过参数确定该模块完成哪一个功能。

**3、时间内聚:**把需要同时执行的动作组合在一起形成的模块为时间内聚模块。

**4、通信内聚:**指模块内所有处理元素都在同一个数据结构上操作(有时称之为信息内聚),或者指各处理使用相同的输入数据或者产生相同的输出数据。

**5、顺序内聚:**指一个模块中各个处理元素都密切相关于同一功能且必须顺序执行,前一功能元素输出就是下一功能元素的输入。

**6、功能内聚:**这是最强的内聚,指模块内所有元素共同完成一个功能,缺一不可。与其他模块的耦合是最弱的。耦合性与内聚性是模块独立性的两个定性标准,将软件系统划分模块时,尽量做到高内聚低耦合,提高模块的独立性,为设计高质量的软件结构奠定基础。


耦合:一个软件结构内不同模块之间互连程度的度量

无直接耦合;数据耦合;标记耦合;控制耦合;公共耦合;


1、无直接耦合:如果两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的;

**2、数据耦合:**指两个模块之间有调用关系,传递的是简单的数据值,相当于高级语言的值传递;

**3、标记耦合:**指两个模块之间传递的是数据结构,如高级语言中的数组名、记录名、文件名等这些名字即标记,其实传递的是这个数据结构的地址;

**4、控制耦合:**指一个模块调用另一个模块时,传递的是控制变量(如开关、标志等),被调模块通过该控制变量的值有选择地执行块内某一功能。;

**5、公共耦合:**指通过一个公共数据环境相互作用的那些模块间的耦合。公共耦合的复杂程序随耦合模块的个数增加而增加。

**6、内容耦合:**这是最高程度的耦合,也是最差的耦合。


我们写程序的目标就是 高内聚 低耦合!

高内聚:类与类之间的关系而定。高,意思是他们之间的关系要简单,明了,不要有很强的关系,不然,运行起来就会出问题。一个类的运行影响到其他的类。

低耦合:类内部的方法而言。把程序的功能尽量分散,别在一个类里只写一个或很好的方法,因为那样会给你的调试等带来很多问题。出了错你都不知道在什么地方。

简单来说:一个类调用了多个类叫高内聚,修改其中一个类的方法不影响其他的类叫低耦合

解决程序耦合的思路

1、编译不依赖,运行时才依赖

当我们讲解jdbc时,是通过反射来注册驱动的,代码如下:

Class.forName("com.mysql.jdbc.Driver");//使用的驱动类是指定了一个字符串

​ 此时的好处式,我们的类中在编译阶段不再需要具体的驱动类,就算删除mysql的驱动jar包,依然可以通过编译。在运行阶段才会依赖驱动包。实际开发当中,我们应该做到编译不依赖,运行时才依赖。

​ 上述代码产生的新问题,mysql驱动类的全限定类名作为一个字符串java类中是写死的,一旦发生改变,还需要修改源码。

使用配置文件结合反射就可以解决上述问题。

2、使用工厂模式解耦合

在实际开发中我们可以把三层的对象都使用配置文件配置起来,当启动服务器应用加载的时候,让一个类中的 方法通过读取配置文件,把这些对象创建出来并存起来。在接下来的使用的时候,直接拿过来用就好了。

那么,这个读取配置文件,创建和获取三层对象的类就是工厂。

我们可以把三层的对象都使用配置文件配置起来,当启动服务器应用加载的时候,让一个类中的 方法通过读取配置文件,把这些对象创建出来并存起来。在接下来的使用的时候,直接拿过来用就好了。

那么,这个读取配置文件,创建和获取三层对象的类就是工厂。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮卡丘不断更

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值