[Day-03] - Spring Framework Introduction

Abstract

在Spring Framework尚未被开发出来时,Java EE是以 Sun公司(已经被Oracle 公司收购,但为了纪念其对Java发展未来有巨大的影响力,故依旧保持名称,以表敬意)所制定的EJB(Enterprise Java Bean)作为标准的。在早期的EJB年代,开发一个EJB需要大量的街口和配置文件,直至EJB 2.0的年代。开发一个EJB需要大量的接口和配置文件。直至EJB 2.0的年代,开发一个EJB还需要两个配置文档,其结果就是配置工作量比开发工作量还大。Sun公司定义的JSP和Servlet却是运行在Web容器中,因Servlet为一种SSR(Server-Side Render)架构框架,亦为当初盛行MVC(Model-View-Controller)架构,可以理解到需要用Web容器去EJB容器和服务。故存在了一项重大缺点,需要增加调用配置文件才能让Web容器调用EJB容器。此时需同时开发两项容器,非常多的配置内容与繁琐的规范导致开发效率相当低。故开发人员须了解许多繁琐的EJB细节,才能进行配置和测试,这样测试也难以进行。
就在大家苦恼此种架构难以维运与开发同时,在2002年,位於澳大利亚工程师Rod Johnson(论学历的话,他是位音乐家,因他是音乐博士)在其着名的着作Expert One-on-One J2EE Design and Development中提出了Spring架构,其开发目标为三个方向,如下:

  1. Spring框架应该使用起来很愉悦。
  2. 各种应用程序不应该依赖许多API。
  3. Spring框架不应该与现有好的解决方案竞争,但势必与现有方案促进整合。

故在2004年由Rod Johnson主导的Spring框架推出 1.0 版本。

Principle Introduction

Spring 以强大的控制反转(IoC)及面向切面式编程(AOP)来管理各类Java资源,在控制反转(IoC)方面,从而降低许多资源的耦合:提供了极低的外部入侵性,也就是使用Spring框架来开发程序码,即使脱离了Spring API也可以继续使用。在面向切面式编程(AOP)通过动态代理技术(cglib),允许我们按照规范进行配置开发,进而增强每个Bean的功能。因为在前一章提到,早期的1.5版本前不支援注解,固接使用XML档进行Bean配置连接,等到Spring 2.0出来之後,才出现新一版的注解方式(Annotation)进行配置,以减少许多XML配置档的繁琐步骤,固区分为两派XML古老派及注解(Annotation)新生派。故可集成於20多种模组,区分为核心容器(Core Container)、数据访问/集成(Data Access/ Integration)层、Web层、AOP(Aspect Oriented Programming,面向切面式编程)、植入模块(Instrumentation)、消息传输(Messaging)和测试模组(Test),各类模组细节部分将在结构当中做叙述。

Structure

image

1. 核心容器

Spring的核心容器服务是所有模块的运作基底,此容器由Spring-core、Spring-beans、Spring-context、Spring-context-suport和Spring-expression(Spring表达式语言)等模组组成。

1.1 Spring-core 模组:
提供了框架的基本组成部分,包括控制反转(Inversion of Control,IoC)和依赖注入(Dependency Injection,DI)功能。

1.1.1
Spring IoC :
* XML配置的IoC容器:基於BeanFactory和ApplicationContext两个接口,BeanFactory接口有多个实现类,最常用为org.springframework.beans.factory.xml.XmlBeanFactory。而ApplicationContext是BeanFactory的子类别,目前支援此种实例有三种方法,但本次分享章节部探讨此方式。
1. 通过ClassPathXmlApplicationContext创建
2. 通过FileSystemXmlApplicationContext创建
3. 通过Web服务器实例化ApplicationContext
* 基於注解的IoC容器:就是透过AnnotationConfigApplicationContext取得对应的Bean,从名称就可以看出它是一个基於注解的IoC容器。
1.1.2
Spring DI:
* XML配置的DI容器:作用是在使用Spring框架创建对象时动态地将其所依赖的对象注入Bean组件中,Spring框架的依赖注入通常有两种实现方式。一种是使用构造方法注入,另一种是使用属性的Setter方法注入。
* 基於注解的DI容器:透过IoC容器中的Bean之间的依赖,在注解方式进行依赖注入(DI)的方式,加入@Autowired是最常用的注解之一,它根据属性的类型(by type)找到对应的Bean进行注入。

1.2 Spring-beans 模组:如上所述,提供BeanFactory,是一个工厂模式(Factory Pattern)的一个经典实现,所有代管对象皆为Bean。

1.3 Spring-context 模组:建立在Core和Beans模组的基础上,为一种框架是的对象访问方式,访问定义和配置的任何对象的媒介。为第一点所述,无论采用何种方式取得Bean,都须透过BeanFactory的子接口ApplicationContext来实现。

1.4 Spring-context-support 模组:支持整合第三方套件到Spring的应用程序上,如:高速缓存(EhCache、JCache)、任务调度(CommonJ、Quartz)及事务调度(Spring-JPA、Spring-data-mongodb及Spring-boot-starter-redis)。

1.5 Spring-expression 模组:提供强大的表达式语言去支持运作时查询和操作对象。该语言支持设置和获取属性值、属性配置、方法调用、访问数据、集合和索引气的内容、逻辑和算数逻辑、变量命名及Spring的IoC容器中以名称检索对象。

2. AOP和Instrumentation

Spring AOP亦包含了XML配置方式及注解配置方式,在dynamic.jdk包中创建代理类JDKDynamicProxy。在JDK动态代理中代理类必须实现java.lang.reflect.InvocationHandler接口。并覆盖(@Override)其代理方法,而Spring Core框架采用CGLIB(Code Generation Libaray)是一个高性能开源的程序码套件包,采用非常底层的字节码技术。对指定的目标类生成一个子类,并加强对子类别的方法逻辑。

2.1 Spring-aop模组:提供一个符合AOP要求的面向式切面的编译实例,允许定义方法拦截器的切入点。将代码按照功能进行分离,已变乾净的分开各类程序逻辑区段,降低耦合性。

2.2 Spring-aspects模组:提供了雨AspectJ的整合功能,AspectJ是一个基於Java语言的AOP框架,从Spring 2.0後引入一个AspectJ的支持框架,分为:Before、After Returning、Around、After Throwing、After及Declare parents六类行为。

2.3 Spring-instrument模组:提供类植入(Instrumentation)支持和类别加载器的实现,可在特定的应用服务器中使用。

4. 消息

提供对消息传递体系和协议的支持,其使用JmsTemplate简化JMS API的使用到异步接收消息的完整基础架构,目前支援多种讯息传输套件(MQ,Message Queue),如:ActiveMQ、RabbitMQ及Apache Kafka等。

5. 数据访问与整合

数据访问/整合层由JDBC、ORM、OXM、JMS和事务模组套件组成。

5.1 Spring-jdbc 模组:提供一个JDBC串接底层的抽象层,减少许多物件关联对映(ORM)的JDBC的编译过程及数据库的错误解析流程,虽为是一项好处,但相当不建议直接使用,毕竟在对外安全性管理逻辑议题甚多,处理不慎,有不当後果。

5.2 Spring-orm 模组:物件关联对映(Object-Relational Mapping) API提供整合层,包括JPA、Hibernate及Mybatis,使用Spring-orm模组可以将这些O/R应设框架与Spring提供的所有其他功能结合使用。

5.3 Spring-oxm 模组:一种支持对象/XML映射的抽象曾实现。如:JAXB、Caster、JiBX和XStream。

5.4 Spring-jms(Java Messageing Service)模组:Java消息传递服务,包含於用生产和使用消息模式(Producer/Comsumer)、推广与订阅模式(Publish/Subscribe)两种,提供雨Spring-messaging模组的整合。

5.5 Spring-tx模组(事务模组):用於实现特殊接口和所有POJO(Basic Java Transactional Model)类别的编译类别和声明式事务管理。

6. Web

Web 层由Spring-web、Spring-webmvc、Spring-websocket和Portlet模组组成。

6.1 Spring-web模组:基本的Web开发整合功能,如:多文件上传功能、使用Servlet监视器初始化一个IoC容器以及Web应用,因有一套既有的规范配置,透过後端传输出超连结代码转成Web前端介面(GUI),并透过XML组态档方式进行各类关联配置,故维运起来相当不便。

6.2 Spring-webmvc模组:亦称Web-Servlet模组,包含Web应用程序的Spring MVC和REST Web Services实现。Spring MVC框架提供一套规范,将程序码领域模型区块及Web 前端代码之间清晰分离,亦可与其他类型框架进行整合,如:Thymeleaf。

6.3 Spring-websocket模组:提供WebSocket和SockJS整合。

6.4 Portlet模组:与Servlet模组的功能,提供Portlet环境下的MVC实现。

7. 测试

支持使用JUnit或Mockito对Spring套件进行单元测试或整合测试。

後续摘要

由於目前Spring开发学派以区分为两种派系,一种为XML组态学派,另一派为新式注解学派,我们後续范例分享大部分将以新式注解学派为主,少部分再提供XML范例做分享,并从核心技术进行介绍至周边依赖性是套件应用做原理分析、架构应用及范例分享,各类读者可依照你们的情境做应用。

Reference Url:

Spring从入门到放弃(一)Spring的诞生

Spring框架学习——Spring的体系结构详解

Spring系列学习之Spring Messaging消息支持


<<:  电子书阅读器上的浏览器 [Day18] 支援夜间模式

>>:  如何开展你的分析?

Azure Private Vetwork 手把手教学

就是不爱PublicIP之Private Endpoint 很实用的技术实作文,值得让更多需要的人知...

[Day21] Esp32用STA mode + AHT10

1.前言 前两天看完AHT10 + APmode 那篇後,是不是对这篇抱有更大的期待与兴趣了,因为S...

大共享时代系列_027_第三方 Cookie (Third-Party cookie)

那一天,浏览器想起了被第三方 Cookie 围绕的恐惧 关於第三方 cookie 的消亡... 什麽...

资料验证(golang)(Day23)

文章同步更新於个人官网 https://kevinyay945.com/smart-home-tut...

Day 0x14 UVa10035 Primary Arithmetic

Virtual Judge ZeroJudge 题意 输入两整数,求相加的过程需要进位几次 需要注...