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

Spring框架是一个基于IoC和AOP的轻量级Java SE/EE一站式框架,在三层架构中提供全面的技术支持。从SpringMVC到Bean管理和JdbcTemplate,本文详细介绍了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、使用工厂模式解耦合

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

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

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

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

<think>好的,我现在需要回答用户关于Spring应用程序的概念和用途的问题。首先,我得确保自己正确理解Spring框架Spring Boot的区别和联系。根据用户提供的引用内容,引用[2]提到Spring Boot可以独立创建工程,而Spring Cloud基于它。引用[3]说明Spring框架是轻量级且低侵入的。引用[4]和[5]则涉及扩展接口和监控管理功能。 用户的问题有两个部分:Spring应用程序是什么,以及它是如何工作的。我需要先定义Spring应用程序,可能结合Spring框架的核心功能,比如IoC容器、AOP等。然后解释其用途,比如简化企业级应用开发,处理事务、安全、数据访问等。 接下来,关于如何工作,可能需要描述Spring的依赖注入机制,Bean的生命周期,以及Spring Boot如何简化配置。引用[1]提到Spring Boot的核心功能,如自动配置和起步依赖,这些应该在工作原理部分提到。同时,引用[5]中的Actuator和监控功能可能属于Spring Boot的扩展应用,但用户主要问的是工作原理,这部分可能需要简要提及。 需要确保回答结构清晰,分点说明。同时,根据用户的引用,特别是引用[3]中的低侵入性和配置方式,要强调Spring的灵活性。可能还需要提到模块化设计,如Spring MVC、Spring Data等,这些都是Spring应用程序的组成部分。 要避免技术术语过于复杂,用通俗的中文解释。同时,检查是否需要引用提供的资料。比如,在提到自动配置时,可以引用[1]中的内容。提到健康检查或监控时,引用[5]。BeanFactoryPostProcessor在引用[4]中,可能用来说明扩展点。 最后,生成相关问题,可能需要涉及Spring Boot的优势、核心模块、与Spring框架的关系等,参考用户提供的示例问题形式。 现在组织回答结构: 1. 定义Spring应用程序:基于Spring框架Spring Boot构建的企业级应用。 2. 核心概念:IoC容器、依赖注入、AOP等。 3. 主要用途:简化开发,整合模块。 4. 工作原理:依赖注入管理Bean,模块协作,Spring Boot的自动配置。 5. 引用相关内容,如自动配置(引用1)、低侵入性(引用3)、监控(引用5)等。 6. 相关问题部分,生成与Spring核心功能、Boot优势、应用场景相关的问题。</think>### Spring应用程序的概念与工作原理 #### 1. **Spring应用程序是什么?** Spring应用程序是基于**Spring框架**或**Spring Boot**构建的企业级应用程序Spring框架通过**控制反转(IoC)**和**依赖注入(DI)**实现组件管理,提供模块化支持(如数据访问、事务管理、安全等),从而简化复杂应用的开发[^3]。而Spring Boot是Spring的扩展,通过**自动配置**和**起步依赖**进一步降低配置复杂度,支持快速创建独立运行的应用程序[^1]。 #### 2. **核心概念** - **IoC容器**:管理对象的生命周期和依赖关系,开发者无需手动创建对象[^3]。 - **AOP(面向切面编程)**:通过切面统一处理日志、事务等横切关注点。 - **模块化设计**:例如: - **Spring MVC**:处理Web请求。 - **Spring Data**:简化数据库操作。 - **Spring Security**:实现身份验证与授权。 #### 3. **主要用途** - **企业级应用开发**:如电商系统、金融平台。 - **微服务架构**:通过Spring Boot和Spring Cloud构建分布式系统[^2]。 - **快速原型开发**:Spring Boot的自动配置大幅减少初始化时间[^1]。 #### 4. **Spring应用程序如何工作?** 1. **依赖注入与Bean管理** Spring容器(如`ApplicationContext`)根据配置(XML、注解或Java代码)创建并管理Bean。例如: ```java @Service public class UserService { @Autowired private UserRepository repository; // 自动注入依赖 } ``` 2. **模块协作** 各模块通过接口解耦。例如,Spring MVC接收请求后,调用Service层处理业务逻辑,再通过DAO层操作数据库。 3. **Spring Boot的自动配置** 根据项目依赖(如引入`spring-boot-starter-web`)自动配置Tomcat、Spring MVC等组件[^1]。 4. **扩展与监控** - 通过`BeanFactoryPostProcessor`等接口扩展容器行为[^4]。 - 使用Spring Boot Actuator提供健康检查、指标收集等监控功能[^5]。 #### 5. **关键优势** - **低侵入性**:通过注解或配置集成,无需修改业务代码[^3]。 - **灵活性**:支持多种数据源、模板引擎和安全方案。 - **生态丰富**:整合Thymeleaf、Hibernate、Redis等第三方库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

皮卡丘不断更

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

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

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

打赏作者

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

抵扣说明:

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

余额充值