spring aop, aspectj 注解声明切面

关于Spring AOP注解报错:warning no match for this type name: *** [Xlint:invalidAbsoluteTypeName] ,今天找了好一会儿,结果发现时pointcut的表达式写错了,这里记录一下。

场景是需要给某些方法加上日志。

代码简化如下:

定义接口:

package ...

public interface Sample(){ 

    public void func1(Sting arg1, String arg2);

    public void func2(Sting arg1, String arg2);

} 

定义实现类: 

package ...

import ......

public class SampleImpl implements Sample(){

    @Override

    public void func1(String arg1, String arg2){

        System.out.println(arg1 + "--" + arg2);

    }

 

    @Override

    public void func2(String arg1, String arg2){

        System.out.println(arg1 + "==" + arg2);

    }

}

定义切片:

package ...

import ......

@Aspect

public class LogPointcut(){

    private Log log = LogFactory.getLog(this.getClass());

   

    // 前置通知

    @Before("execution(* XXX.XXX.Sample.func1(..))")

    public void logBefore(JoinPoint joinPoint){

        log.info("前置通知,方法" + joinPoint.getSinature().getName() + "() 即将被执行!");

    }

}

这里要注意一下,表达式“execution(* XXX.XXX.Sample.func1(..))”中,第一个星号表示的是匹配任意修饰符:private,protected,public。

如果这个类和Sample在同一个包,可以不用写全名,如果在不同的包,需要把包名都加上,否则就会找不到Sample。报本文第一行所说的异常。

如果要切所有的方法,只要把func1用“*”替换。

 

配置比较简单:

<beans xmlns="...."

    ...

    xmlns:aop="http://www.springframework.org/schema/aop"

    xsi:sehcmeLocation="......

        http://www.springframework.org/schema/aop

        http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

   

    <aop:aspectj-autoproxy />

    <bean id="sample" class=".....SampleImpl"/>

    <bean class=".....LogPointcut"/>

</beans>

最后在main方法中引用:

.....

    public static void main(String[] args) {

        ....

        Sample sample = (Sample) context.getBean("sample");

        sample.func1("test", "123");

    }

 

这样差不多算是完成了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值