Spring学习系列之——第二章:Spring概述

上一篇文章中给出了一个应用Spring的最简单的应用程序,下面就系统的说一下我对Spring的理解,如果有不对或者不完善的地方,希望大家能够指正,欢迎大家一起来讨论。

Spring是为创建企业级应用提供了一个轻量级的解决方案。Spring包含的内容实在是太多太多了,但是你可以只使用你需要的部分,因为Spring是模块化的。Spring还可以很好的和当下主流的框架进行集成,例如:请求转发的Struts2、持久化的Hibernate、Mybatis、JTA等等。

提到Spring,就不得不说IoC(控制反转,DI:依赖注入)和AOP(面向切面编程)。到底怎么理解这两个东西,这个不是一朝一夕就能理解的特别透彻的,需要在不断积累的过程中,逐渐加深对这个东西的理解,下面我简单的说一下我的理解。

IoC(Inversion of Control):控制反转,是使用思想,不是技术。谁控制谁,控制什么?什么东西被反转了?IoC创建对象,并控制这些对象,让依赖对象的获取方式被反转了!为什么呢?因为我们知道,一个复杂的系统是有很多的类,这些类之间相互协作,说的更直白一点就是:你这个类需要调用其他类提供的方法,这个时候我们通常都是通过new获取一个其他类的对象,这个工作是程序员自己去做的,更厉害一点的程序员可能会使用工厂模式或者其他设计模式,把获取对象的过程进行一个封装,总的来说获取对象的过程是程序员自己进行管理。在我们使用了Spring之后,我们不再需要管理如何创建依赖的对象,这个工作交给了IoC容器,我们只需要把我们依赖的bean注册在IoC容器,当我们需要的时候,通过IoC容器提供的方法,获取相关的依赖对象。相比于我们传统的获取对象的方式,是不是控制反转了,有程序员自己管理,变成了由Spring的IoC容器进行管理。它最大的好处就是解耦。

往往和IoC一起出现的还有一个DI(Dependency Injection):依赖注入。DI是有Martin Fowler提出来的,这是在2004年,在解释“IoC的控制反转了什么?”的时候,给的一个新的名称。其实就是IoC控制反转的一个更直白的名字:因为我们使用了Spring的IoC容器,对象之间依赖的Bean的创建都交给了IoC容器,在系统运行的过程中,我们需要向IoC容器获取我们依赖的bean,这个时候,IoC容器就会把我们需要的Bean注入到我们的类中,即应用程序依赖于IoC容器,需要IoC容器把外部资源(指的是应用程序依赖的对象、数据、文件等)注入到应用程序中去。这个概念相比于IoC控制反转应该说更容易理解一些。上面就是我对IoC和DI的理解,如果有不对的或者不清楚的地方,欢迎讨论指正。

下面结合一个简单的示例,来说明一下,有两个类A和B,B中有一个A的引用,B依赖A:

class A{
}

class B{
    private  A a;
    public void setA(A a){
        this.a = a;
    }
}

传统方式我们需要自己创建对象,然后通过set方法,注入进去,在有了IoC容器之后,我们只需要简单的一句话:B b = getB();IoC容器会自动的把B对象依赖的A注入进去。

AOP(Aspect-Oriented Programming):面向切面编程。AOP其实是面向对象编程(OOP:Object Oriented Programing)思想的补充和完善。我们知道,OOP引进"抽象"、"封装"、"继承"、"多态"等概念,对万事万物进行抽象和封装,来建立一种对象的层次结构,它强调了一种完整事物的自上而下的关系。但是具体细粒度到每个事物内部的情况,OOP就显得无能为力了。比如日志功能。日志代码往往水平地散布在所有对象层次当中,却与它所散布到的对象的核心功能毫无关系。对于其他很多类似功能,如事务管理、权限控制等也是如此。这导致了大量代码的重复,而不利于各个模块的重用。PS:其实我现在对AOP有一定的了解,但是还不能够特别清楚的表达出来。。。。。

下面来看一下Spring官方参考文档中给出来的Spring框架的概述图:

Spring的核心容器主要有以下几个模块组成:spring-core,spring-beans,spring-context,spring-context-support,以及spring-expression(Spring Expression Language)。

Core(spring-core)模块和Beans(spring-beans)模块是Spring框架的基础部分,实现了IoC容器和依赖注入。其中的BeanFactory是典型的工厂模式的实现,他可以让你不用考虑去编写单件,可以把实际依赖关系通过配置文件的方式进行解耦。

Context(spring-context)模块是在Core和Beans模块基础之上的,它提供了Spring框架访问对象方法,它的原理和JNDI注册表类似。Context模块继承了Beans模块的特点,还增加了国际化的支持、事件传播、资源加载和透明的情况下创建应用上下文,例如创建一个Servlet容器。Context模块还支持Java EE的一些特性,例如EJB、JMX和基本的远程操作。ApplicationContext接口是Context模块的焦点。Spring-context-support提供整合第三方库到spring应用上下文的支持,这其中包括:缓存(EhCache,Guava,JCache)、mailing(JavaMail)、调度框架(CommonJ,Quartz)以及模板引擎(FreeMarker,JasperReports,Velocity)。

SpEL(spring-expression)模块提供了一种强大的表达式语言,这种表达式语言可以在运行时查询和操作对象。SpEL是对EL表达式的一种扩充。支持setting和getting属性值,属性赋值,方法调用,访问数组、集合、索引器中的内容,逻辑运算和四则运算,变量命名,从Spring的IoC容器中检索对象。

它还支持列表投影和选择,以及常见的列表聚合。

AOP模块提供了面向切面编程的支持,由于spring-aspects的存在,能够使得spring与AspectJ进行无缝对接。

数据访问/集成有JDBC、ORM、OXM、JMS以及事务组成。spring-jdbc提供了对JDBC的抽象,省略了冗长的JDBC代码。spring-tx模块提供了对声明式事务的支持。spring-orm提供了与其他ORM框架的集成支持,例如:JPA、JDO、Hibernate。

Web层包括spring-web、spring-webmvc、spring-websocket和spring-webmvc-portlet。spring-web模块提供了基本的web集成的功能,例如文件上传,通过servlet监听器和web上下文初始化IoC容器。spring-webmvc包括spring的MVC,支持REST风格的Web Service。

上面这一段基本上是参照spring官方文档的翻译,如果不对,或者翻译不恰当的地方,欢迎批评指正,希望能够和大家多多交流。

时间: 2024-10-21 09:04:54

Spring学习系列之——第二章:Spring概述的相关文章

Spring学习系列(四)——Spring中的国际化

1.Java中的国际化国际化(Internationalization)简称 i18n,简单来说就是不同国家/地区/语言的用户,访问同一个程序,得到对应的本地化资源. 首先要确定国家/地区/语言(Locale类) 然后根据不同的Locale获取对应的本地化资源(locale敏感的). 而本地化资源相关的主要有两种:ResourceBundle和Format抽象类的子类.①Jdk为ResourceBundle抽象类提供了两个子类(ListResourceBundle和PropertyResourc

Python学习系列 ( 第二章):Python 的基础语法的使用

一:Python的用户输入: 1.1 Python的输入 #!/usr/bin/env python # -*- coding: utf-8 -*- # Author:FlyFish #import getpass _username = "zhangyy" _password = "abc123" username = input("username:") password = input("password:")   ##

Spring学习系列之——第三章:Spring中Bean的配置(一)

Spring的配置形式有两种:基于XML配置和基于注解配置. Bean的配置方式有以下几种: 通过全类名,即通过反射的方式: 通过工厂方法,有静态工厂方法和实例工厂方法: 通过FactoryBean配置: 通过XML文件配置bean 本篇文章将按照下面的目录来说明基于XML的方式配置bean JavaBean的创建 通过XML配置的方式来配置bean XMLbean的配置: spring的依赖注入的方式 属性注入 构造器注入 工厂方法注入(很少使用) 测试方法 IoC容器的实例化: Applic

NIO入门系列之第二章:通道和缓冲区

第2章 通道和缓冲区 2.1  概述 通道和缓冲区是 NIO 中的核心对象,几乎在每一个I/O 操作中都要使用它们. 通道是对原 I/O 包中的流的模拟.到任何目的地(或来自任何地方)的所有数据都必须通过一个 Channel 对象.一个 Buffer 实质上是一个容器对象.发送给一个通道的所有对象都必须首先放到缓冲区中:同样地,从通道中读取的任何数据都要读到缓冲区中. 2.2  什么是缓冲区? Buffer 是一个对象,它包含一些要写入或者刚读出的数据.在 NIO 中加入 Buffer 对象,体

Stealth视频教程学习笔记(第二章)

Stealth视频教程学习笔记(第二章) 本文是对Unity官方视频教程Stealth的学习笔记.在此之前,本人整理了Stealth视频的英文字幕,并放到了优酷上.本文将分别对各个视频进行学习总结,提炼出其中的知识点和思路思想. 视频地址在(http://www.youku.com/playlist_show/id_23389553.html),是一个Stealth的专辑,这里只放上本章第一个视频,其它的大家在上面的链接中慢慢看吧. 第二章有一个视频是FLV格式的,我没法把字幕嵌入其中,所以优酷

学习笔记:第一章——计算机网络概述

学习笔记:第一章--计算机网络概述 1.0 计算机网络的定义:一些互相连接的,自治的计算机的集合称为计算机网路. 1.1 计算机网络在信息时代中的作用:连通和共享. 1.2 因特网概述:       网络的概念:网络(network)是由若干个结点(node)和连接这些结点的链路(link)组成. 网络中的结点可以是计算机,集线器,交换机和路由器: 网络和网络是通过路由器连接: 因特网是世界上最大的网络. 1.3 因特网的组成: 从因特网的工作方式上将其分为以下两大快: (1)边缘部分:由所有的

APUE学习笔记:第二章 UNIX标准化及实现

2.2UNIX标准化 2.2.1 ISO C 国际标准化组织(International Organization for Standardization,ISO) 国际电子技术委员会(International Electrotechnical Commission,IEC) ISO C标准的意图是提供C程序的可移植性,使其能适合于大量不同的操作系统,而不只是UNIX系统.此标准不仅定义了C程序设计语言的语法和语义,还定义了其标准库.因为所有现今的UNIX系统都提供C标准中定义的库例程,所以该

学习笔记:第二章——物理层

学习笔记:第二章--物理层 (物理层只看懂了一部分,将就着把自己懂的一点随便写写,不懂的那部分以后看懂了再做补充) 2.1  物理层的基本概念: 首先强调:物理层考虑的是怎样才能在连接各种计算机的传输媒体上传输比特流的,而不是具体的的传输媒体. 物理层也有自己的协议称为物理规程: 可以将物理层主要的任务描述为确定与传输媒体的接口有关的一些特性, 即: 1)机械特性:    2)电气特性:   3)功能特性:   4)过程特性. 2.2  数据通信的基础知识: 数据通信的模型: 源点:源点设备产生

spring boot系列(五)spring boot 配置spring data jpa (查询方法)

接着上面spring boot系列(四)spring boot 配置spring data jpa 保存修改方法继续做查询的测试: 1 创建UserInfo实体类,代码和https://www.cnblogs.com/kxm87/p/9273555.html中的一样. 2 创建数据库操作类相当于dao层,主要创建一个接口UserRepository,继承JpaRepository接口即可.本代码中主要都是自定义方法. 使用findXX 或者countXX(这两个不用编写sql,jpa会自动生成)