废话少说,直接上Spring的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"
default-lazy-init="true">
<bean id="services" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target">
<ref bean="servicesTarget"/>
</property>
<property name="interfaces">
<list>
<value>test.test.aop.IServices</value>
</list>
</property>
<property name="proxyTargetClass">
<value>false</value>
</property>
<property name="interceptorNames">
<list>
<value>defaultPointcutAdvisor</value>
<!--
<value>nameMatchMethodPointcutAdvisor</value>
<value>regexpMethodPointcutAdvisor</value>
<value>myAdvice</value>
<value>defaultPointcutAdvisor</value>
-->
</list>
</property>
</bean>
<bean id="servicesTarget" class="test.test.aop.ServicesImpl" />
<bean id="myAdvice" class="test.test.aop.MyAdvice" />
<!-- 根据方法名称匹配来创建切入点 -->
<bean id="nameMatchMethodPointcutAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
<property name="mappedName">
<value>foo2</value>
</property>
<property name="advice">
<ref bean="myAdvice" />
</property>
</bean>
<!-- 根据正则表达式匹配方法名称来创建切入点 -->
<bean id="regexpMethodPointcutAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="pattern">
<value>.*2$</value>
</property>
<property name="advice">
<ref bean="myAdvice"/>
</property>
</bean>
<!-- 根据Pointcut和Advice 创建PointcutAdvisor-->
<bean id="defaultPointcutAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="pointcut">
<ref bean="controlFlowPointcut"/>
</property>
<property name="advice">
<ref bean="myAdvice" />
</property>
</bean>
<!-- 动态切入点 根据运行时堆栈和方法信息判断切入点 -->
<bean id="controlFlowPointcut" class="org.springframework.aop.support.ControlFlowPointcut">
<constructor-arg>
<!-- 注意这里不能配置service接口或实现类的class名称,因为servcie类或接口已经被代理了 -->
<value>test.test.aop.TestMain</value>
</constructor-arg>
<constructor-arg>
<value>main</value>
</constructor-arg>
</bean>
<!-- 根据bean names动态代理 -->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="proxyTargetClass" value="false" />
<property name="beanNames">
<list>
<value>servicesTarget2</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>regexpMethodPointcutAdvisor</value>
<!--
<value>nameMatchMethodPointcutAdvisor</value>
<value>regexpMethodPointcutAdvisor</value>
<value>myAdvice</value>
<value>defaultPointcutAdvisor</value>
-->
</list>
</property>
</bean>
<!-- 重现定义一个bean name,避免被 BeanNameAutoProxyCreator 重复代理-->
<bean id="servicesTarget2" class="test.test.aop.ServicesImpl" />
</beans>
这份配置文件较为冗长,咋一看比较复杂,但如果仔细分析,我们会发现其实没有那么复杂。
我们先从最基础的元素开始,test.test.aop.IServices是我们定义的一个业务接口,里面有两个业务方法,foo()和foo2();
test.test.aop.ServicesImpl是test.test.aop.IServices的具体实现。
再来看与AOP相关的配置,这里我们需要简单的解释几个概念,一个是Advice,这个在有写文档里面称为“增强”或者“通知”,其实可以更直观的理解为一个方法被拦截后做其他相关事情的地方。它的一般实现是实现一个org.aopalliance.intercept.MethodInterceptor接口,并实现其invoke方法,在该方法实现中,通过MethodInvocation.proceed()可以调用到目标方法。
另外一个相关的概念就是Pointcut,就是切面,更直观一点的理解就是在什么时候会被拦截。而Spring定义了另外一个概念,即PointcutAdvisor,即将Pointcut对象和Advice对象组合在一起,决定在什么地方,做什么的动作。
有了业务接口、业务实现(目标)、横切面和通知,那么是什么让这些元素组合在一起呢?在Spring中就是通过代理的方式,将上述的这些元素组合在一起,org.springframework.aop.framework.ProxyFactoryBean就是最常用的一个代理工厂Bean,其可以产生相应的代理对象。它由如下几个重要的属性将业务接口、业务实现、横切面和通知(PointcutAdivsor)整合在一起。
interfaces属性,指定需要代理的接口;
target属性,指定代理对象的目标对象(可以参考设计模式的代理模式);
proxyTargetClass属性,true或者false,true表示通过类代理,false表示通过接口代理,跟具体的区别在与,如果为true,那么需要使用GCLib来生成目标对象的子类,这样要要求目标对象类不能为final,并且需要拦截的方法,也不能为final的。因为final的类和方法没有办法生成子类和重写父类的方法。
interceptorNames属性就是将设置PointcutAdvisor的地方,这里可以将Advisor,也就是之前定义的通知,直接配置到这里,那么目标对象的所有方法都将被拦截。
我们再来详细解释一下PointcutAdivsor这个对象。刚才已经提到PointcutAdivsor对象实际上是Pointcut对象和Adivsor对象的组合,Adivsor对我们已经有了,也就是org.aopalliance.intercept.MethodInterceptor接口对象的实现。那么Pointcut这个对象该如何定义呢?其实Spring已经帮我们定义好了几个默认的实现,我们只需要简单的配置即可。先来看最常用的org.springframework.aop.support.NameMatchMethodPointcutAdvisor对象,该对象内部已经包含了一个org.springframework.aop.support.NameMatchMethodPointcut对象,顾名思义,通过匹配方法名称来定义Pointcut对象,所以我们在配置org.springframework.aop.support.NameMatchMethodPointcutAdvisor对象的时候,配置一个方法匹配的名称,实际上在其内部是生成了一个org.springframework.aop.support.NameMatchMethodPointcut对象。
另外一个也比较常用的PointcutAdvisor是org.springframework.aop.support.RegexpMethodPointcutAdvisor,即通过正则表达式来匹配方法的名称,同样,其内部也是包含了一个org.springframework.aop.support.AbstractRegexpMethodPointcut抽象对象,具体实现为org.springframework.aop.support.JdkRegexpMethodPointcut。
org.springframework.aop.support.DefaultPointcutAdvisor是一个更一般性的PointcutAdvisor对象,可以运行自己定义自己的Pointcut和Advisce。
上述配置Ok之后,一切就大功告成了。但这里有一个小问题就是每一个业务接口和其业务实现,我们都需要配置一个ProxyFactoryBean。那么有什么办法能简化这个过程呢?答案就是使用org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator对象,该对象能够根据我们配置的bean name来确定那些bean对象需要被代理,并创建出其代理对象。同样在代理时需要确定是通过接口代理还是类代理,即proxyTargetClass属性。同样需要配置interceptorNames属性,即PointcutAdvisor列表。
威力更大的是org.springframework.aop.support.DefaultAdvisorAutoProxyCreator对象,该对象会自动扫描Spring配置文件中,将符合定义在其interceptorNames属性的PointcutAdvisor对象的所有bean自动产生代理对象。
这里可以下载上述配置实例的代码,但需要引用Sping2.0以上的包才能运行。
分享到:
相关推荐
SpringBoot结合AspectJ实现SpringAOP拦截指定方法的知识点涵盖了多个方面,这包括Spring AOP的基本概念、SpringBoot的应用、切点(Pointcut)与通知(Advice)的定义、自定义注解以及AspectJ的使用。以下是这些知识...
这篇教程将详细讲解如何通过Spring的配置文件来实现AOP。 一、理解AOP概念 AOP的核心思想是将分散在各个模块中的交叉性代码(如日志、事务处理)抽取出来,形成独立的切面,以便于复用和维护。它提供了一种模块化的...
本教程将详细介绍如何利用注解来配置和使用AOP来拦截Controller层的方法,以便记录执行过程中的相关信息,实现日志管理。 一、Spring AOP基础 AOP是Spring框架的核心组件之一,它允许程序员定义“切面”,这些切面...
在实际开发中,你可以根据需求选择合适的织入方式(如Spring的代理模式或AspectJ的字节码织入),并结合这三个jar包,灵活地使用AOP来编写解耦、模块化的代码。同时,了解这些基础组件的工作原理,将有助于你更好地...
"springaop拦截controller日志"这个主题旨在讲解如何使用Spring AOP来拦截Controller层的方法调用,并在方法执行前后记录相关日志。 首先,了解Spring AOP的基本概念。AOP是一种编程范式,它允许程序员定义“切面”...
本节将详细介绍如何使用Spring AOP实现流程日志跟踪,主要关注于如何通过AOP拦截特定的类和方法来进行日志记录。 ##### 3.1 配置Spring AOP 在Spring配置文件中定义切面和切入点表达式是非常关键的一步。一般来说...
总结一下,通过上述步骤,我们已经在Spring Boot应用中利用Spring AOP和注解方式实现了数据脱敏。这个拦截器可以在不修改原有业务代码的情况下,确保敏感信息在响应给客户端之前得到处理,提高了应用的安全性。同时...
在提供的压缩包中,可能包含了一个或多个测试类(Tests),这些测试类通常用来验证AOP拦截器的功能。它们可能包含模拟业务场景的方法,这些方法会被切面拦截并执行相应的通知。通过运行这些测试,我们可以确保AOP...
本文将详细介绍如何使用AspectJ注解在Spring MVC中实现AOP拦截Controller方法,并提供一个具体的例子。 首先,我们需要了解Spring AOP的基础概念。AOP允许我们定义“切面”,这些切面包含了业务逻辑中横切关注点的...
这个“spring AOP拦截方法小示例”是一个实际应用,展示了如何使用Spring AOP来拦截特定层的所有方法,并在调用前后以及出现异常时执行自定义逻辑。 首先,让我们了解AOP的基本概念。AOP的核心是切面(Aspect),它...
本例提供了一个简单的AOP拦截器实现,我们可以从这个基础出发,深入理解和探讨AOP的核心概念、工作原理以及其在实际开发中的应用。 首先,AOP的主要目标是解决程序中的横切关注点,如日志记录、事务管理、性能监控...
在IT领域,Spring框架是一个广泛使用的Java应用框架,它提供了许多功能,包括依赖注入、面向切面编程(AOP)等。"spring-aop-jar"这个主题涉及到Spring框架中的核心组件之一——Spring AOP。这里我们将深入探讨...
从上述配置可以看出,Spring AOP主要是通过`ProxyFactoryBean`来创建代理对象,通过配置不同的拦截器来实现对目标对象方法的增强。这种配置方式非常灵活,可以根据实际需求动态地添加或修改拦截器,从而实现特定的...
在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态代理。 JDK 动态代理是基于接口的,它要求被代理的目标对象必须实现至少一个接口。Spring 使用 `java.lang.reflect.Proxy`...
5. **@EnableAspectJAutoProxy**: 在Spring配置类上添加此注解,启用基于Java代理的AOP支持,这样Spring会自动检测并处理带有@Aspect注解的类。 ```java @Configuration @EnableAspectJAutoProxy public class ...
在Java开发领域,Spring框架因其强大的功能和灵活性而广受欢迎,尤其在...总的来说,正确配置和使用`aopalliance-1.0.jar`和`aspectjweaver.jar`是实现Spring AOP的关键,它们为Spring提供了一个强大且灵活的AOP实现。
在Spring MVC中,AOP(面向切面编程)是一种强大的工具,可以让我们在不修改代码...综上所述,Spring MVC结合AOP为我们提供了一种优雅的方式,以声明式地管理和记录Controller层的日志,增强了系统的可观察性和稳定性。
在Spring框架中,AOP(面向切面编程)是一种强大的工具,它允许程序员定义横切关注点,如日志、事务...通过理解并应用AOP拦截实例,开发者能够更好地管理和控制应用程序的各个层面,从而提高软件的可维护性和灵活性。
### 自定义注解:开启AOP拦截的钥匙 要想使用AOP来拦截特定方法,首先需要创建一个自定义注解。这个注解将作为标记,指示哪些方法需要被AOP拦截。以@Log为例,这个注解可以在方法级别上应用,并且可以包含SpEL...
Spring AOP 拦截器 Advisor 是 Spring 框架中的一个重要概念,它与切面编程密切相关,用于实现细粒度的控制和增强应用程序的行为。在 Spring AOP 中,Advisor 是一个组合了通知(Advice)和切入点(Pointcut)的对象...