`
runfeel
  • 浏览: 943674 次
文章分类
社区版块
存档分类
最新评论

使用Spring配置AOP拦截的常用方式

 
阅读更多

废话少说,直接上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+aspect实现springaop拦截指定方法.zip

    SpringBoot结合AspectJ实现SpringAOP拦截指定方法的知识点涵盖了多个方面,这包括Spring AOP的基本概念、SpringBoot的应用、切点(Pointcut)与通知(Advice)的定义、自定义注解以及AspectJ的使用。以下是这些知识...

    使用Spring配置文件实现AOP

    这篇教程将详细讲解如何通过Spring的配置文件来实现AOP。 一、理解AOP概念 AOP的核心思想是将分散在各个模块中的交叉性代码(如日志、事务处理)抽取出来,形成独立的切面,以便于复用和维护。它提供了一种模块化的...

    Spring Mvc AOP通过注解方式拦截controller等实现日志管理

    本教程将详细介绍如何利用注解来配置和使用AOP来拦截Controller层的方法,以便记录执行过程中的相关信息,实现日志管理。 一、Spring AOP基础 AOP是Spring框架的核心组件之一,它允许程序员定义“切面”,这些切面...

    Spring使用AOP的三个jar包

    在实际开发中,你可以根据需求选择合适的织入方式(如Spring的代理模式或AspectJ的字节码织入),并结合这三个jar包,灵活地使用AOP来编写解耦、模块化的代码。同时,了解这些基础组件的工作原理,将有助于你更好地...

    springaop拦截controller日志

    "springaop拦截controller日志"这个主题旨在讲解如何使用Spring AOP来拦截Controller层的方法调用,并在方法执行前后记录相关日志。 首先,了解Spring AOP的基本概念。AOP是一种编程范式,它允许程序员定义“切面”...

    spring aop切面拦截指定类和方法实现流程日志跟踪

    本节将详细介绍如何使用Spring AOP实现流程日志跟踪,主要关注于如何通过AOP拦截特定的类和方法来进行日志记录。 ##### 3.1 配置Spring AOP 在Spring配置文件中定义切面和切入点表达式是非常关键的一步。一般来说...

    springboot spring aop 拦截器注解方式实现脱敏

    总结一下,通过上述步骤,我们已经在Spring Boot应用中利用Spring AOP和注解方式实现了数据脱敏。这个拦截器可以在不修改原有业务代码的情况下,确保敏感信息在响应给客户端之前得到处理,提高了应用的安全性。同时...

    spring aop 拦截实例

    在提供的压缩包中,可能包含了一个或多个测试类(Tests),这些测试类通常用来验证AOP拦截器的功能。它们可能包含模拟业务场景的方法,这些方法会被切面拦截并执行相应的通知。通过运行这些测试,我们可以确保AOP...

    spring MVC AOP注解方式如何拦截controller 例子

    本文将详细介绍如何使用AspectJ注解在Spring MVC中实现AOP拦截Controller方法,并提供一个具体的例子。 首先,我们需要了解Spring AOP的基础概念。AOP允许我们定义“切面”,这些切面包含了业务逻辑中横切关注点的...

    spring AOP拦截方法小示例

    这个“spring AOP拦截方法小示例”是一个实际应用,展示了如何使用Spring AOP来拦截特定层的所有方法,并在调用前后以及出现异常时执行自定义逻辑。 首先,让我们了解AOP的基本概念。AOP的核心是切面(Aspect),它...

    spring aop 拦截器简单实现

    本例提供了一个简单的AOP拦截器实现,我们可以从这个基础出发,深入理解和探讨AOP的核心概念、工作原理以及其在实际开发中的应用。 首先,AOP的主要目标是解决程序中的横切关注点,如日志记录、事务管理、性能监控...

    spring-aop-jar

    在IT领域,Spring框架是一个广泛使用的Java应用框架,它提供了许多功能,包括依赖注入、面向切面编程(AOP)等。"spring-aop-jar"这个主题涉及到Spring框架中的核心组件之一——Spring AOP。这里我们将深入探讨...

    Spring之AOP配置文件详解

    从上述配置可以看出,Spring AOP主要是通过`ProxyFactoryBean`来创建代理对象,通过配置不同的拦截器来实现对目标对象方法的增强。这种配置方式非常灵活,可以根据实际需求动态地添加或修改拦截器,从而实现特定的...

    死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序.pdf

    在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态代理。 JDK 动态代理是基于接口的,它要求被代理的目标对象必须实现至少一个接口。Spring 使用 `java.lang.reflect.Proxy`...

    使用Spring的注解方式实现AOP的细节

    5. **@EnableAspectJAutoProxy**: 在Spring配置类上添加此注解,启用基于Java代理的AOP支持,这样Spring会自动检测并处理带有@Aspect注解的类。 ```java @Configuration @EnableAspectJAutoProxy public class ...

    spring 配置aop时需要的jar包

    在Java开发领域,Spring框架因其强大的功能和灵活性而广受欢迎,尤其在...总的来说,正确配置和使用`aopalliance-1.0.jar`和`aspectjweaver.jar`是实现Spring AOP的关键,它们为Spring提供了一个强大且灵活的AOP实现。

    springMVC AOP拦截拦截Controller等实现日志管理

    在Spring MVC中,AOP(面向切面编程)是一种强大的工具,可以让我们在不修改代码...综上所述,Spring MVC结合AOP为我们提供了一种优雅的方式,以声明式地管理和记录Controller层的日志,增强了系统的可观察性和稳定性。

    spring_aop_拦截实例

    在Spring框架中,AOP(面向切面编程)是一种强大的工具,它允许程序员定义横切关注点,如日志、事务...通过理解并应用AOP拦截实例,开发者能够更好地管理和控制应用程序的各个层面,从而提高软件的可维护性和灵活性。

    AOP拦截EL表达式

    ### 自定义注解:开启AOP拦截的钥匙 要想使用AOP来拦截特定方法,首先需要创建一个自定义注解。这个注解将作为标记,指示哪些方法需要被AOP拦截。以@Log为例,这个注解可以在方法级别上应用,并且可以包含SpEL...

    Spring AOP 拦截器 Advisor

    Spring AOP 拦截器 Advisor 是 Spring 框架中的一个重要概念,它与切面编程密切相关,用于实现细粒度的控制和增强应用程序的行为。在 Spring AOP 中,Advisor 是一个组合了通知(Advice)和切入点(Pointcut)的对象...

Global site tag (gtag.js) - Google Analytics