AOP development-enhance the methods in the class without modifying the source code: before and after surround exception || How to get the parameters and return value of the target method

AOP development

@Transactionl

Enhance the methods in the class without modifying the source code

Preposition

Rear

surround

abnormal



Introduce a op package before creating a project

<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();
    }

}


 




How to get the parameters and return value of the target method

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;
        }
    }
}

 

Published 529 original articles · praised 115 · 90,000 views

Guess you like

Origin blog.csdn.net/qq_39368007/article/details/105616934