知识大全 Spring事务处理及其AOP框架的内幕

Posted

篇首语:登山则情满于山,观海则意溢于海。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Spring事务处理及其AOP框架的内幕相关的知识,希望对你有一定的参考价值。

Spring事务处理及其AOP框架的内幕  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  ***注:非入门者读***    Spring框架中成功吸引人的一点就是容器事务的管理 提供了一个轻量级的容器事务处理 针对的对象是普通的java类 使用Spring事务管理的话 你可以按照自己的业务把一些相关的方法纳入其事务管理里面 这就避免了程序员在处理事务的过程中繁琐的工作 同时这些也是ejb X规范里面吸引人的一点 这在spring里面都很好的提供 虽然在跨容器的事务管理 spring里面并没有提供 但是对于一般的web程序来说 也不需要仅仅为了那些功能而不得不使用ejb 不过 最近jboss的嵌入式的ejb容器也可以做的更小了 也是开源中的选择之一 无论技术是怎样发展的 当前 我们先来研究其中AOP实现的方法     事实上 Spring中的事务处理是通过AOP思想来实现的 Spring AOP与Aspect J和JBoss具有很大的不同 首先 使用Spring AOP框架的用户要记住的一点是 Spring AOP针对的是方法层次上的实现 而其他两者对字段也提供了支持 说到Spring AOP的内幕 其实也不难 对于有接口的类 使用的是Java内部类提供的Proxy;而对于那些不实现接口的类 使用的是cglib库 动态创建一个子类来实现     在Spring AOP中提供了 种处理切入类型:around before after introduction 顾名思义      )around是针对具体的某个切入点的方法(比如 现在有个OrderBook方法 around的切入类型是就这个方法的内部调用 是通过java的元数据 在运行时通过Method invoke来调用 具有返回值 当发生意外的时候会终止 记住的一点是 返回值 );     )before是在方法调用前调用(在OrderBook方法前调用 但是没有返回值 同时在通常意外情况下 会继续运行下一步方法 记住的一点是没有返回值);     )after和before刚好相反 没有什么特别的地方      )introduction是一个更加特殊的 但功能更加强大的切入类型 比如(你现在有Book对象 Computer对象 还有几十个这种业务对象 现在你希望在每个这样的对象中都加入一个记录最后修改的时间 但是你又不希望对每个类都进行修改 因为太麻烦了 同时更重要的一点 破坏了对象的完整性 说不定你以后又不需要这个时间数据了呢 这时怎么办呢?Spring AOP就为你专门实现这种思想提供了一个切入处理 那就是introduction introduction可以为你动态加入某些方法 这样可以在运行时 强制转换这些对象 进行插入时间数据的动作 更深的内幕就是C++虚函数中的vtable思想) 不过这种动态是以性能作为代价的 使用之前要慎重考虑 这里我们谈的是技术 所以就认为他是必需的     好 现在我们就拿第四种来进行举例说明Spring AOP的强大之处:     )假设创建了一个BookService接口及其实现方法(你自己的业务对象):    //$ID:BookService java Created: by Kerluse Benn  package osiris springaop;    public interface BookService   public String OrderComputerMagazine(String userName String bookName);  public String OrderBook(String userName String bookName);      //$ID:BookServiceImpl java Created: by Kerluse Benn  package osiris springaop;    public class BookServiceImpl implements BookService  public String OrderBook(String name String bookName)   // TODO Add your codes here  String result=null;  result= 订购 +bookName+ 成功 ;  return result;      public String OrderComputerMagazine(String userName String bookName)   // TODO Add your codes here  String result=null;  result= 订购 +bookName+ 成功 ;  return result;         )事实上你还有很多这样的对象 现在我们希望在每个对象中添加我们的功能最后修改的时间 功能如下:    //$ID:IAuditable java Created: by Kerluse Benn  package osiris springaop advices intruduction;    import java util Date;    public interface IAuditable   void setLastModifiedDate(Date date);  Date getLastModifiedDate();       )因为我们使用的切入类型是introduction Spring AOP为我们提供了一个描述这种类型的接口IntroductionInterceptor 所以我们的切入实现处理 也需要实现这个接口:    //$ID:AuditableMixin java Created: by Kerluse Benn  package osiris springaop advices intruduction;    import java util Date;    import aopalliance intercept MethodInvocation;  import springframework aop IntroductionInterceptor;    public class AuditableMixin implements IAuditable IntroductionInterceptor  private Date lastModifiedDate;    public Object invoke(MethodInvocation m) throws Throwable   // TODO Add your codes here  if(implementsInterface(m getMethod() getDeclaringClass()))  return m getMethod() invoke(this m getArguments());  //invoke introduced mthod here is IAuditable  else  return m proceed(); //delegate other method        public Date getLastModifiedDate()   // TODO Add your codes here  return lastModifiedDate;      public void setLastModifiedDate(Date date)   // TODO Add your codes here  lastModifiedDate=date;      public boolean implementsInterface(Class cls)   // TODO Add your codes here  return cls isAssignableFrom(IAuditable class);           )ok 现在业务对象BookService类有了 自己希望添加的处理也有了IAuditable 那就剩下使用Spring AOP框架的问题了 配置bean xml文件:    <?xml version= encoding= UTF ?>  <!DOCTYPE beans PUBLIC //SPRING//DTD BEAN//EN beans dtd >  <beans>  <! Beans >  <bean id= BookServiceTarget class= osiris springaop BookServiceImpl singleton= false />    <! introduction advice >  <bean id= AuditableMixin class= osiris springaop advices intruduction AuditableMixin singleton= false />    <! Introduction advisor >  <bean id= AuditableAdvisor class= springframework aop support DefaultIntroductionAdvisor   singleton= false >  <constructor arg>  <ref bean= AuditableMixin />  </constructor arg>  </bean>    <bean id= BookService class= springframework aop framework ProxyFactoryBean >  <property name= target >  <ref bean= BookServiceTarget />  </property>    <property name= singleton >  <value>false</value>  </property>    <! force to use cglib >  <property name= proxyTargetClass >  <value>true</value>  </property>    <! introduction methods >  <property name= proxyInterfaces >  <value> osiris springaop advices intruduction IAuditable</value>  </property>    <property name= interceptorNames >  <list>  <value>AuditableAdvisor</value>  </list>  </property>  </bean>    </beans>    以上就是配置文件 现在我们假设使用业务对象如下 这里是一个简单测试类:    //$ID:MainApp java Created: by Kerluse Benn  package osiris springaop;    import java util Date;    import springframework beans factory BeanFactory;  import springframework beans factory xml XmlBeanFactory;  import re io FileSystemResource;    import osiris springaop advices intruduction IAuditable;    public class MainApp   /**  * @param args  * @author Kerluse Benn  */  public static void main(String[] args) throws Exception  // TODO Add your codes here  BeanFactory factory=new XmlBeanFactory(new FileSystemResource( bean xml ));  BookService bookService=(BookService)factory getBean( BookService );  IAuditable auditable=(IAuditable)bookService;  System out print(bookService OrderBook( Kerluse Benn Professional C# ));  auditable setLastModifiedDate(new Date());  System out println( 订购时间为 +auditable getLastModifiedDate());  Thread sleep( );  System out print(bookService OrderBook( Kerluse Benn Expert j ee one on one ));  auditable setLastModifiedDate(new Date());  System cha138/Article/program/Java/ky/201311/28652

相关参考

知识大全 spring 2.0 的事务自动处理

  <aop:config>       <!<aop:advisorid=userManagerTxad

知识大全 SSH集成框架下真正实现Spring AOP拦截功能

SSH集成框架下真正实现SpringAOP拦截功能  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 Spring的事务

Spring的事务  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  今天对spring的AOP事务

知识大全 Spring+Ibatis+事务处理

Spring+Ibatis+事务处理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  applic

知识大全 SPring管理Hibernate事务出现异常处理

SPring管理Hibernate事务出现异常处理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 

知识大全 Spring AOP 详解

SpringAOP详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  此前对于AOP的使用仅限于

知识大全 浅析Spring.net中的Aop使用

浅析Spring.net中的Aop使用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &

知识大全 Spring3.0中的AOP配置方法

Spring3.0中的AOP配置方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  第一种配置方

知识大全 spring aop中单独代理和自动代理的设置

  spring的aop机制提供两类方式实现类代理一种是单个代理一种是自动代理  单个代理通过ProxyFactoryBean来实现自动代理通过BeanNameAutoProxyCreator或者De

知识大全 对spring的aop理解

   问题   问题想要添加日志记录性能监控安全监测   最初解决方案   最初