• 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");//使用的驱动类是指定了一个字符串
    
    • 1

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

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

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

    2、使用工厂模式解耦合

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

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

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

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

  • 相关阅读:
    4 线程创建新增方式(JKD 5.0)
    韩顺平java510-515要点笔记
    网易云签到可抽奖?那一年我能签到365天。不信?你看。
    互联网广告人--联合御寒--品牌,代理,平台,达人 多方携手御寒
    什么是RTMP 和 RTSP?它们之间有什么区别?
    d栈上的类
    学习笔记-java函数式编程
    git的使用(从配置到常用命令)
    [问题记录]Qt使用QPainter在QImage、QBitmap、QPixmap上面绘图时出现杂色
    《Python+Kivy(App开发)从入门到实践》自学笔记:高级UX部件——VideoPlayer视频播放
  • 原文地址:https://blog.csdn.net/PIKapikaaaa/article/details/125626363