`
jimgreat
  • 浏览: 132098 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring-AOP、Struts2拦截器、MyBatis Plugin实现原理比较(三)

阅读更多

Spring AOP

 

Spring和struts2拦截链的实现理念是一样的,所有的拦截器会组织成一个链,由中央调度器统一推进。

 

Spring在拦截器(通知 Advice) 的接口上做得更细致一些,在MyBatis和Struts2中,拦截器链的推进是要在每个拦截器的实现中显式调用的。而在Spring中,这个动作已经被封装了。

 

看下面这个 AfterReturningAdvice 通知

public interface AfterReturningAdvice extends AfterAdvice {

	void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable;

}

你只要实现一个afterReturning方法,就可以在拦截点执行后,执行这个方法。按逻辑说,需要在这个方法执行之前,推进拦截链的执行,待其返回后再执行这个方法。 这个拦截链推进在什么地方呢?

 

其实这里的Advice并不能直接够成拦截器,AfterReturningAdvice会被Spring-AOP包装成下面的AfterReturningAdviceInterceptor。 在AfterReturningAdviceInterceptor中,我们看到到了熟悉的invoke,它的参数MethodInvocation 就是中央调度器,和Struts2一样,它里面封装了整个拦截链。

 

 AfterReturningAdviceInterceptor 内部封装了  AfterReturningAdvice,在invoke调用时,先是推进了拦截链前进,保存返回值,再调用afterReturning 方法来完成切面逻辑。

 

public class AfterReturningAdviceInterceptor implements MethodInterceptor, AfterAdvice, Serializable {

	private final AfterReturningAdvice advice;

	public AfterReturningAdviceInterceptor(AfterReturningAdvice advice) {
		Assert.notNull(advice, "Advice must not be null");
		this.advice = advice;
	}

	public Object invoke(MethodInvocation mi) throws Throwable {
		Object retVal = mi.proceed();
		this.advice.afterReturning(retVal, mi.getMethod(), mi.getArguments(), mi.getThis());
		return retVal;
	}

}

 

下面就是推进拦截链的方法proceed(),推进原理和Struts2是一样的 

 

 

从interceptorsAndDynamicMethodMatchers中取出下一个拦截器,如果是动态拦截器,则匹配后再执行;否则直接调用拦截器的invoke

 

 

 ((MethodInterceptor) interceptorOrInterceptionAdvice).invoke(this);
 

如果currentInterceptorIndex已经是最后一个索引,就直接执行拦截点的方法

 

	public Object proceed() throws Throwable {
		//	We start with an index of -1 and increment early.
		if (this.currentInterceptorIndex == this.interceptorsAndDynamicMethodMatchers.size() - 1) {
			return invokeJoinpoint();
		}

		Object interceptorOrInterceptionAdvice =
		    this.interceptorsAndDynamicMethodMatchers.get(++this.currentInterceptorIndex);
		if (interceptorOrInterceptionAdvice instanceof InterceptorAndDynamicMethodMatcher) {
			// Evaluate dynamic method matcher here: static part will already have
			// been evaluated and found to match.
			InterceptorAndDynamicMethodMatcher dm =
			    (InterceptorAndDynamicMethodMatcher) interceptorOrInterceptionAdvice;
			if (dm.methodMatcher.matches(this.method, this.targetClass, this.arguments)) {
				return dm.interceptor.invoke(this);
			}
			else {
				// Dynamic matching failed.
				// Skip this interceptor and invoke the next in the chain.
				return proceed();
			}
		}
		else {
			// It's an interceptor, so we just invoke it: The pointcut will have
			// been evaluated statically before this object was constructed.
			return ((MethodInterceptor) interceptorOrInterceptionAdvice).invoke(this);
		}
	}
 

 

下面这个invoke是对目标拦截对象的代理拦截入口

 

这里面初始化了ReflectiveMethodInvocation 这个中央调度器的实例,拦截链chain也做为参数传了进去。

 

最后通过 invocation.proceed(); 启动这个拦截链,开始了层层拦截。

 

	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		MethodInvocation invocation;
		Object oldProxy = null;
		boolean setProxyContext = false;

		TargetSource targetSource = this.edvised.targetSource;
		Class targetClass = null;
		Object target = null;

		try {
			.......
			if (chain.isEmpty()) {
				
				retVal = AopUtils.invokeJoinpointUsingReflection(target, method, args);
			}
			else {
				// We need to create a method invocation...
				invocation = new ReflectiveMethodInvocation(proxy, target, method, args, targetClass, chain);
				// Proceed to the joinpoint through the interceptor chain.
				retVal = invocation.proceed();
			}
			.......
			return retVal;
		}
		finally {
			.......
		}
	}
 

 

 

分享到:
评论
1 楼 yt11 2015-07-16  
[color=red][/color]

相关推荐

    Spring-Struts2-mybatis jar包整合

    在Java Web开发中,Spring、Struts2和MyBatis是三个非常重要的框架,它们各自在不同的层面上提供了强大的功能。Spring作为一个全面的轻量级框架,提供了依赖注入(DI)和面向切面编程(AOP)等核心特性;Struts2作为...

    整合struts2-spring-MyBatis

    5. **整合Struts2和Spring**:使用Spring插件`struts2-spring-plugin`,配置Struts2的拦截器链,使Struts2能够从Spring容器中自动注入Action。 6. **整合Spring和MyBatis**:通过Spring的`SqlSessionFactoryBean`...

    ssm jar spring struts mybatis 所需jar

    其核心JAR文件如`struts2-core`提供了Action、拦截器、结果类型等关键组件。此外,可能还需要其他相关库,如`struts2-convention-plugin`、`struts2-json-plugin`等,用于不同类型的请求处理和数据格式化。 **...

    全注解,演示Struts2 + Spring + MyBatis整合

    Struts2、Spring和MyBatis是Java Web开发中三个非常重要的框架,它们分别负责MVC模式中的Action层、业务层和服务数据访问层。本文将详细介绍如何使用注解方式将这三个框架整合在一起,以实现一个高效、灵活的Web应用...

    struts2+spring+mybatis框架JAR包

    Struts2、Spring和MyBatis是Java Web开发中非常流行的三大开源框架,它们的集成使用,即SSM(Struts2-Spring-MyBatis)框架,为开发者提供了高效且灵活的解决方案。这个"struts2+spring+mybatis框架JAR包"集合了这三...

    struts2,spring3,mybatis整合图书

    Struts2通过拦截器机制实现了灵活的扩展性,同时支持多种结果类型,如JSP、FreeMarker等。在图书管理系统中,Struts2可以作为用户交互的入口,处理借书、还书、查询等操作的请求。 2. **Spring3**:Spring是一个...

    struts2 spring3 mybatis3整合简单例子

    在实际的项目中,还需要考虑异常处理、国际化、权限控制等方面,Struts2提供了拦截器(Interceptor)机制,可以方便地实现这些功能。Spring的AOP则可以在不修改原有代码的情况下,对代码进行扩展或增强。 总的来说...

    Struts2+Spring3+MyBatis框架整合源码+pdf整合文档

    Struts2的核心是Action和Interceptor(拦截器),通过配置Action和Interceptor,我们可以实现灵活的控制流程和业务处理。 Spring则是一个全面的企业级应用框架,它提供依赖注入(DI)和面向切面编程(AOP)等功能,...

    mybatis+spring+struts必须的jar包

    在Java Web开发中,MyBatis、Spring和Struts2是三个非常重要的框架,它们各自在不同的层面上提供了强大的功能,常被组合使用以构建高效的企业级应用。本压缩包包含的是这三个框架协同工作时所需的必备jar包。下面将...

    ssi(struts+spring+maven+mybatis)整合

    通过Action类和配置文件,Struts能够协调用户的输入和系统的响应,提供了丰富的拦截器和插件机制,便于扩展和定制。 **2. Spring:**Spring是一个全面的后端开发框架,包括IOC(Inversion of Control)容器、AOP...

    struts2+spring+mybatis整合

    Struts2、Spring和MyBatis是Java Web开发中三个非常重要的开源框架,它们的整合为开发者提供了强大的功能,能够实现MVC(Model-View-Controller)架构模式,提高开发效率,同时也便于项目的维护和扩展。以下是关于...

    mybatis拦截器的完整实现

    MyBatis使用了Java的动态代理和AOP(面向切面编程)思想,拦截器实际上是一个实现了`org.apache.ibatis.plugin.Interceptor`接口的类。当MyBatis执行Mapper的方法时,会通过拦截器链对方法进行处理。每个拦截器都有`...

    spring3.0整合mybatis3.0、struts2

    它提供了强大的拦截器机制,可以方便地实现AOP、权限控制等功能。Struts2与Spring的整合使得模型层(由Spring管理)和视图层(由Struts2处理)可以无缝对接,提供了更好的业务逻辑处理和用户界面展示。 **整合的...

    mybatis使用拦截器实现分页操作

    在MyBatis中,我们可以通过实现`org.apache.ibatis.plugin.Interceptor`接口并重写`intercept`方法来创建一个自定义拦截器。 分页是数据库操作中常见的需求,传统的做法是在每个查询方法中添加分页逻辑,但这会导致...

    SSH整合的包 Struts2包 spring的jar包 Mybatis包

    Struts2-Spring-plugin是一个关键的jar包(如struts2-spring-plugin-2.5.13.jar),它实现了Struts2和Spring之间的无缝集成。这个插件使得Action类可以直接从Spring容器中获取依赖,简化了配置,并且提供了更好的...

    spring_struts2_mybatis配置文件架包

    Spring、Struts2和MyBatis是三个非常著名的Java开源框架,它们分别负责不同的职责:Spring作为全能的轻量级框架,Struts2作为MVC(模型-视图-控制器)框架处理HTTP请求,而MyBatis则是一个强大的持久层框架。当这三...

    Spring与Struts 2整合.zip

    5. **拦截器集成**:可以使用Spring的AOP拦截器与Struts 2的拦截器相结合,增强应用的功能。 6. **测试与调试**:整合完成后,进行单元测试和集成测试,确保所有组件协同工作。 整合Spring和Struts 2可以使开发...

    mybatis-3.5.9 源码(mybatis-3-mybatis-3.5.9.tar.gz)

    7. **插件支持**:MyBatis 提供了插件机制,允许用户自定义拦截器来修改 SQL 执行过程。在源码中,你可以看到 Plugin 类的实现,它是如何实现 AOP 功能的。 8. **事务管理**:MyBatis 支持手动和自动的事务管理。...

    Spring+struts2

    7. **拦截器(Interceptor)**:Struts2 的拦截器可以实现登录检查、权限控制等功能。 8. **过滤器(Filter)**:可能包括字符编码过滤器、Spring Security 过滤器等,用于处理请求和响应。 在实际开发中,还需要...

    struts2+spring3+mybatis整合

    Struts2、Spring3和MyBatis是Java Web开发中常用的三大框架,它们各自负责不同的职责,协同工作可以构建出高效、松耦合的应用。在Java企业级开发中,这三者的整合是常见的实践,通常被称为SSM框架。下面将详细介绍这...

Global site tag (gtag.js) - Google Analytics