spring应用手册-AOP(注解)-(15)-@Pointcut的表达式-@within

戴着假发的程序员出品 抖音ID:戴着假发的程序员 欢迎关注

@Pointcut的表达式-@within

spring应用手册(第三部分)


限制匹配到具有给定 annotation 的类型中的连接点(使用 Spring AOP 时执行在具有给定 annotation 的类型中声明的方法)。

官方给出的案例:

任何连接点(仅在 Spring AOP 中执行方法),其中目标 object 的声明类型具有@Transactionalannotation:

@within(org.springframework.transaction.annotation.Transactional)

关于@within注解我们这里只做一个说明,因为@within和@target只有一点不同,其他都一样。

我们知道@target只对指定的当前类生效,也就是说指定的注解配置在当前类上才生效,其他的情况:配置再其接口,方法都不生效,并且子类中的任何方法也不会生效。

@within和@target的区别在于@within会对子类继承的方法生效,但是子类的其他方法或者子类重写了父类的方法就不会在生效。

看看这样的例子:

我们BooService类,BookService上有指定的注解,有两个方法。

/**
 * @author 戴着假发的程序员
 * 
 * @description
 */
@Component
@DkAnnotation
public class BookService{
    public void saveBook(String title){
        System.out.println("保存图书:"+title);
    }
    public void saveBook(String title,int count){
        System.out.println("保存"+title+","+count+"次");
    }
}

添加一个子类SubBookService,重写父类的其中一个方法,并且添加一个自己的方法:

注意子类不添加指定的注解

/**
 * @author 戴着假发的程序员
 * 
 * @description
 */
@Component
public class SubBookService extends BookService {
    @Override
    public void saveBook(String title){
        System.out.println("子类重写的方法-saveBook-保存图书:"+title);
    }
    public void subSaveBook(String title){
        System.out.println("子类自己的方法-subSaveBook-保存图书:"+title);
    }
}

修改Aspect类,修改配置:

/**
 * @author 戴着假发的程序员
 * 
 * @description
 */
@Component //将当前bean交给spring管理
@Aspect //定义为一个AspectBean
public class DkAspect {
    //使用@within配置匹配所有还有指定注解的方法
    @Pointcut("@within(com.st.dk.demo7.annotations.DkAnnotation)")
    private void pointCut1(){}
    //定义一个前置通知
    @Before("pointCut1()")
    private static void befor(){
        System.out.println("---前置通知---");
    }
}

测试:

@Test
public void testAopPoint_within(){
    ApplicationContext ac =
            new AnnotationConfigApplicationContext(Appconfig.class);
    SubBookService bean = ac.getBean(SubBookService.class);
    bean.saveBook("程序员的修养");
    bean.saveBook("假发的穿戴技巧",10);
    bean.subSaveBook("颈椎康复之路");
}

在这里插入图片描述
我们会发现只有继承自父类的方法被匹配增强了,其他的重写和自己定义的方法都没有匹配。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

戴着假发的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值