AOP开发——在不修改源代码的前提下,对类里面的方法进行增强 : 前置 后置 环绕 异常||如何得到目标方法的参数和返回值

AOP开发

@Transactionl

在不修改源代码的前提下,对类里面的方法进行增强

前置

后置

环绕

异常



创建项目前引入aop的包

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency





Man.java

package com.sxt.domain;

import org.springframework.stereotype.Component;

@Component
public class Man {
    
    public void eat(){
        System.out.println("人吃饭");
//        int a=10/0;
    }
}

ManAspect.java

package com.sxt.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;

@Aspect
@Component
@EnableAspectJAutoProxy  //这个可以不加
public class ManAspect {

    //声明切面
    public static final String POINTCUT1="execution(* com.sxt.domain.Man.eat(..))";

    @Before(POINTCUT1)
    public void before(){
        System.out.println("饭前喝汤");
    }
    @After(POINTCUT1)
    public void after(){
        System.out.println("搞一根");
    }

   // @Around(POINTCUT1)
    public  void around(ProceedingJoinPoint pjp) throws Throwable {
        before();
        pjp.proceed();
        after();
    }

    @AfterThrowing(value = POINTCUT1,throwing = "tw")
    public void exp(Throwable tw){
        System.out.println("出现异常:"+tw.getMessage());
    }

}

ApplicationTests.java

package com.sxt;

import com.sxt.domain.Man;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class ApplicationTests {

    @Autowired
    private Man man;

    @Test
    void contextLoads() {
        man.eat();
    }

}


 




如何得到目标方法的参数和返回值

Man.java

package com.sxt.domain;

import org.springframework.stereotype.Component;

@Component
public class Man {

    public void eat(){
        System.out.println("人吃饭");
//        int a=10/0;
    }

    public String sleep(String arg){
        System.out.println("睡觉");
        return "sleep";
    }
}

ManAspect2.java

package com.sxt.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;

@Aspect
@Component
@EnableAspectJAutoProxy  //这个可以不加
public class ManAspect2 {

    //声明切面
    public static final String POINTCUT1="execution(* com.sxt.domain.Man.sleep(..))";

    //@Before(POINTCUT1)
    public void before(){
        System.out.println("喝汤");
    }
    //@After(POINTCUT1)
    public void after(){
        System.out.println("搞一根");
    }

    @Around(POINTCUT1)
    public  Object around(ProceedingJoinPoint pjp) throws Throwable {

        Object[] args = pjp.getArgs();
        Object arg = args[0];
        System.out.println(arg);
        before();
        Object proceed = pjp.proceed();//执行目标方法
        after();
        return proceed;
    }
}

ApplicationTests.java

package com.sxt;

import com.sxt.domain.Man;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class ApplicationTests {

    @Autowired
    private Man man;

    @Test
    void contextLoads() {
        String s1= man.sleep("dym");
        System.out.println(s1);
    }

}



CacheAspect.java

package com.sxt.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;

@Aspect
@Component
@EnableAspectJAutoProxy  //这个可以不加
public class CacheAspect {

    //声明切面
    public static final String POINTCUT1="execution(* com.sxt.service.impl.UserServiceImpl.getOne(..))";

    @Around(POINTCUT1)
    public  Object cache(ProceedingJoinPoint pjp) throws Throwable {

        Object[] args = pjp.getArgs();
        String id = (String) args[0];
        System.out.println(id);
        //使用id从缓存里面查询数据
        Object cacheObj = null;
        if (cacheObj == null) {
            Object proceed = pjp.proceed();//执行目标方法
            //放入缓存

            //返回
            return proceed;
        } else {
            return cacheObj;
        }
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值