Spring笔记

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

Bean工厂的概念是Spring作为IOC容器的基础,IOC将处理事情的责任从应用程序代码转移到框架。
BeanFactory接口
XmlBeanFactory,根据XML文件的定义装入Bean
BeanFactory factory = new XMLBeanFactory(new FileInputSteam("mybean.xml"));
getBean
MyBean mybean = (MyBean) factory.getBean("mybean");

Spring Bean的生命周期
1.容器启动,实例化所有实现了 BeanFactoyPostProcessor接口的类,它会在任何普通Bean实例化之前加载
2.实例化剩下的Bean,对这些Bean进行依赖注入
3.如果Bean有实现BeanNameAware的接口,那么对这些Bean进行调用
4.如果Bean有实现BeanFactoryAware的接口,那么对这些Bean进行调用
5.如果 Bean 有实现 ApplicationContextAware 接口的那么对这些 Bean 进行调用
6.如果配置有实现 BeanPostProcessor Bean ,那么调用它的 postProcessBeforeInitialization 方法
7.如果 Bean 有实现 InitializingBean 接口那么对这些 Bean 进行调用
8.如果 Bean 配置有 init 属性,那么调用它属性中设置的方法
9.如果配置有实现 BeanPostProcessor Bean ,那么调用它的 postProcessAfterInitialization 方法
10. Bean 正常使用
11.调用 DisposableBean 接口的 destory 方法
12.   调用 Bean 定义的 destory 方法

如果只从大体上区分为四个阶段
1. BeanFactoyPostProcessor 实例化
2. Bean 实例化,然后通过某些 BeanFactoyPostProcessor 来进行依赖注入
3. BeanPostProcessor 的调用 .Spring 内置的 BeanPostProcessor 负责调用 Bean 实现的接口 : BeanNameAware, BeanFactoryAware, ApplicationContextAware 等等,等这些内置的 BeanPostProcessor 调用完后才会调用自己配置的 BeanPostProcessor
4.   Bean 销毁阶段

使用Spring的好处
轻量:Spring是轻量级的,基本版本大约是2MB
控制饭庄(IOC):Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或者依赖的对象们
面向切面编程(AOP):Spring支持面向切面编程,并且把应用业务逻辑和系统服务分开
容器:Spring包含并管理应用中对象的生命周期和配置
MVC框架:Spring的WEB框架精心设计的框架,是WEB框架的一个很好的替代品
事务管理:Spring提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)
异常处理:Spring提供方便的API把具体技术相关的异常(比如JDBC,Hibernate or JDO抛出的)转化为一致的unchecked异常

Spring由哪些模块组成
Core module
Bean module
Context module
Expression Language module
JDBC module
ORM module
OXM module
Java Message Service(JMS) module
Transaction module
Web module
Web-Servlet module
Web-Struts module
Web-Porlet module

核心容器(应用上下文)模块
是基本的Spring模块,提供Spring框架的基础功能,BeanFactory是任何以Spring为基础的应用的核心,Spring框架建立在此模块之上,它使Spring成为一个容器

BeanFactory-BeanFactory实现举例
Bean工厂是工厂模式的一个实现,提供了控制反转功能,用来把应用的配置和依赖从真正的应用代码中分离,最常用的BeanFactory实现是XMLBeanFactory类

XMLBeanFactory
最常用的就是org.springframework.beans.factory.xml.XmlBeanFactory ,它根据XML文件中的定义加载beans。该容器从XML 文件读取配置元数据并用它去创建一个完全配置的系统或应用。

AOP模块

JDBC抽象和DAO模块
管理数据源

ORM模块
支持在JDBC上使用一个对象/关系映射(ORM)工具

WEB模块
构建在Application Context模块基础上,提供一个适合Web应用的上下文,包括支持多种面向Web'的任务,透明的处理多个文件上传请求和程序集请求参数的绑定到的业务对象

IOC容器
负责创建对象,管理对象(通过依赖注入(DI)),装配对象,配置对象,并且管理这些对象的整个生命周期

IOC的优点
IOC或依赖注入把应用的代码量降到最低,使应用容易测试,单例测试不需要d案例和JNDI查找机制,最小的代价和最小的侵入性使松散耦合得以实现,支持加载服务时的饿汉式初始化和懒加载

一个Spring的应用看起来像什么
一个定义了一些功能的接口
这实现包括属性,它的Setter,Getter方法和函数等
Spring AOP
Spring的XML配置文件
使用以上功能的客户端程序

依赖注入
什么是Spring的依赖注入
依赖注入是IOC的一个方面,是一个通常的概念,有多种解释。不需要创建对象,只需要描述它如何被创建,不在代码里组装组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后一个IOC容器负责把它们组装起来

有哪些不同类型的IOC方式
构造器依赖注入:通过触发一个类的构造器来实现的,该类有一系列参数,每一个参数代表一个对其他类的依赖
Setter方法注入:Setter方法注入是容器通过调用无参构造器或static工厂方法实例化bean之后,调用该bean的setter方法,即实现了setter的依赖注入
Setter方法实现可选依赖

什么是Spring Beans
Spring Beans是那些形成Spring应用的主干的java对象,它们被Spring IOC容器初始化,装配,和管理,这些beans通过容器中配置的元数据创建,比如以XML文件中的<bean/>的形式定义
Spring框架中定义的beans都是单件beans,在bean tag中有个属性“Singleton”,如果它被赋为TRUE,bean就是单件,否则就是一个Prototype bean,默认为TRUE。

一个Spring Bean定义包含什么
包含容器必知的所有配置元数据,包括如何创建一个Bean,它的生命周期详情及它的依赖

如何给Spring容器提供配置元数据
1.XML配置文件
2.基于注解的配置
3.基于java的配置

定义类的作用域
当定义一个<bean> 在Spring里,我们还能给这个bean声明一个作用域。它可以通过bean 定义中的scope属性来定 义。如,当Spring要在需要的时候每次生产一个新的bean实例,bean的scope属性被指定为prototype。另一方面,一个bean每次 使用的时候必须返回同一个实例,这个bean的scope 属性 必须设为 singleton。

Spring中Bean的作用域
Singleton:bean在每个Spring ioc容器中只有一个实例
prototype:一个bean的定义可以有多个实例
request:每次合同谈判请求都会创建一个bean,该作用域仅在基于Web的Spring Application Context情形下有效
session:在一个Http Session中,一个bean定义对应一个实例,该作用域仅在基于Web的Spring Application Context情形下有效
global-session:在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
缺省的Spring bean 的作用域是Singleton.

重要的bean生命周期方法
1.Setup,在容器加载bean的时候被调用
2.tearDown,在容器卸载类的时候被调用
The bean 标签有两个重要的属性(init-method和destroy-method)。用它们你可以自己定制初始化和注销方法。它们也有相应的注解(@PostConstruct和@PreDestroy)。

Spring的内部bean
当一个bean仅被用作另一个bean的属性时,它能被声明为一个内部bean,为了定义inner bean,在Spring 的 基于XML 的 配置元数据中,可以在 <property/>或 <constructor-arg/> 元素内使用<bean /> 元素,内部bean通常是匿名的,它们的Scope一般是prototype。

在Spring中注入一个java集合
  • <list>类型用于注入一列值,允许有相同的值。
  • <set> 类型用于注入一组值,不允许有相同的值。
  • <map> 类型用于注入一组键值对,键和值都可以为任意类型。
  • <props>类型用于注入一组键值对,键和值都只能为String类型。

bean装配
装配,或bean 装配是指在Spring 容器中把bean组装到一起,前提是容器需要知道bean的依赖关系,如何通过依赖注入来把它们装配到一起。

Spring 容器能够自动装配相互合作的bean,这意味着容器不需要<constructor-arg>和<property>配置,能通过Bean工厂自动处理bean之间的协作。

有五种自动装配的方式,可以用来指导Spring容器用自动装配方式来进行依赖注入。
  • no:默认的方式是不进行自动装配,通过显式设置ref 属性来进行装配。
  • byName:通过参数名 自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byname,之后容器试图匹配、装配和该bean的属性具有相同名字的bean。
  • byType::通过参数类型自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byType,之后容器试图匹配、装配和该bean的属性具有相同类型的bean。如果有多个bean符合条件,则抛出错误。
  • constructor:这个方式类似于byType, 但是要提供给构造器参数,如果没有确定的带参数的构造器参数类型,将会抛出异常。
  • autodetect:首先尝试使用constructor来自动装配,如果无法工作,则使用byType方式。

自动装配的局限性是:
  • 重写: 你仍需用 <constructor-arg>和 <property> 配置来定义依赖,意味着总要重写自动装配。
  • 基本数据类型:你不能自动装配简单的属性,如基本数据类型,String字符串,和类。
  • 模糊特性:自动装配不如显式装配精确,如果有可能,建议使用显式装配。

Spring注解
什么是基于java的Spring注解
@Configuration注解,用来标记类可以当作一个bean的定义,被Spring IOC容器使用
@Bean注解,表示返回一个对象,作为一个bean注册进Spring应用上下文

基于注解的容器配置
相对于XML文件,注解型的配置依赖于通过字节码元数据装配组件,而非尖括号的声明。
开发者通过在相应的类,方法或属性上使用注解的方式,直接组件类中进行配置,而不是使用xml表述bean的装配关系。

开启注解装配
注解装配在默认情况下是不开启的,为了使用注解装配,我们必须在Spring配置文件中配置 <context:annotation-config/>元素。

@Required注解
这个注解表明bean的属性必须在配置的时候设置,通过一个bean定义的显式的属性值或通过自动装配,若@Required注解的bean属性未被设置,容器将抛出BeanInitializationException。

@Autowired注解
@Autowired 注解提供了更细粒度的控制,包括在何处以及如何完成自动装配。它的用法和@Required一样,修饰setter方法、构造器、属性或者具有任意名称和/或多个参数的PN方法。

@Qualifier注解、
当有多个相同类型的bean却只有一个需要自动装配时,将@Qualifier 注解和@Autowire 注解结合使用以消除这种混淆,指定需要装配的确切的bean。

Spring数据访问
在Spring框架中使用JDBC
使用SpringJDBC 框架,资源管理和错误处理的代价都会被减轻。所以开发者只需写statements 和 queries从数据存取数据,JDBC也可以在Spring框架提供的模板类的帮助下更有效地被使用,这个模板叫JdbcTemplate 

JdbcTemplate
JdbcTemplate 类提供了很多便利的方法解决诸如把数据库数据转变成基本数据类型或对象,执行写好的或可调用的数据库操作语句,提供自定义的数据错误处理。

Spring对DAO的支持
Spring对数据访问对象(DAO)的支持旨在简化它和数据访问技术如JDBC,Hibernate or JDO 结合使用。这使我们可以方便切换持久层。编码时也不用担心会捕获每种技术特有的异常。

Spring通过什么方式访问Hibernate
在Spring中有两种方式访问Hibernate:
  • 控制反转  Hibernate Template和 Callback。
  • 继承 HibernateDAOSupport提供一个AOP 拦截器。

Spring支持的ORM
Spring支持以下ORM:
  • Hibernate
  • iBatis
  • JPA (Java Persistence API)
  • TopLink
  • JDO (Java Data Objects)
  • OJB

如何通过HibernateDaoSupport将Spring和Hibernate结合起来
用Spring的 SessionFactory 调用 LocalSessionFactory。集成过程分三步:
  • 配置the Hibernate SessionFactory。
  • 继承HibernateDaoSupport实现一个DAO。
  • 在AOP支持的事务中装配。

Spring支持的事务管理类型
Spring支持两种类型的事务管理:
  • 编程式事务管理:这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护。
  • 声明式事务管理:这意味着你可以将业务代码和事务管理分离,你只需用注解和XML配置来管理事务。

Spring框架的事务管理有哪些优点
  • 它为不同的事务API  如 JTA,JDBC,Hibernate,JPA 和JDO,提供一个不变的编程模式。
  • 它为编程式事务管理提供了一套简单的API而不是一些复杂的事务API如
  • 它支持声明式事务管理。
  • 它和Spring各种数据访问抽象层很好得集成。
大多数Spring框架的用户选择声明式事务管理,因为它对应用代码的影响最小,因此更符合一个无侵入的轻量级容器的思想。声明式事务管理要优于编程式事务管理,虽然比编程式事务管理(这种方式允许你通过代码控制事务)少了一点灵活性。

Spring面向切面编程(AOP)
AOP
面向切面的编程,或AOP, 是一种编程技术,允许程序模块化横向切割关注点,或横切典型的责任划分,如日志和事务管理。

Aspect切面
AOP核心就是切面,它将多个类的通用行为封装成可重用的模块,该模块含有一组API提供横切功能。比如,一个日志模块可以被称作日志的AOP切面。根据需求的不同,一个应用程序可以有若干切面。在Spring AOP中,切面通过带有@Aspect注解的类实现。

在AOP中,关注点和横切关注的区别
关注点是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能。
横切关注点是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日志,安全和数据传输,几乎应用的每个模块都需要的功能。因此这些都属于横切关注点。

连接点
连接点代表一个应用程序的某个位置,在这个位置我们可以插入一个AOP切面,它实际上是个应用程序执行Spring AOP的位置。

通知
通知是个在方法执行前或执行后要做的动作,实际上是程序执行时要通过SpringAOP框架触发的代码段。
Spring切面可以应用五种类型的通知:
  • before:前置通知,在一个方法执行前被调用。
  • after: 在方法执行之后调用的通知,无论方法执行是否成功。
  • after-returning: 仅当方法成功完成后执行的通知。
  • after-throwing: 在方法抛出异常退出时执行的通知。
  • around: 在方法执行之前和之后调用的通知。

切点
切入点是一个或一组连接点,通知将在这些位置执行。可以通过表达式或匹配的方式指明切入点。

引入
引入允许我们在已存在的类中增加新的方法和属性。

目标对象
被一个或者多个切面所通知的对象。它通常是一个代理对象。也指被通知(advised)对象。

代理
代理是通知目标对象后创建的对象。从客户端的角度看,代理对象和目标对象是一样的。

自动代理
BeanNameAutoProxyCreator
DefaultAdvisorAutoProxyCreator
Metadata autoproxying

织入
织入是将切面和到其他应用类型或对象连接或创建一个被通知对象的过程。
织入可以在编译时,加载时,或运行时完成。

Spring MVC
什么是Spring MVC框架
Spring 配备构建Web 应用的全功能MVC框架。Spring可以很便捷地和其他MVC框 架集成,如Struts,Spring 的MVC框架用控制反转把业务对象和控制逻辑清晰地隔离。它也允许以声 明的方式把请求参数和业务对象绑定。

DispatcherServlet
Spring的MVC框架是围绕DispatcherServlet来设计的,它用来处理所有的HTTP请求和响应。

WebApplicationContext
WebApplicationContext 继承了ApplicationContext  并增加了一些WEB应用必备的特有功能,它不同于一般的ApplicationContext ,因为它能处理主题,并找到被关联的servlet。

Spring MVC框架的控制器
控制器提供一个访问应用程序的行为,此行为通常通过服务接口实现。控制器解析用户输入并将其转换为一个由视图呈现给用户的模型。Spring用一个非常抽象的方式实现了一个控制层,允许用户创建多种用途的控制器。

@Controller注解
该注解表明该类扮演控制器的角色,Spring不需要你继承任何其他控制器基类或引用Servlet API。

@RequestMapping注解
该注解是用来映射一个URL到一个类或一个特定的方处理法上。


Spring的工作机制和为什么要用
Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。Spring既是一个AOP框架,也是一IOC容器。
SpringFramework的组成:Spring AOP,Spring DAO,Spring ORM,Spring Web,Spring Context, Spring Web MVC。
Spring的核心就是IOC和AOP,所以Spring的工作机制简单的理解也就是IOC和AOP的工作机制
借助于Spring AOP,Spring IoC能够很方便的使用到非常健壮、灵活的企业级服务,通过使用IoC能够降低组件之间的耦合度,最终, 能够提高类的重用性,利于测试,而且更利于整个产品或系统集成和配置。

AOP和IOC的概念以及在Spring中是如何应用的
AOP,Aspect Oriented Program,面向(方面)切面的编程;
IOC,Invert Of Control,控制反转。
IOC就是其实就是依赖注入,即用接口编程,在程序中不出现new关键字,而是用接口来命名引用,然后通过某种方式把接口的某个实现类的实例注入到引用里,从而实现接口与具体实现类的松耦合。
由容器控制程序之间的关系(通过XML配置),而非传统实现中的由程序代码直接操控,(在一个Class对象中引用另一个Class对象时,我们通常都是直接通过new contructor)。控制权由应用代码中转到了外部容器,控制权的转移,是所谓的反转。 

AOP方式很类似filter,就是在程序正常的业务流中间像切面一样插入很多其他需要执行的代码,比如登录时候,在进入登录页面前写入日志,很常用的,尤其是跟数据库有关的,或者跟支付有关的程序肯定会在每一步前面插入日志。
面向方面的编程,即 AOP,是一种编程技术,它允许程序员对横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化。 AOP 的核心构造是切面,它将那些影响多个类的行为封装到可重用的模块中。
AOP Advice(AOP通知)分为:
前置通知   后置通知   异常通知   环绕通知 

Spring的事务有哪几种方式,Spring的事务隔离级别和传播行为
声明式事务:    
使用spring声明式事务,spring使用AOP来支持声明式事务,会根据事务属性,自动在方法调用之前决定是否开启一个事务,并在方法执行之后决定事务提交或回滚事务。
编程式事务管理 :
Spring的编程式事务与声明式事务区别 
程式事务需要你在代码中直接加入处理事 务的逻辑,可能需要在代码中显式调用beginTransaction()、commit()、rollback()等事务管理相关的方法,如在执行a方 法时候需要事务处理,你需要在a方法开始时候开启事务,处理完后。在方法结束时候,关闭事务.
声明式的事务的做法是在a方法外围添加注解或者直接在配置文件中定义,a方法需要事务处理,在spring中会通过配置文件在a方法前后拦截,并添加事务.
二者区别.编程式事务侵入性比较强,但处理粒度更细.
事务的隔离级别:
数据库系统提供了4种事务隔离级别,在这4种隔离级别中,Serializable的隔离级别最高,Read Uncommitted的隔离级别最低;
Read Uncommitted   读未提交数据;(会出现脏读)
Read Committed      读已提交数据;
Repeatable Read       可重复读;
Serializable              串行化 
事务的传播属性包括:
Required   业务方法需要在一个事务中运行,如果一个方法运行时已经处在一个事务中,那么加入到该事务,否则为自己创建一个新事务,80%的方法用到该传播属性;
Not-Supported· Requiresnew· Mandatoky· Supports· Never· Nested

Spring的优点和缺点
Spring的优点:
① Spring能有效地组织你的中间层对象,不管你是否选择使用了EJB;
② Spring能消除在许多工程中常见的对Singleton的过多使用。(因为它降低了系统的可测试性和面向对象的程度);
③ 通过一种在不同应用程序和项目间一致的方法来处理配置文件,Spring能消除各种各样自定义格式的属性文件的需要。Inversion of Control的使用帮助完成了这种简化;
④通过把对接口编程而不是对类编程的代价几乎减少到没有,Spring能够促进养成好的编程习惯;
⑤Spring被设计为让使用它创建的应用尽可能少的依赖于他的APIs。在Spring应用中的大多数业务对象没有依赖于Spring;
⑥使用Spring构建的应用程序易于单元测试;
⑦Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用POJOs或local EJBs来实现业务接口,却不会影响调用代码;
⑧Spring帮助你解决许多问题而无需使用EJB。Spring能提供一种EJB的替换物,他们适用于许多web应用。例如:Spring能使用AOP提供声明性事务管理而不通过EJB容器;
⑨Spring为数据存取提供了一个一致的框架不论使用的是JDBC还是O/R mapping产品;
Spring的缺点:
①使用人数不多,jsp中要写很多代码;
②控制器过于灵活,缺少一个公用控制器。


spring 两种事物处理机制,一是声明式事物,二是编程式事物
声明式事物
1)Spring的声明式事务管理在底层是建立在AOP的基础之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过等价的基于标注的方式),便可以将事务规则应用到业务逻辑中。因为事务管理本身就是一个典型的横切逻辑,正是AOP的用武之地。Spring开发团队也意识到了这一点,为声明式事务提供了简单而强大的支持。Spring强大的声明式事务管理功能,这主要得益于Spring依赖注入容器和Spring AOP的支持。依赖注入容器为声明式事务管理提供了基础设施,使得Bean对于Spring框架而言是可管理的;而Spring AOP则是声明式事务管理的直接实现者。和编程式事务相比,声明式事务唯一不足地方是,后者的最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。但是即便有这样的需求,也存在很多变通的方法,比如,可以将需要进行事务管理的代码块独立为方法等等。

2)5种配置方式
Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。
DataSource、TransactionManager这两部分只是会根据数据访问方式有所变化,比如使用 hibernate 进行数据访问时,DataSource实际为SessionFactory,TransactionManager的实现为HibernateTransactionManager。
关系图如下:


编程式事务
Spring的编程式事务即在代码中使用编程的方式进行事务处理,可以做到比声明式事务更细粒度。有两种方式一是使用TransactionManager,另外就是TransactionTemplate。


Spring提供了许多内置事务管理器实现,常用的有以下几种: 
  • DataSourceTransactionManager:位于org.springframework.jdbc.datasource包中,数据源事务管理器,提供对单个javax.sql.DataSource事务管理,用于Spring JDBC抽象框架、iBATIS框架的事务管理;
  • HibernateTransactionManager:位于org.springframework.orm.hibernate3或者hibernate4包中,提供对单个org.hibernate.SessionFactory事务支持,用于集成Hibernate框架时的事务管理;该事务管理器只支持Hibernate3+版本,且Spring3.0+版本只支持Hibernate 3.2+版本;
  • JtaTransactionManager:位于org.springframework.transaction.jta包中,提供对分布式事务管理的支持,并将事务管理委托给Java EE应用服务器事务管理器;

AOP解决方案
n Spring框架提供了一致的事务管理抽象,这带来了以下好处:
1:为复杂的事务API提供了一致的编程模型,如JTA、JDBC、Hibernate、JPA和JDO
2:支持声明式事务管理
3:提供比复杂的事务API(诸如JTA)更简单的、更易于使用的编程式事务管理API
4:非常好地整合Spring的各种数据访问抽象
实施事务的步骤
1、定义(资源)DataSource/SessionFactory ……
2、定义事务管理器(管理资源的事务)
3、定义事务通知:定义了如何实施事务(实施事务的方法名和对应的事务属性),需要使用事务管理器管理事务,定义了如何选择目标对象的方法及实施的事务属性
4、定义advisor(切入点和事务通知):切入点选择需要实施事务的目标对象
5、Spring织入事务通知到目标对象(AOP代理)

实施流程:







Java动态代理类位于java.lang.reflect包下,一般主要涉及到以下两个类(接口算作特殊类):
(1)Interface InvocationHandler:该接口中仅定义了一个方法
public object invoke(Object obj,Method method, Object[] args)
在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,如上例中的request(),args为该方法的参数数组。 这个抽象方法在代理类中动态实现。

obj - 在其调用方法的代理实例 
method - 对应于在代理实例上调用的接口方法的 Method 实例。Method 对象的声明类将是在其中声明方法的接口,该接口可以是代理类赖以继承方法的代理接口的超接口。 
args - 包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为 null。基本类型的参数被包装在适当基本包装器类(如  java .lang.Integer 或  java .lang.Boolean)的实例中。

(2)Proxy:该类即为动态代理类,作用类似于上例中的ProxySubject,其中主要包含以下内容:

protected Proxy(InvocationHandler h):构造函数,用于给内部的h赋值;

static Class getProxyClass (ClassLoader loader, Class[] interfaces):获得一个代理类,其中loader是类装载器,interfaces是真实类所拥有的全部接口的数组;

static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理类的一个实例,返回后的代理类可以当作被代理类使用(可使用被代理类的在Subject接口中声明过的方法)。

所谓Dynamic Proxy是这样一种class:它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些 interface。你当然可以把该class的实例当作这些interface中的任何一个来用。当然,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。

cglib( Code Generation Library )是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。
cglib封装了asm,可以在运行期动态生成新的class。
cglib用于AOP,jdk中的proxy必须基于接口,cglib却没有这个限制。

原理区别:
java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。

1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 
2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP 
3、如果目标对象没有实现了接口,必须采用CGLIB库, spring 会自动在JDK动态代理和CGLIB之间转换

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值