spring aop 问题,不能进入切点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring aop 问题,不能进入切点相关的知识,希望对你有一定的参考价值。

在项目里添加spring的aop ,我想在 service层 的方法执行完后,在去执行添加日志的操作,启动tomcat 不报错,不过切点也不进入啊,下面附上代码,高手请指教。
serviceContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans default-autowire="byName" default-lazy-init="true">

<bean id="electronicBoardService"
class="com.service.impl.ElectronicBoardServiceImpl">
<property name="daoHelper_News">
<ref bean="daoHelper_News" />
</property>
</bean>

<bean id="runAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<!-- advice属性确定处理bean-->
<property name="advice">
<!-- 此处的处理bean定义采用嵌套bean,也可引用容器的另一个bean-->
<bean class="com.aop.MyAfter"/>
</property>
<!-- patterns确定正则表达式模式-->
<property name="patterns">
<list>
<!-- 确定正则表达式列表-->
<value>.*queryEbdquotation.*</value>
</list>
</property>
</bean>

<!-- 使用ProxyFactoryBean 产生代理对象-->
<bean id="ielectronicBoardService"
class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 代理对象所实现的接口-->
<property name="proxyInterfaces">
<value>
com.service.IElectronicBoardService
</value>
</property>
<!-- 设置目标对象-->
<property name="target">
<ref local="electronicBoardService" />
</property>

<!-- 代理对象所使用的拦截器-->
<property name="interceptorNames">
<list>
<value>runAdvisor</value>
</list>
</property>
</bean>
</beans>

public class MyAfter implements AfterReturningAdvice
// 实现AfterReturningAdvice接口必须实现afterReturning方法,该方法将在目标方法
// 调用结束后,自动被调用。
public void afterReturning(Object returnValue, Method m, Object[] args,
Object target) throws Throwable
System.out.println("方法调用结束...");
System.out.println("目标方法的返回值是 : " + returnValue);
System.out.println("目标方法是 : " + m);
System.out.println("目标方法的参数是 : " + args);
System.out.println("目标对象是 : " + target);



接口
public interface IElectronicBoardService
ElectronicBoardInfo queryEbdquotation();


启动服务不报错,就是不进切点,急急急

参考技术A <bean id="electronicBoardService"
class="com.service.impl.ElectronicBoardServiceImpl">
<!--加上这条试试-->

<aop:scoped-proxy proxy-target-class="false" />

<property name="daoHelper_News">
<ref bean="daoHelper_News" />
</property>
</bean>

Spring Aop切点

切点用于准确定位应该在什么地方应用切面的通知。通知和切点是切面的最基本的元素。在Spring AOP中要使用AspectJ的切点表达式来定义切点。下面我们列出Spring AOP所支持的AspectJ切点指示器。

 
技术分享图片
AOP原理图
AspectJ指示器描述
arg() 限定连接点匹配参数为指定类型的执行方法
@args() 限定连接点匹配参数由指定注解标注的执行方法
execution() 用于匹配连接点执行的方法
this() 限定连接点匹配AOP代理的类型bean引用为指定类型的类
target() 限定连接点匹配目标对象为指定类型的类
@target() 限定连接点匹配特定的执行对象,这些对象对应的类要有指定类型的注解
within() 限定匹配连接点指定的类型
@within() 限定匹配连接点指定注解所标注的类型(当使用Spring AOP时,方法定义在指定的注解所标注的类里)
@annotation 限定匹配带有特定注解的连接点

在Spring 中尝试使用AspectJ其他的的指示器,将会抛出IllegalArgumentException异常。我们看到在上面介绍的指示器中只有execution()是实际执行匹配的,而其他指示器都是限制匹配的。所以我们通常使用execution指示器匹配,然后通过其他指示器进行限制。

1.编写切点

为了阐述Spring中的切面,我们要限定一个切点:

public interface Performance {
    
    public void perform();
}

下面我们定义一个表达式,设置当perform()执行时触发通知的调用:

 
技术分享图片
匹配表达式
execution(* concert.Perfirmance.perform(..))

第一个*代表匹配所有类型的返回值,中间的类名.方法名指定匹配的类的特定方法,()中的 .. 表示匹配所有的参数列表。
我们好可以在ececution中使用其他的匹配器,用来过滤匹配的方法:

execution(* concert.Perfirmance.perform(..) && within(concer.*))

上面的表达式表示匹配concert.Perfirmance的perform方法,并且该方法在concer包中。里面的&&表示与的意思,除此之外还有 || 表示或, ! 表示非。但是 & 在Xml中有特殊的含义,这时我们也可以使用 and 代替 && ,用 or 代替 || ,用 not 代替 !。

2.在切点中选择bean

处理上面;列出的指示器外,Spring还支持一种新的指示器bean(),它允许我们在切点中使用bean的ID来标示bean:

execution(* concert.Perfirmance.perform(..)  and bean(‘woodstock‘))

在这里我们限定了bean的ID为 woodstock,其实bean()指示器更多的使用场景是 除去特定ID的bean应用通知:

execution(* concert.Perfirmance.perform(..)  and !bean(‘woodstock‘))


作者:郭之源
链接:https://www.jianshu.com/p/0dc2eea8e59e
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。






以上是关于spring aop 问题,不能进入切点的主要内容,如果未能解决你的问题,请参考以下文章

spring的aop怎么获取切点参数

框架[Spring]AOP拦截-使用切点:AspectJExpressionPointcut-切点语言

spring 中aop 切面实践

Spring Aop中四个重要概念,切点,切面,连接点,通知

Spring之AOP的切点通知切点表达式以及知识要点

Spring AOP 切点(pointcut)表达式