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 {
.......
}
}
分享到:
相关推荐
在Java Web开发中,Spring、Struts2和MyBatis是三个非常重要的框架,它们各自在不同的层面上提供了强大的功能。Spring作为一个全面的轻量级框架,提供了依赖注入(DI)和面向切面编程(AOP)等核心特性;Struts2作为...
5. **整合Struts2和Spring**:使用Spring插件`struts2-spring-plugin`,配置Struts2的拦截器链,使Struts2能够从Spring容器中自动注入Action。 6. **整合Spring和MyBatis**:通过Spring的`SqlSessionFactoryBean`...
其核心JAR文件如`struts2-core`提供了Action、拦截器、结果类型等关键组件。此外,可能还需要其他相关库,如`struts2-convention-plugin`、`struts2-json-plugin`等,用于不同类型的请求处理和数据格式化。 **...
Struts2、Spring和MyBatis是Java Web开发中三个非常重要的框架,它们分别负责MVC模式中的Action层、业务层和服务数据访问层。本文将详细介绍如何使用注解方式将这三个框架整合在一起,以实现一个高效、灵活的Web应用...
Struts2、Spring和MyBatis是Java Web开发中非常流行的三大开源框架,它们的集成使用,即SSM(Struts2-Spring-MyBatis)框架,为开发者提供了高效且灵活的解决方案。这个"struts2+spring+mybatis框架JAR包"集合了这三...
Struts2通过拦截器机制实现了灵活的扩展性,同时支持多种结果类型,如JSP、FreeMarker等。在图书管理系统中,Struts2可以作为用户交互的入口,处理借书、还书、查询等操作的请求。 2. **Spring3**:Spring是一个...
在实际的项目中,还需要考虑异常处理、国际化、权限控制等方面,Struts2提供了拦截器(Interceptor)机制,可以方便地实现这些功能。Spring的AOP则可以在不修改原有代码的情况下,对代码进行扩展或增强。 总的来说...
Struts2的核心是Action和Interceptor(拦截器),通过配置Action和Interceptor,我们可以实现灵活的控制流程和业务处理。 Spring则是一个全面的企业级应用框架,它提供依赖注入(DI)和面向切面编程(AOP)等功能,...
在Java Web开发中,MyBatis、Spring和Struts2是三个非常重要的框架,它们各自在不同的层面上提供了强大的功能,常被组合使用以构建高效的企业级应用。本压缩包包含的是这三个框架协同工作时所需的必备jar包。下面将...
通过Action类和配置文件,Struts能够协调用户的输入和系统的响应,提供了丰富的拦截器和插件机制,便于扩展和定制。 **2. Spring:**Spring是一个全面的后端开发框架,包括IOC(Inversion of Control)容器、AOP...
Struts2、Spring和MyBatis是Java Web开发中三个非常重要的开源框架,它们的整合为开发者提供了强大的功能,能够实现MVC(Model-View-Controller)架构模式,提高开发效率,同时也便于项目的维护和扩展。以下是关于...
MyBatis使用了Java的动态代理和AOP(面向切面编程)思想,拦截器实际上是一个实现了`org.apache.ibatis.plugin.Interceptor`接口的类。当MyBatis执行Mapper的方法时,会通过拦截器链对方法进行处理。每个拦截器都有`...
它提供了强大的拦截器机制,可以方便地实现AOP、权限控制等功能。Struts2与Spring的整合使得模型层(由Spring管理)和视图层(由Struts2处理)可以无缝对接,提供了更好的业务逻辑处理和用户界面展示。 **整合的...
在MyBatis中,我们可以通过实现`org.apache.ibatis.plugin.Interceptor`接口并重写`intercept`方法来创建一个自定义拦截器。 分页是数据库操作中常见的需求,传统的做法是在每个查询方法中添加分页逻辑,但这会导致...
Struts2-Spring-plugin是一个关键的jar包(如struts2-spring-plugin-2.5.13.jar),它实现了Struts2和Spring之间的无缝集成。这个插件使得Action类可以直接从Spring容器中获取依赖,简化了配置,并且提供了更好的...
Spring、Struts2和MyBatis是三个非常著名的Java开源框架,它们分别负责不同的职责:Spring作为全能的轻量级框架,Struts2作为MVC(模型-视图-控制器)框架处理HTTP请求,而MyBatis则是一个强大的持久层框架。当这三...
5. **拦截器集成**:可以使用Spring的AOP拦截器与Struts 2的拦截器相结合,增强应用的功能。 6. **测试与调试**:整合完成后,进行单元测试和集成测试,确保所有组件协同工作。 整合Spring和Struts 2可以使开发...
7. **插件支持**:MyBatis 提供了插件机制,允许用户自定义拦截器来修改 SQL 执行过程。在源码中,你可以看到 Plugin 类的实现,它是如何实现 AOP 功能的。 8. **事务管理**:MyBatis 支持手动和自动的事务管理。...
7. **拦截器(Interceptor)**:Struts2 的拦截器可以实现登录检查、权限控制等功能。 8. **过滤器(Filter)**:可能包括字符编码过滤器、Spring Security 过滤器等,用于处理请求和响应。 在实际开发中,还需要...
Struts2、Spring3和MyBatis是Java Web开发中常用的三大框架,它们各自负责不同的职责,协同工作可以构建出高效、松耦合的应用。在Java企业级开发中,这三者的整合是常见的实践,通常被称为SSM框架。下面将详细介绍这...