spring aop框架对BeforeAdvice、AfterAdvice、ThrowsAdvice三种通知类型的支持实际上是借助适配器模式来实现的,这样的好处是使得框架允许用户向框架中加入自己想要支持的任何一种通知类型,上述三种通知类型是spring aop框架定义的,它们是aop联盟定义的Advice的子类型。
位于org.springframework.aop.framework.adapter包中的AdvisorAdapter是一个适配器接口,它定义了自己支持的Advice类型,并且能把一个Advisor适配成MethodInterceptor(这也是AOP联盟定义的借口),以下是它的定义
public interface AdvisorAdapter {
// 将一个Advisor适配成MethodInterceptor
MethodInterceptor getInterceptor(Advisor advisor);
// 判断此适配器是否支持特定的Advice
boolean supportsAdvice(Advice advice);
}
这个接口允许扩展spring aop框架,以便处理新的Advice或Advisor类型,其实现对象可以把某些特定的Advice类型适配成AOP联盟定义的MethodInterceptor,并在spring aop框架中启用这些通知类型。通常spring用户不需要实现这个接口,除非想把更多的Advice和Advisor引入到spring中时。
spring aop框架本身为这个接口提供了很好的实现,例如为了支持MethodBeforeAdivce、AfterReturningAdvice、以及ThrowsAdvice这三种通知类型,spring在org.springframework.aop.framework.adapter包中分别为它们定义了相应的适配器,在此仅以AfterReturningAdviceAdapter为例
class AfterReturningAdviceAdapter implements AdvisorAdaptor, Serializable {
// 此适配器仅支持AfterReturningAdivce类型
public boolean supportsAdvice(Advice advice) {
return advice instanceof AfterReturningAdivce;
}
// 把特定的Advisor适配成MethodInterceptor
public MethodInterceptor getInterceptor(Advisor advisor) {
AfterReturningAdivce advice = (AfterReturningAdivce) advisor.getAdvice();
return new AfterReturningAdviceInterceptor(advice);
}
}
其中,AfterReturningAdviceInterceptor也是org.springframework.aop.framework.adapter包中定义的
public class AfterReturningAdviceInterceptor implements MethodInterceptor,
AfterAdvice, Serializable {
private final AfterReturningAdvice advice;
public AfterReturningAdviceInterceptor(AfterReturningAdvice advice) {
this.advice = advice;
}
// 实现MethodInterceptor中定义的invoke方法
public Object invoke(MethodInvocation mi) throws Throwable {
Object ret = mi.proceed();
this.advice.afterReturning(ret, mi.getMethod(), mi.getArguments(), mi.getThis());
return ret;
}
}
那么,这些适配器在spring aop框架中是如何发挥作用的呢,位于org.springframework.aop.framework.adapter包中的AdvisorAdapterRegistry接口定义了管理AdvisorAdapter的语义
public interface AdvisorAdaptorRegistry {
// 为某一Advisor返回所有适合它的方法拦截器
MethodInterceptor[] getInterceptors(Advisor advisor);
// 注册AdvisorAdapter
void registerAdvisorAdapter(AdvisorAdapter adapter);
// 将一个Advice包装成一个Advisor
Advisor wrap(Object advice);
}
它的默认实现是DefaultAdvisorAdapterRegistry,它也同样位于org.springframework.aop.framework.adapter包中,我们在如下的定义中可以看到,MethodBeforeAdivceAdapter、AfterReturningAdviceAdapter以及ThrowsAdviceAdapter已经被事先注册到了DefaultAdvisorAdapterRegistry中
public class DefaultAdvisorAdapterRegistry implements AdvisorAdapterRegistry,
Serializable {
private final List adapters = new ArrayList(3);
public DefaultAdvisorAdapterRegistry() {
registerAdvisorAdapter(new MethodBeforeAdviceAdapter());
registerAdvisorAdapter(new AfterReturningAdviceAdapter());
registerAdvisorAdapter(new ThrowsAdviceAdapter());
}
// .......
}
这个包中的GlobalAdvisorAdapterRegistry只不过为DefaultAdvisorAdapterRegistry提供了单例模式的实现,典型的获得DefaultAdvisorAdapterRegistry实例的代码是AdvisorAdapterRegistry registry=GlobalAdvisorAdapterRegistry.getInstance();如果我们想把自己定义的AdvisorAdapter注册到spring aop框架中也是可以的,除了把我们自定义的AdvisorAdapter当作一个最普通的bean注册到spring的IOC容器之外还需要注册spring中定义的一个bean,那就是AdvisorAdapterRegistrationManager,它也位于org.springframework.aop.framework.adapter包中,有兴趣的朋友可以看看它的源码,再简单不过了,它只不过是实现了BeanPostProcessor接口,并在postProcessAfterInitialization方法中检测bean是否实现了AdvisorAdapter,如果实现了就把它注册到全局的AdvisorAdapter管理器中。
分享到:
相关推荐
在本章中,我们将探讨17种设计模式在Spring AOP中的应用和实现,以及它们如何帮助提升软件的可维护性和扩展性。 1. **抽象工厂模式(Abstract Factory)**:Spring AOP框架中的`AopProxyFactory`接口代表抽象工厂,...
- **自动模式**:指的是Spring AOP的自动代理创建功能,即不需要手动指定代理对象,而是通过配置自动创建。 - **AbstractAutoProxyCreator**:一个抽象类,它实现了自动创建代理对象的逻辑。 - **...
这些文本可能包含了如何创建动态代理对象、如何实现InvocationHandler、如何设计适配器类以及如何在实际项目中应用这两种模式的具体步骤。为了深入理解这两种模式,建议阅读并分析这些文本中的代码和解释,以便更好...
在实际应用中,适配器模式被广泛使用,例如在Spring AOP中,MethodInterceptor作为适配器,将Advice转换为拦截器链的形式;Spring MVC通过适配器模式执行Controller中的请求处理方法;Spring JPA中的...
**Spring AOP在鉴权和日志记录中的应用** **一、引言** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要特性,它为开发者提供了在不修改源代码的情况下,对应用程序进行功能增强...
在Spring AOP中,日志框架的集成使得我们能够方便地对应用程序的执行过程进行跟踪和记录,这对于调试、性能优化以及问题排查至关重要。 要实现基于注解的日志管理,首先我们需要理解几个核心概念: 1. 切面...
在JDK和Spring源码中,模板模式和适配器模式都有广泛应用。例如,Spring的`JdbcTemplate`和`HibernateTemplate`都是模板模式的实例,它们提供了数据库操作的通用流程,允许用户自定义数据查询和处理的逻辑。而适配器...
理解并掌握这些库的作用,对于高效地在Spring环境中应用AOP至关重要。在实际开发中,我们还需要了解如何配置Spring的AOP支持,编写切面类,定义切点和通知,以及如何将它们整合到Spring的IoC容器中。这些都是成为...
1. **整体设计**:Spring AOP API的设计目标是为应用程序提供灵活的切面编程能力。它通过AOP代理来拦截方法调用,执行相应的Advice,实现了切面的透明插入。 2. **接入点接口 - Joinpoint**:Joinpoint是程序执行...
Spring设计模式简介:主要是讲述Spring源码中运用到的一些设计模式 Ibatis设计模式简介:主要是讲述Ibatis源码中运用到的一些设计模式 设计模式简介 1 单例模式 2 责任链模式 3 策略模式 4 模板方法模式 5 工厂方法...
Spring中的AOP(面向切面编程)也利用了适配器模式,将各种Advice转换为相应的拦截器,以适应不同的处理逻辑。 最后,模板方法模式常用于定义算法的骨架,允许子类在不改变整体结构的情况下重定义某些步骤。在...
在Spring中,例如AOP(面向切面编程)的实现,通过代理模式和适配器模式将切面逻辑插入到目标对象的方法执行中。 5. **装饰器模式**:装饰器模式允许在运行时动态地给对象添加新的行为或职责。Spring AOP中的代理...
5. **装饰器模式**:装饰器模式允许在运行时动态添加功能,例如Spring AOP中的代理对象就是装饰器模式的应用,可以在不修改原有对象的基础上增加新的行为或属性。 6. **代理模式**:Spring AOP基于代理模式实现切面...
本文将深入探讨 Spring 中运用的一些典型设计模式,包括但不限于工厂模式、装饰器模式、代理模式、单例模式、委派模式、策略模式以及适配器模式等,并结合具体的 Spring 类和接口来分析这些模式的应用场景和实现方式...
10. **适配器模式(Adapter)**:Spring的JDBC抽象层,如JdbcTemplate,就是适配器模式的应用,它将数据库访问接口适配成易于使用的API。 11. **组合模式(Composite)**:在Spring MVC中,Controller可以包含其他...
Spring AOP(面向切面编程)中广泛使用了代理模式。动态代理可以在运行时创建对象的代理,拦截并处理方法调用,实现事务控制、日志记录等跨切面关注点。 7. **装饰器模式(Decorator Pattern)**: Spring MVC中的...
4. **适配器模式**:在处理不同类型的持久化技术时,Spring使用适配器模式来封装底层细节,提供统一的接口。 5. **观察者模式**:ApplicationContext实现了观察者模式,允许监听器监听应用程序上下文中的变化。 #...
在实际开发中,Spring MVC常与其他Spring模块结合使用,如Spring Data用于数据库访问,Spring Security进行权限控制,Spring AOP实现切面编程等。此外,Spring Boot进一步简化了Spring MVC的配置,使得快速开发Web...