【内容来源于网络和书本,非原创,系个人学习整理的笔记】
Spring
定义作用
Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。
【eg结合hibernate和Struts】
Spring的基本组成完善的轻量级核心框架,通用的事务管理抽象层,JDBC抽象层,灵活的MVC Web应用框架,AOP功能,集成了Toplink、Hibernate、 JDO等。
特点
轻量 控制反转 面向切面 容器 框架
各模块及作用
Spring 框架的分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 Bean 的方式
组成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的依赖注入里大量使用。
- 构造方法注入
构造注入即是通过一个带参的构造函数将一个对象注入进去。到目前为止,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 与 Hibernate整合
Spring与Struts一样具有V层和C层的能力,即视图与控制器能力。在Spring+Hibernate方式的组合中,Spring最重要的角色还是视图和控制,尽管它的控制反转机制也发挥了作用,架构如图7.14所示。