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