Spring3.0中的AOP配置方法

Spring3.0中的AOP配置方法,第1张

第一种配置方法 使用@AspectJ标签

在配置文件中添加注解

创建一个Java文件 使用@Aspect注解修饰该类

创建一个方法 使用@Before @After @Around等进行修饰 在注解中写上切入点的表达式

说明 上述Java文件创建好后 需要将其在Spring的容器中进行声明 可以在配置文件中定义节点 也可以使用@Component组件进行修饰

示例

Java代码

import aspectj lang ProceedingJoinPoint

import aspectj lang annotation After

import aspectj lang annotation AfterThrowing

import aspectj lang annotation Around

import aspectj lang annotation Aspect

import aspectj lang annotation Before

import springframework stereotype Component

/**

* 基于注解的AOP日志示例

* @author ZYWANG

*/

@Component

@Aspect

public class AopLog {

//方法执行前调用

@Before( execution (* zywang services impl * *( )) )

public void before() {

System out println( before )

}

//方法执行后调用

@After( execution (* zywang services impl * *( )) )

public void after() {

System out println( after )

}

//方法执行的前后调用

@Around( execution (* zywang services impl * *( )) )

public Object around(ProceedingJoinPoint point) throws Throwable{

System out println( begin around )

Object object = point proceed()

System out println( end around )

return object

}

//方法运行出现异常时调用

@AfterThrowing(pointcut = execution (* zywang services impl * *( )) throwing = ex )

public void afterThrowing(Exception ex){

System out println( afterThrowing )

System out println(ex)

}

}

上面这段代码中多次使用了重复的切入点 这种情况下 可以使用@Pointcut标注 来修改一个切入点方法(这个方法不需要参数和方法体) 然后就可以在@Before等标注中引用该方法作为切入点 示例如下

Java代码

import aspectj lang ProceedingJoinPoint

import aspectj lang annotation Around

import aspectj lang annotation Aspect

import aspectj lang annotation Before

import aspectj lang annotation Pointcut

import springframework stereotype Component

/**

* 基于注解的AOP日志示例

* @author ZYWANG

*/

@Component

@Aspect

public class AopLog {

@Pointcut( execution (* iflysse school services impl * *( )) )

public void pointcut(){}

//方法执行前调用

@Before( pointcut() )

public void before() {

System out println( before )

}

//方法执行的前后调用

@Around( pointcut() )

public Object around(ProceedingJoinPoint point) throws Throwable{

System out println( begin around )

Object object = point proceed()

System out println( end around )

return object

}

}

第二种配置方法 基于配置文件的配置

创建一个Java文件 并指定一个用于执行拦截的方法 该方法可以有 个或多个参数

在Spring配置文件中注册该Java类为一个Bean

使用 等标签进行配置

示例

Java文件

Java代码

import aspectj lang ProceedingJoinPoint

/**

* 基于配置文件的AOP日志示例

* @author ZYWANG

*/

public class AopLog {

//方法执行的前后调用

public Object runOnAround(ProceedingJoinPoint point) throws Throwable{

System out println( begin around )

Object object = point proceed()

System out println( end around )

return object

}

}

Spring配置文件

Xml代码

注意 上面这个示例使用的是around方式的拦截 该方法要求Java类中的方法有一个ProceedingJoinPoint类型的参数

lishixinzhi/Article/program/Java/ky/201311/28907

1. 基于xml配置文件的代理配置方式

这种方式在2.0以后很少用了,原因是配置项过多,过于繁琐。但对于理解Spring AOP还是很有帮助的

1.1 定义通知

<bean id="advice" class="yourAdviceImpl" />

1.2 定义切点

要定义一个切点,可以选择使用正则表达式方式声明的切点或者AspectJ方式声明的切点。对正则表达式切点,使用Perl5RegexpMethodPointcut或JdkRegexpMethodPointcut(Java

1.4以上版本,不需要Jakarta ORO的支持了);对AspectJ切点,使用AspectJExpressPointcut

<bean id="pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut">

<property name="pattern" value="yourRegularExpression" />

</bean>

<bean id="pointcut" class="org.springframework.aop.aspectj.AspectJExpressionPointcut">

<property name="expression" value="yourAspectJExpression" />

</bean>

1.3 定义通知者

DefaultPointcutAdvisor是Spring提供的默认通知者,它需要提供通知和切点的引用。

Spring也提供了RegexpMethodPointcutAdvisor和AspectJExpressionPointcutAdvisor来对应两种声明切点的方式,不用再单独定义切点。

<bean id="advisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">

<property name="advice" ref="advice" />

<property name="pointcut" ref="pointcut" />

</bean>

<bean id="advisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">

<property name="advice" ref="advice" />

<property name="pattern" value="yourRegularExpression" />

</bean>

<bean id="advisor" class="org.springframework.aop.aspectj.AspectJExpressionPointcut">

<property name="advice" ref="advice" />

<property name="expression" value="yourAspectjExpression" />

</bean>

1.4 定义ProxyFactoryBean

<bean id="yourBean" class="org.springframework.aop.framework.ProxyFactoryBean>

<property name="target" ref="yourTargetBean" />

<property name="interceptorNames" value="advisor" />

<property name="proxyInterfaces" value="interfaceClass" />

</bean>

interceptorNames和proxyInterfaces都是数组属性,所以可以声明要使用的一个list,也可以让Spring自动把单个值转化为数组

上面明确定义了要对那个targetBean应用代理生成切面实例。如果不想限制targetBean,可以让Spring为所有匹配切点声明的bean生成切面实例,这样就不用一个个定义ProxyFactoryBean了,只需要定义

<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" />

这是一个BeanPostProcessor,所以Spring会自动识别并在bean的声明周期使用

2 利用2.0以后使用aop标签

<aop:config>

<aop:aspect ref="">

<aop:pointcut id="performance" expression="execution(* *.perform(..))" />

<aop:before method="" pointcut-ref="performance" />

<aop:before method="" pointcut="execution(* *.perform(..))" />

<aop:after-returning method="" pointcut="execution(* *.perform(..))" />

<aop:after-throwing method="" pointcut="execution(* *.perform(..))" />

</aop:aspect>

</aop:config>

3 利用Annotation

3.1 利用@Aspect将一个POJO类声明为一个切面。

3.2 定义切点

@Pointcut("execution(* *.perform(..))")

public void performance(){}

通过@Pointcut定义的切点的名字就是它所注解的方法的名字,因此例子中的切点名字是

performance()。这里声明的performance()方法实际圣只是一个标记,为@Pointcut提供附加的点,并不要求有实际意义。

3.3 定义通知

对要执行切面的方法,通过@Before("performance()"),@AfterReturning

("performance()")来定义通知。注意这里提供的切点名称,是performance(),而不是performance

如果对上面的两点不是很理解,也可以省略@Pointcut,而将AspectJ表达式直接定义在@Before等通知中,将上面的两步合为一步,如@Before("execution(* *.perform(..))")

3.4 通知Spring创建代理

<aop:aspectj-autoproxy>

这实际上相当于声明了一个AnnotationAwareAspectJAutoProxyCreator,从而根据@Pointcut声明的切点来自动代理匹配的bean实例

4 在Spring中结合进AspectJ

对于超出Spring AOP支持范围的,可以采用这种方式。只需要在Spring中配置AspectJ的Class实例时让Spring能够获得AspectJ类的实例就可以了,比如

<bean class="a_aspectj_class" factory-method="aspectOf">

<preperty ..../>

</bean>


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12062126.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存