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、使用工厂模式解耦合
在实际开发中我们可以把三层的对象都使用配置文件配置起来,当启动服务器应用加载的时候,让一个类中的 方法通过读取配置文件,把这些对象创建出来并存起来。在接下来的使用的时候,直接拿过来用就好了。
那么,这个读取配置文件,创建和获取三层对象的类就是工厂。
我们可以把三层的对象都使用配置文件配置起来,当启动服务器应用加载的时候,让一个类中的 方法通过读取配置文件,把这些对象创建出来并存起来。在接下来的使用的时候,直接拿过来用就好了。
那么,这个读取配置文件,创建和获取三层对象的类就是工厂。