Spring之AOP注解方式ApsectJ开发

1.引入Jar包

2.引入配置文件

3.编写切面类配置

4.使用注解的AOP对象目标类进行增强

5.在配置文件中开启以注解形式进行AOP开发

<!-- AOP开启注解 -->
<aop:aspectj-autoproxy/>

6.在切面类上添加注解

<?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"
       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">

    <!-- AOP开启注解 -->
    <aop:aspectj-autoproxy/>
    <bean id="goodsDao" class="pers.liuchengyin.demo1.GoodsDaoImpl"></bean>
    <bean id="goodsaspect" class="pers.liuchengyin.demo1.GoodsDaoAspect"></bean>
</beans>
@Aspect
public class GoodsDaoAspect {
    @Before(value = "execution(* pers.liuchengyin.demo1.GoodsDaoImpl.save(..))")
    public void log(){
        System.out.println("日志");
    }
}	

 

注解AOP通知类型

@Before前置通知

@AfterReturning后置通知

1.没有返回值

2.有返回值

@AfterReturning(value = "execution(* pers.liuchengyin.demo1.GoodsDaoImpl.update(..))",returning = "res")
public void afterreturning(Object res){
    System.out.println(res);
}		

@Around环绕通知

@Around(value = "execution(* pers.liuchengyin.demo1.GoodsDaoImpl.delete(..))")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
    System.out.println("之前");
    Object proceed = joinPoint.proceed();
    System.out.println("之后");
    return proceed;
}

@AfterThrowing异常抛出通知

1.没有获取异常信息

2.获取异常信息

@AfterThrowing(value = "execution(* pers.liuchengyin.demo1.GoodsDaoImpl.find(..))",throwing = "ex")
public void afterThrowing(Throwable ex){
    System.out.println("异常抛出:" + ex);
}				

 @After最终通知

@After(value = "execution(* pers.liuchengyin.demo1.GoodsDaoImpl.find(..))")
public void after(){
    System.out.println("最终通知");
}	

 

AOP的注解切入点的配置

有时候一个方法要添加前置通知对又要添加异常通知,又要添加最终通知。可以在切面当中定义好切入点,在通知当中直接使用定义好的切入点表达式。

@AfterThrowing(value = "GoodsDaoAspect.pointcut()",throwing = "ex")
public void afterThrowing(Throwable ex){
    System.out.println("异常抛出:" + ex);
}

@After(value = "GoodsDaoAspect.pointcut()")
public void after(){
    System.out.println("最终通知");
}

@Pointcut(value = "execution(* pers.liuchengyin.demo1.GoodsDaoImpl.find(..))")
public void pointcut(){

}

 定义多个切入点

一个通知同时定义到多个方法当中

@Pointcut(value = "execution(* pers.liuchengyin.demo1.GoodsDaoImpl.find(..)) || execution(* pers.liuchengyin.demo1.GoodsDaoImpl.delete(..))")
public void pointcut(){
    System.out.println("多个");
}

 

当使用接口时与不使用接口内部代理区别

使用接口 - 内部采用的是Jdk的代理

不使用接口 - 内部才用的是cglib的代理

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值