首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Spring源代码解析(7):Spring AOP中对拦截器调用的实现

2012-10-08 
Spring源代码解析(七):Spring AOP中对拦截器调用的实现前面我们分析了Spring AOP实现中得到Proxy对象的过

Spring源代码解析(七):Spring AOP中对拦截器调用的实现
前面我们分析了Spring AOP实现中得到Proxy对象的过程,下面我们看看在Spring AOP中拦截器链是怎样被调用的,也就是Proxy模式是怎样起作用的,或者说Spring是怎样为我们提供AOP功能的;
在JdkDynamicAopProxy中生成Proxy对象的时候:



我们先看看目标对象方法的调用,这里是通过AopUtils的方法调用 - 使用反射机制来对目标对象的方法进行调用:



对拦截器链的调用处理是在ReflectiveMethodInvocation里实现的:
public Object invoke(final MethodInvocation invocation) throws Throwable {      ......//这里是TransactionInterceptor插入的事务处理代码,我们会在后面分析事务处理实现的时候进行分析           try {               //这里是对配置的拦截器链进行迭代处理的调用               retVal = invocation.proceed();           }      ......//省略了和事务处理的异常处理代码 ,也是TransactionInterceptor插入的处理         else {           try {               Object result = ((CallbackPreferringPlatformTransactionManager) getTransactionManager()).execute(txAttr,                       new TransactionCallback() {                           public Object doInTransaction(TransactionStatus status) {                                //这里是TransactionInterceptor插入对事务处理的代码                               TransactionInfo txInfo = prepareTransactionInfo(txAttr, joinpointIdentification, status);                               //这里是对配置的拦截器链进行迭代处理的调用,接着顺着拦截器进行处理                               try {                                                           return invocation.proceed();                               }      ......//省略了和事务处理的异常处理代码 ,也是TransactionInterceptor插入的处理      }      public Object invoke(final MethodInvocation invocation) throws Throwable {       ......//这里是TransactionInterceptor插入的事务处理代码,我们会在后面分析事务处理实现的时候进行分析            try {                //这里是对配置的拦截器链进行迭代处理的调用                retVal = invocation.proceed();            }       ......//省略了和事务处理的异常处理代码 ,也是TransactionInterceptor插入的处理          else {            try {                Object result = ((CallbackPreferringPlatformTransactionManager) getTransactionManager()).execute(txAttr,                        new TransactionCallback() {                            public Object doInTransaction(TransactionStatus status) {                                 //这里是TransactionInterceptor插入对事务处理的代码                                TransactionInfo txInfo = prepareTransactionInfo(txAttr, joinpointIdentification, status);                                //这里是对配置的拦截器链进行迭代处理的调用,接着顺着拦截器进行处理                                try {                                                            return invocation.proceed();                                }       ......//省略了和事务处理的异常处理代码 ,也是TransactionInterceptor插入的处理       }


从上面的分析我们看到了Spring AOP的基本实现,比如Spring怎样得到Proxy,怎样利用JAVA Proxy以及反射机制对用户定义的拦截器链进行处理。

热点排行