1、自定義註解
@Retention(RetentionPolicy.RUNTIME)
@Target(value=ElementType.METHOD)
public @interface AdviceAnnotation {
String name();
}
2、service層
public interface AdviceService {
void study(String name) throws Exception;
}
3、實現類
@Service
public class AdviceServiceImpl implements AdviceService {
@AdviceAnnotation(name = "我是註解name!!!")
public void study(String name) throws Exception {
System.out.println("好好學習,天天向上");
throw new Exception("my god!!");
}
}
4、切面
@Aspect // 切面註解
@Component
public class StudyAdvice {
@Before(value = "execution(* com.teng.advice.service.impl.AdviceServiceImpl.study(..))"
+ "&& args(name)",argNames="name")
private void studyBefore(String name){
System.out.println(String.format("獲取到的參數:%s", name)); // 獲取切入方法上的參數
System.out.println("學習之前先打局遊戲!");
}
@After(value="@annotation(com.teng.advice.annotation.AdviceAnnotation) &&"
+ "execution(* com.teng.advice..*.*(..))")
private void studyAfter(AdviceAnnotation ad){
System.out.println("學累了再打局遊戲!");
}
@Around("execution(* com.teng.advice..*.*(..)) && @annotation(ad)")
private Object studyAround(ProceedingJoinPoint pjp,AdviceAnnotation ad) throws Throwable{ // 環繞通知需要有返回值
System.out.println("前置通知:還是打遊戲");
System.out.println(String.format("註解name:%s", ad.name())); // 獲取切入方法上的註解
Object result = pjp.proceed();
System.out.println("後置通知:依舊打遊戲");
return result;
}
@AfterThrowing(pointcut="execution(* com.teng.advice..*.*(..))",throwing="ex")
private void studyThrow(Throwable ex){
System.out.println(ex.getMessage());
}
// @AfterReturning(returning="rvt" ,pointcut="execution(* com.teng.advice..*.*(..))")
// public void test(Object rvt){
// System.out.println("獲取目標方法返回值:" + rvt);
// }
}
5、運行
@SpringBootApplication
public class BootTestApplication
{
public static void main( String[] args )
{
SpringApplication.run(BootTestApplication.class, args);
}
@Autowired
private AdviceService adviceService;
@PostConstruct
public void init() throws Exception{
adviceService.study("小耿");
}
}
6、打印結果
前置通知:還是打遊戲
註解name:我是註解name!!!
獲取到的參數:小耿
學習之前先打局遊戲!
好好學習,天天向上
學累了再打局遊戲!
my god!!