基于注解的 AOP 开发

举报
兮动人 发表于 2022/04/29 13:52:28 2022/04/29
【摘要】 1. 快速入门 2. 注解配置 AOP 详解 2.1 注解通知的类型 2.2 切点表达式的抽取 3. 知识要点 1. 快速入门基于注解的aop开发步骤:创建目标接口和目标类(内部有切点),将目标类的对象创建权交给 springpublic interface TargetInterface { public void save();}@Component("target")publi...

1. 快速入门

  • 基于注解的aop开发步骤:
  1. 创建目标接口和目标类(内部有切点),将目标类的对象创建权交给 spring
public interface TargetInterface {

    public void save();

}
@Component("target")
public class Target implements TargetInterface {
    @Override
    public void save() {
        System.out.println("save running...");
    }
}
  1. 创建切面类(内部有增强方法),将切面类的对象创建权交给 spring,在切面类中使用注解配置织入关系
@Component("myAspect")
@Aspect //标注当前myAspect是一个切面类
public class MyAspect {
    //配置前置增强
    @Before("execution(* com.xdr630.anno.*.*(..))")
    public void before() {
        System.out.println("前置增强...");
    }


    public void afterReturning() {
        System.out.println("后置增强...");
    }

    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("环绕前增强...");
        Object proceed = pjp.proceed();
        System.out.println("环绕后增强...");
        return proceed;
    }

    public void after() {
        System.out.println("最终增强...");
    }
}
  1. 在配置文件中开启组件扫描和 AOP 的自动代理
<?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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
                        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
">


    <!--开启组件扫描-->
    <context:component-scan base-package="com.xdr630.anno"/>

    <!--aop自动代理-->
    <aop:aspectj-autoproxy/>
</beans>
  1. 测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext-anno.xml")
public class AnnoTest {
    @Autowired
    private TargetInterface target;

    @Test
    public void test1() {
        target.save();
    }
}

在这里插入图片描述

2. 注解配置 AOP 详解

2.1 注解通知的类型

  • 通知的配置语法:@通知注解(“切点表达式")
    在这里插入图片描述

2.2 切点表达式的抽取

  • 同 xml 配置 aop 一样,可以将切点表达式抽取。抽取方式是在切面内定义方法,在该方法上使用@Pointcut注解定义切点表达式,然后在在增强注解中进行引用。具体如下:
@Component("myAspect")
@Aspect //标注当前myAspect是一个切面类
public class MyAspect {
    //可以直接引用
    @Before("myPoint()")
    public void before() {
        System.out.println("前置增强...");
    }
	//也可以使用 类名.方法() 的形式
    @AfterReturning("MyAspect.myPoint()")
    public void afterReturning() {
        System.out.println("后置增强...");
    }

    @Around("myPoint()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("环绕前增强...");
        Object proceed = pjp.proceed();
        System.out.println("环绕后增强...");
        return proceed;
    }

    @After("myPoint()")
    public void after() {
        System.out.println("最终增强...");
    }
	
	//定义的切点方法
    @Pointcut("execution(* com.xdr630.anno.*.*(..))")
    public void myPoint() {

    }
}

在这里插入图片描述

3. 知识要点

  • 注解aop开发步骤
  1. 使用@Aspect标注切面类
  2. 使用@通知注解标注通知方法
  3. 在配置文件中配置aop自动代理<aop:aspectj-autoproxy/>
  • 通知注解类型
    在这里插入图片描述
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。