基于注解的 AOP 开发


前言

通过学习前面的基于xml的AOP开发。了解到此方式减少代码量,下面是基于注解的 AOP 开发,虽然会发现感觉更麻烦了,但是变得更加独立


一、基于注解的 AOP 开发?

1.快速入门

基于注解的aop开发步骤:
① 创建目标接口和目标类(内部有切点)
② 创建切面类(内部有增强方法)
③ 将目标类和切面类的对象创建权交给 spring
④ 在切面类中使用注解配置织入关系
⑤ 在配置文件中开启组件扫描和 AOP 的自动代理
⑥ 测试

1.1 创建目标接口和目标类(内部有切点)
public interface TargetInterface {
    public void save();
}

@Component("target")
public class Target implements TargetInterface {
    public void save() {
        System.out.println("save running.........");
    }
}
1.2 创建切面类(内部有增强方法)

将目标类和切面类的对象创建权交给 spring
在切面类中使用注解配置织入关系

@Component("myAspect")
@Aspect   //标注当前MyAspect是一个切面类
public class MyAspect {

    //配置前置通知
    //Before("execution(* com.itheima.anno.*.*(..))\"")
    public void before(){
        System.out.println("前置增强.........");
    }

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

    //ProceedingJoinPoint:Proceeding  JoinPoint  正在执行的连接点==切点
    @Around("pointcut()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("环绕前增强.........");
        Object proceed = pjp.proceed();//切点方法
        System.out.println("环绕后增强.........");
        return proceed;
    }

    public void afterThrowing(){
        System.out.println("异常抛出增强.........");
    }
    @After("MyAspect.pointcut()")
    public void after(){
        System.out.println("最终增强.........");
    }

    //定义切点表达式
    @Pointcut("execution(* com.itheima.anno.*.*(..))")
    public void pointcut(){

    }

}
1.3 在配置文件中开启组件扫描和 AOP 的自动代理
<!--组件扫描-->
<context:component-scan base-package="com.itheima.aop"/>
<!--aop的自动代理-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

1.4 测试代码
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext-anno.xml")
public class AnnoTest {
    @Autowired
    private TargetInterface target;

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

}
1.4 测试结果

在这里插入图片描述

二、注解配置 AOP 详解

1.注解通知的类型

通知的配置语法:@通知注解(“切点表达式")

名称注解说明
前置通知@Before用于配置前置通知。指定增强的方法在切入点方法之前执行
后置通知@AfterReturning用于配置后置通知。指定增强的方法在切入点方法之后执行
环绕通知@Around用于配置环绕通知。指定增强的方法在切入点方法之前和之后都执行
异常抛出通知@AfterThrowing用于配置异常抛出通知。指定增强的方法在出现异常时执行
最终通知@After用于配置最终通知。无论增强方式执行是否有异常都会执行

2. 切点表达式的抽取

同 xml 配置 aop 一样,我们可以将切点表达式抽取。抽取方式是在切面内定义方法,在该方法上使用@Pointcut注解定义切点表达式,然后在在增强注解中进行引用。具体如下:

@@Component("myAspect")
@Aspect
public class MyAspect {
	@Before("MyAspect.myPoint()")
	public void before(){
		System.out.println("前置代码增强.....");
	}
	@Pointcut("execution(* com.itheima.aop.*.*(..))")
	public void myPoint(){
	
	}
}


总结

通过学习基于注解的 AOP 开发,会发现可能先开始觉得方便程度还不胜基于xml的 AOP 开发,但是现在咱们都是在学习,要将小知识点,运用到大知识点上,所以继续学习,加油卷。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

feiyunzhixia11

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

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

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

打赏作者

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

抵扣说明:

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

余额充值