解读优秀的Java开发应用框架系列:Spring框架解读【持续更新】

Spring 专栏收录该内容
10 篇文章 0 订阅

0. What is Spring Framework?

0.1 Spring是什么?

The Spring Framework is a lightweight solution and a potential one-stop-shop for building your enterprise-ready applications. However, Spring is modular, allowing you to use only those parts that you need, without having to bring in the rest. You can use the IoC container, with any web framework on top, but you can also use only theHibernate integration code or the JDBC abstraction layer. The Spring Framework supports declarative transaction management, remote access to your logic through RMI or web services, and various options for persisting your data. It offers a full-featured MVC framework, and enables you to integrate AOP transparently into your software.
Spring is designed to be non-intrusive, meaning that your domain logic code generally has no dependencies on the framework itself. In your integration layer (such as the data access layer), some dependencies on the data access technology and the Spring libraries will exist. However, it should be easy to isolate these dependencies from the rest of your code base.

一句话,Spring是一个开发应用框架,什么样的框架呢,有这么几个标签:轻量级、非侵入式、一站式、模块化,其目的是用于简化企业级应用程序开发。我们知道应用程序是由一组相互协作的对象组成,而在传统应用程序开发中,一个完整的应用是由一组相互协作的对象组成。所以开发一个应用除了要开发业务逻辑之外,最多的是关注如何使这些对象协作来完成所需功能,而且要低耦合、高内聚。业务逻辑开发是不可避免的,那如果有个框架出来帮我们来创建对象及管理这些对象之间的依赖关系。当然,我们也可以通过自我能力,利用前人总结出来的设计模式来进行我们的架构设计,比如常见的「工厂模式」、「代理模式」等,总共有23种模式,利用别人总结的轮子来进行我们自己轮子建造,但如何这些轮子建造专门交给一个叫做Spring的人去帮你做,你只需要专心你的业务逻辑,是不是省心很多,同时这个叫Spring干的又专业又稳定,何乐而不为呢。
从这里我们可以认为Spring是一个超级粘合平台,除了自己提供功能外,还提供粘合其他技术和框架的能力,从而使我们可以更自由的选择到底使用什么技术进行开发。

0.2 Spring带来了什么?

Spring除了不能帮我们写业务逻辑,却能帮助我们简化开发,有以下几点:

  1. Spring能帮我们根据配置文件创建及组装对象之间的依赖关系。
  2. Spring面向切面编程能帮助我们无耦合的实现日志记录,性能统计,安全控制。
  3. Spring能非常简单的帮我们管理数据库事务。
  4. Spring还提供了与第三方数据访问框架(如JPA)无缝集成,而且自己也提供了一套JDBC访问模板,来方便数据库访问。
  5. Spring还提供与第三方Web(如Struts、JSF)框架无缝集成,而且自己也提供了一套Spring MVC框架,来方便web层搭建。
  6. Spring能方便的与Java EE(如Java Mail、任务调度)整合,与更多技术整合(比如SpringBoot的各种starter)。

0.3 Spring有什么好处

在看Spring的好处之前,先来理解以下几个专业名词:
应用程序:是能完成我们所需要功能的成品,比如购物网站、OA系统、ERP系统。
框架:是能完成一定功能的半成品,比如我们可以使用框架进行购物网站开发;框架做一部分功能,我们自己做一部分功能,这样应用程序就创建出来了。而且框架规定了你在开发应用程序时的整体架构,提供了一些基础功能,还规定了类和对象的如何创建、如何协作等,从而简化我们开发,让我们专注于业务逻辑开发。
非侵入式设计:从框架角度可以这样理解,无需继承框架提供的类,这种设计就可以看作是非侵入式设计,如果继承了这些框架类,就是侵入设计,如果以后想更换框架之前写过的代码几乎无法重用,如果非侵入式设计则之前写过的代码仍然可以继续使用。
轻量级&重量级:轻量级是相对于重量级而言的,轻量级一般就是非入侵性的、所依赖的东西非常少、资源占用非常少、部署简单等等,其实就是比较容易使用,而重量级正好相反。
POJO:POJO(Plain Old Java Objects)简单的Java对象,它可以包含业务逻辑或持久化逻辑,但不担当任何特殊角色且不继承或不实现任何其它Java框架的类或接口。
容器:在日常生活中容器就是一种盛放东西的器具,从程序设计角度看就是装对象的的对象,因为存在放入、拿出等操作,所以容器还要管理对象的生命周期。
控制反转:即Inversion of Control,缩写为IoC,控制反转还有一个名字叫做依赖注入(Dependency Injection),就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。
Bean:一般指容器管理对象,在Spring中指Spring IoC容器管理对象。

那么用Spring框架到底有什么好处呢?好处如下:
非常轻量级的容器:以集中的、自动化的方式进行应用程序对象创建和装配,负责对象创建和装配,管理对象生命周期,能组合成复杂的应用程序。Spring容器是非侵入式的(不需要依赖任何Spring特定类),而且完全采用POJOs进行开发,使应用程序更容易测试、更容易管理。而且核心JAR包非常小,以Spring3为例,Spring3.0.5不到1M,而且不需要依赖任何应用服务器,可以部署在任何环境(Java SE或Java EE)。
AOP:AOP是Aspect Oriented Programming的缩写,意思是面向切面编程,提供从另一个角度来考虑程序结构以完善面向对象编程(相对于OOP),即可以通过在编译期间、装载期间或运行期间实现在不修改源代码的情况下给程序动态添加功能的一种技术。通俗点说就是把可重用的功能提取出来,然后将这些通用功能在合适的时候织入到应用程序中;比如安全,日记记录,这些都是通用的功能,我们可以把它们提取出来,然后在程序执行的合适地方织入这些代码并执行它们,从而完成需要的功能并复用了这些功能。
简单的数据库事务管理:在使用数据库的应用程序当中,自己管理数据库事务是一项很让人头疼的事,而且很容易出现错误,Spring支持可插入的事务管理支持,而且无需JEE环境支持,通过Spring管理事务可以把我们从事务管理中解放出来来专注业务逻辑。
JDBC抽象及ORM框架支持:Spring使JDBC更加容易使用;提供DAO(数据访问对象)支持,非常方便集成第三方ORM框架,比如Hibernate等;并且完全支持Spring事务和使用Spring提供的一致的异常体系。
灵活的Web层支持:Spring本身提供一套非常强大的MVC框架,而且可以非常容易的与第三方MVC框架集成,比如Struts等。
简化各种技术集成:提供对Java Mail、任务调度、JMX、JMS、JNDI、EJB、动态语言、远程访问、Web Service等的集成。

0.4 Spring结构图

Spring结构图从中可以看到Spring Framework差不多有20个模块组成,这些模块分为核心容器,数据访问/集成,Web,AOP(面向方面的编程),Instrumentation,消息传递和测试,如上图所示。

0.4.1 Core Container

Core Container模块,包含spring-beans、spring-core、spring-context、spring-expression四个方面。
spring-core和spring-beans:提供了框架的基础部分,包括反转控制和依赖注入功能。其中Bean Factory是容器核心,本质是“工厂设计模式”的实现,而且无需编程实现“单例设计模式”,单例完全由容器控制,而且提倡面向接口编程,而非面向实现编程;所有应用程序对象及对象间关系由框架管理,从而真正把你从程序逻辑中把维护对象之间的依赖关系提取出来,所有这些依赖关系都由BeanFactory来维护。
spring-context:这个模块建立在core和bean模块提供坚实的基础上,集成Beans模块功能并添加资源绑定、数据验证、国际化、Java EE支持、容器生命周期、事件传播等;核心接口是ApplicationContext。
spring-expression:提供强大的表达式语言支持,支持访问和修改属性值,方法调用,支持访问及修改数组、容器和索引器,命名变量,支持算数和逻辑运算,支持从Spring 容器获取Bean,它也支持列表投影、选择和一般的列表聚合等。

0.4.2 AOP and Instrumentation

AOP and Instrumentation模块,包含spring-aop、spring-instrument两个方面。
spring-aop: Spring AOP模块提供了符合 AOP Alliance规范的面向方面的编程(aspect-oriented programming)实现,提供比如日志记录、权限控制、性能统计等通用功能和业务逻辑分离的技术,并且能动态的把这些功能添加到需要的代码中;这样各专其职,降低业务逻辑和通用功能的耦合。
spring-instrument: 在特定的应用程序服务器中支持类和类加载器的实现,比如Tomcat。

0.4.3 Messaging

Messaging,从Spring Framework 4开始集成了MessageChannel, MessageHandler等,用于消息传递的基础。

0.4.4 Data Access / Integration

Data Access/Integration,包括了JDBC、ORM、OXM、JMS和事务管理。
事务模块:该模块用于Spring管理事务,只要是Spring管理对象都能得到Spring管理事务的好处,无需在代码中进行事务控制了,而且支持编程和声明性的事物管理。
spring-jdbc: 提供了一个JBDC的样例模板,使用这些模板能消除传统冗长的JDBC编码还有必须的事务控制,而且能享受到Spring管理事务的好处。
spring-orm: 提供与流行的“对象-关系”映射框架的无缝集成,包括Hibernate、JPA、Ibatiss等。而且可以使用Spring事务管理,无需额外控制事务。
spring-oxm: 提供了一个对Object/XML映射实现,将java对象映射成XML数据,或者将XML数据映射成java对象,Object/XML映射实现包括JAXB、Castor、XMLBeans和XStream。
spring-jms: 用于JMS(Java Messaging Service),提供一套 “消息生产者、消息消费者”模板用于更加简单的使用JMS,JMS用于用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。

0.4.5 Web

Web 包含了spring-web, spring-webmvc, spring-websocket, and spring-webmvc-portlet几个模块。
spring-web: 提供了基础的web功能。例如多文件上传、集成IoC容器、远程过程访问(RMI、Hessian、Burlap)以及Web Service支持,并提供一个RestTemplate类来提供方便的Restful services访问。
spring-webmvc: 提供了一个Spring MVC Web框架和REST Web服务的实现。Spring的MVC框架提供了领域模型代码和Web表单之间分离,并与Spring框架的所有其他功能集成。
spring-webmvc-portlet: 提供了在Portlet环境中使用MVC实现,并且反映了spring-webmvc模块的功能。

一、Spring解读:为什么说Spring是非侵入式框架?

Spring中由Web注解:@Controller、组件注解:@Component、@Service、@Repository等标记的类,可以通过bean工厂注解@Autowired来注入到其他类中。
这是因为使用了web或组件注解的类,已经把创建自身类对象的工作交给了Spring的IoC容器。
如果不使用Spring来协助创建对象,那么势必要在一个类中创建另一类,以满足调用其他类方法的需求。如,在UserServiceImpl中注入UserDao的实现类UserDaoImpl。

UserDao userDao = new UserDaoImpl();

如果UserDaoImpl()的构造方法及其复杂,那么在UserServiceImpl中将会有多行代码用于创建UserDao对象。
将UserDao对象的创建工作交给UserServiceImpl,这本身就是一种代码入侵,违背了单一职责原则(SRP),因为创建UserDao对象这一工作并不是UserServiceImpl的职责范畴。
所以,将所有创建对象的工作交给Spring的IoC容器,在代码中仅仅关注业务逻辑,这也是一种松耦合的过程。

二、Spring依赖注入时,何时会创建代理类?

2.1 注入普通类对象

当前类为Controller,注入Service。
在这里插入图片描述
由图可知,Service并没有被创建代理对象,只是被创建了普通对象,同时,Service所依赖的RedisTemplate和Mapper也创建好了对象。Mapper层是基于MyBatis框架的,只有interface没有实现类,所以代理类为MapperProxy。

2.2 注入具有Spring AOP注解的对象

在Service层方法上加入@Transactional注解(也可以使用其他Spring注解测试)
在这里插入图片描述
在这里插入图片描述
此时,Service层方法由于被加入Spring的@Transactional注解,所以被Spring框架的CGLIB代理增强了事务功能,所以此时Service层的实现类对象变成了CGLIB对象,而且CGLIB对象是一个运行时(run time)临时产生的对象,所以此时注入Controller的Service对象中RedisTemplate和Mapper对象都为null,只有当断点进入Service层方法时,RedisTemplate和Mapper对象才会被注入。

  • 7
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

Jake Weng

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值