Spring

【内容来源于网络和书本,非原创,系个人学习整理的笔记】

Spring

定义作用

Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。

【eg结合hibernate和Struts】

Spring的基本组成完善的轻量级核心框架,通用的事务管理抽象层,JDBC抽象层,灵活的MVC Web应用框架,AOP功能,集成了Toplink、Hibernate、 JDO等。

特点

轻量 控制反转 面向切面 容器 框架

各模块及作用

Spring 框架的分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 Bean 的方式

spring.png

组成Spring框架的每模块(或组件)都可以单独存在,也或以与其他一个或多个模块联合使用,这7个模块的功能如下

① 核心容器。提供Spring框架的基本功能,其主要组件是BeanFactory,是工厂模式的实现。它通过控制反转模式,将应用程序配置和依赖性规范与实际应用程序代码分开。
② Spring 上下文。一个配置文件。向Spring 框架提供上下文信息,包括企业服务,如JNDI、EJB、电子邮件、国际化、校验和调度等。
③ Spring AOP。通过配置管理特性,可以很容易地使 Spring 框架管理的任何对象支持AOP。Spring AOP 模块直接将面向方面编程的功能集成到Spring框架中。
④ Spring DAO。JDBC DAO 抽象层提供了有用的异常层次结构,用来管理异常处理和不同数据库供应商抛出的错误消息。
⑤ Spring ORM。Spring 框架插入了若干ORM框架,提供ORM的对象关系工具,其中包括JDO、Hibernate和iBatis SQL Map,并且都遵从Spring 的通用事务和 DAO 异常层次结构。
⑥ Spring Web 模块。为基于 Web 的应用程序提供上下文。它建立在应用程序上下文模块之上,简化了处理多份请求及将请求参数绑定到域对象的工作。
⑦ Spring MVC 框架。一个全功能构建Web应用程序的 MVC 实现。通过策略接口实现高度可配置,MVC 容纳了大量视图技术,其中包括JSP、Velocity、Tiles、iText和POI。

依赖注入

在软件工程领域,依赖注入(Dependency Injection)是用于实现控制反转(Inversion of Control)的最常见的方式之一。

控制反转

控制反转(Inversion of Control,简称IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心

IoC作为一种设计模式,可以彻底解决代码耦合问题,它把耦合从代码中移出去,放到统一的XML 文件中,通过一个容器在需要的时候把这个依赖关系形成,即把需要的接口实现注入到需要它的类中。

    Spring的依赖注入机制,可以在运行期为组件配置所需资源,而无需在编写组件代码时就加以指定,大大降低了组件之间的耦合,实现了组件的即插即用。 

Spring的依赖注入对调用者和被调用者几乎没有任何要求,完全支持对POJO之间依赖关系的管理。

注入的三种模式

而要实现依赖注入则有三种形式:接口注入、setter方法注入和构造方法注入。

1. 接口注入
接口注入就是将要注入的内容转入到一个接口中,然后将其注入到它的实现类中,因为实现一个接口必须实现接口定义的所有方法。

2.setter方法注入
指注入者通过调用setter方法将一个对象注入进去。这种注入方式简单、直观,因而在Spring的依赖注入里大量使用。

  1. 构造方法注入
    构造注入即是通过一个带参的构造函数将一个对象注入进去。到目前为止,Spring支持setter方法注入与构造注入两种方式,它们可以同时存在

Spring核心接口

BeanFactory

在Spring中有几种BeanFactory的实现,其中最常使用的是org.springframework.bean.factory.xml.XmlBeanFactory。它根据XML文件中的定义装载Bean。

这行简单的代码告诉Bean工厂从XML文件中读取Bean的定义信息,但是现在Bean工厂没有实例化Bean,Bean被延迟载入到Bean工厂中,就是说Bean工厂会立即把Bean定义信息载入进来,但是Bean只有在需要的时候才被实例化。
为了从BeanFactory得到一个Bean,只要简单地调用getBean()方法,把需要的Bean的名字当作参数传递进去就行了。由于得到的是Object类型,所以要进行强制类型转化。

ApplicationContext

表面上,ApplicationContext和BeanFactory差不多。两者都是载入Bean定义信息,装配Bean,根据需要分发Bean。但是ApplicationContext提供了更多功能:

Ü(1)应用上下文提供了文本信息解析工具,包括对国际化的支持。

Ü(2)应用上下文提供了载入文本资源的通用方法,如载入图片。

Ü(3)应用上下文可以向注册为监听器的Bean发送事件。

在ApplicationContext的诸多实现中,有三个常用的实现:
(1)ClassPathXmlApplicationContext:从类路径中的XML文件载入上下文定义信息,把上下文定义文件当成类路径资源。
(2)FileSystemXmlApplicationContext:从文件系统中的XML文件载入上下文定义信息。
(3)XmlWebApplicationContext:从Web系统中的XML文件载入上下文定义信息。

基本配置

使用xml装配

<?xml version="1.0" encoding="UTF-8"?>
…
<beans …>                                                  // 根元素
    <bean id="foo" class="com.spring.Foo"/>            // Bean实例
    <bean id="bar"class="com.spring.Bar"/>           // Bean实例
</beans>

上下文定义文件的根元素<beans>有多个<bean>子元素,每个子元素定义了一个Bean(任何一个Java对象)如何被装配到Spring容器中。

添加bean

在Spring中对一个Bean的最基本配置包括Bean的id和它的全称类名。向Spring容器中添加一个Bean只需要向XML文件中添加一个<bean>子元素。例如下面的语句:

<bean id="foo" class="com.spring.Foo"/>

当通过Spring容器创建一个Bean实例时,不仅可以完成Bean的实例化,还可以为Bean指定特定的作用域。
(1)原型模式与单实例模式:Spring中的Bean缺省情况下是单实例模式。在容器分配Bean的时候,它总是返回同一个实例。但是,如果每次向ApplicationContext请求一个Bean的时候需要得到一个不同的实例,需要将Bean定义为原型模式。
<bean>的singleton属性告诉ApplicationContext这个Bean是不是单实例Bean,缺省是true,如果把它设置为false就成了原型Bean。

(2)request或session:对于每次http请求或HttpSession,使用request或session定义的Bean都将产生一个新实例,即每次http请求或HttpSession将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域有效。
(3)global session:每个全局的HttpSession对应一个Bean实例。典型情况下,仅在使用portlet context的时候有效。只有在Web应用中使用Spring时,该作用域才有效。
在Bean的定义中设置自己的init-method,这个方法在Bean被实例化的时候马上被调用。同样,也可以设置自己的destroy-method,在Bean从容器中删除之前调用。
一个典型的例子是连接池Bean。

AOP【结合实验】

定义

AOP(Aspect Oriented Programming,面向切面编程,简称AOP),也叫面向方面编程。AOP是软件开发中的一个热点,也是Spring框架中的一个重要内容。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。

AOP将应用系统分为两部分,核心业务逻辑(Core business concerns)及横向的通用逻辑,也就是所谓的切面。

​ 使用AOP,你可以将处理Aspect的代码注入主程序,通常主程序的主要目的并不在于处理这些Aspect。AOP可以防止代码混乱。 Spring作为一种非侵略性的、轻型的AOP 框架,开发人员无需使用预编译器或其他的元标签,便可以在Java程序中使用它。

横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处都基本相似。 **AOP的核心思想就是将应用程序中的商业逻辑同对其提供支持的通用服务进行分离。 **

Cross-cutting concern

在DynamicProxyDemo的例子中,记录的动作原先被横切(Cross-cutting)到HelloSpeaker本身所负责的业务流程中。另外类似于日志这类的动作,如安全检查、事务等服务,在一个应用程序中常被安排到各个类的处理流程之中。这些动作在AOP的术语中被称为Cross-cutting concern。如图7.8所示,原来的业务流程是很单纯的。

Aspect

将散落在各个业务类中的Cross-cutting concerns收集起来,设计各个独立可重用的类,这种类称之为Aspect。例如在动态代理中将日志的动作设计为一个LogHandler类,LogHandler类在AOP术语中就是Aspect的一个具体实例。在需要该服务的时候,缝合到应用程序中;不需要服务的时候,也可以马上从应用程序中脱离。应用程序中的可重用组件不用做任何的修改。例如,在动态代理中的HelloSpeaker所代表的角色就是应用程序中可重用的组件,在它需要日志服务时并不用修改本身的程序代码

相关名词

AOP有一些重要概念需要理解,包括以下方面:
连接点(Joinpoint):程序执行过程中明确的点。
切入点(Pointcut):指定一个通知将被引发的一系列连接点的集合。
增强(Advice):在特定的连接点,AOP框架执行的动作。。
目标对象(Target):包含连接点的对象,也被称作被增强或被代理对象。
引入(Introduction):添加方法或字段到被增强的类。Spring允许引入新的接口到任何被增强的对象。
织入(Weaving):织入是将增强添加对目标类具体连接点上的过程。
代理(Proxy):AOP框架创建的对象,包含增强。
切面(Aspect):切面由切入点和增强组成。
各种通知类型又包括:
Around通知:环绕通知,包围一个连接点的通知。
Before通知:在一个连接点之前执行的通知。
Throws通知:在方法抛出异常时执行的通知。。
After returning通知:在连接点正常完成后执行的通知。
Around通知是最通用的通知类型。

实现AOP的技术

实现AOP的技术,主要分为两大类:

  • 采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。在代码的编译阶段植入Pointcut的内容,优点是性能好,但灵活性不够;
  • 采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;在代码执行阶段,在内存中截获对象,动态的插入Pointcut的内容,优点是不需要额外的编译,但是性能比静态织入要低。

静态代理 & 动态代理

通知Advice

Spring提供了5种通知(Advice)类型:Interception Around、Before、After Returning、Throw 和Introduction。它们分别在以下情况被调用:
1 Interception Around Advice:在目标对象的方法执行前后被调用。
2 Before Advice:在目标对象的方法执行前被调用。
3 After Returning Advice:在目标对象的方法执行后被调用。
4 Throw Advice:在目标对象的方法抛出异常时被调用。
5 Introduction Advice:一种特殊类型的拦截通知,只有在目标对象的方法调用完毕后执行。

Spring 事务

Spring 的事务处理,可以说是 Spring AOP 的一种实现。因为事务处理是所谓方面(Aspect)的一个子集。因此默认情况下,事务处理是利用 Java 动态代理机制实现的,这样就必须先定义一个接口,然后再编写实现;而对于没有接口的 Javabean ,则通过 CGLIB 实现。这部分是Spring AOP 部分的内容。

四种方式

1.采用TransactionProxyFactoryBean为目标bean生成事务代理的配置。此方式是最传统、配置文件最臃肿、最难以阅读的方式。
2.采用bean继承的事务代理配置方式,比较简洁,但依然是增量式配置。
3.采用BeanNameAutoProxyCreator,根据bean name自动生成事务代理的方式,这是直接利用Spring的AOP框架配置事务代理的方式,需要对Spring的AOP框架有所理解。但这种方式避免了增量式配置,效果非常不错。
4.采用DefaultAdvisorAutoProxyCreator,这也是直接利用Spring的AOP框架配置事务代理的方式,效果也非常不错,只是这种配置方式的可读性不如第三种方式。

Spring与Struts的整合

在这种组合中Struts 2依然充当着视图层和控制层角色,但是控制层不直接调用模型层中的业务逻辑层,而是在中间加了一个Spring,采用控制反转的方式进行松耦合。框架如图所示。

spring + Struts.png

Spring 与 Hibernate整合

Spring与Struts一样具有V层和C层的能力,即视图与控制器能力。在Spring+Hibernate方式的组合中,Spring最重要的角色还是视图和控制,尽管它的控制反转机制也发挥了作用,架构如图7.14所示。

Spring+hibernate.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342