關(guān)于aop切面 注解、參數(shù)如何獲取
更新時(shí)間:2022年01月11日 09:38:53 作者:筏鏡
這篇文章主要介紹了關(guān)于aop切面 注解、參數(shù)如何獲取,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
aop切面 注解、參數(shù)如何獲取
在工作中會(huì)經(jīng)常使用aop,這里將aop使用基本方法,獲取在切點(diǎn)中使用的獲取參數(shù)、注解做一個(gè)樣例。
定義需要切面的注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AnnDemo {
? ? String value();
? ? boolean isAop() default true;
}在需要進(jìn)行切面的方法標(biāo)注注解
@RestController
@RequestMapping("/order")
public class OrderController {
? ? @Autowired
? ? private OrderService orderService;
? ? @RequestMapping("/all")
? ? @AnnDemo(value = "all",isAop = false)
? ? public List<TbOrder> findAll() {
? ? ? ? List<TbOrder> list = orderService.getOrderList();
? ? ? ? return list;
? ? }
? ? @RequestMapping("/page")
? ? @AnnDemo(value = "page")
? ? public List<TbOrder> findPage(@RequestParam("username") String username) {
? ? ? ? List<TbOrder> listPage = orderService.getOrdersListPage();
? ? ? ? return listPage;
? ? }
}定義切面
在切面中獲取切點(diǎn)注解,方法,參數(shù)的獲取
@Aspect
@Component
public class AspectDemo {
@Pointcut(value = "execution(* com.yin.freemakeradd.controller..*(..))")
public void excetionMethod() {}
@Pointcut(value = "execution(* com.yin.freemakeradd.controller..*(..)) && @annotation(AnnDemo)")
public void excetionNote() { }
@Before("excetionMethod()")
public void testBefore(JoinPoint joinPoint) {
System.out.println("----------------------------前置通知---");
Object[] args = joinPoint.getArgs();
for (Object arg : args) {
System.out.println(arg);
}
}
@Around(value = "execution(* com.yin.freemakeradd.controller..*(..)) && @annotation(AnnDemo)")
public Object testBeforeNote(ProceedingJoinPoint joinPoint) throws Throwable {
//用的最多通知的簽名
Signature signature = joinPoint.getSignature();
MethodSignature msg=(MethodSignature) signature;
Object target = joinPoint.getTarget();
//獲取注解標(biāo)注的方法
Method method = target.getClass().getMethod(msg.getName(), msg.getParameterTypes());
//通過方法獲取注解
AnnDemo annotation = method.getAnnotation(AnnDemo.class);
Object proceed;
//獲取參數(shù)
Object[] args = joinPoint.getArgs();
System.out.println(annotation.value());
System.out.println(annotation.isAop());
for (Object arg : args) {
System.out.println(arg);
}
if (Objects.isNull(annotation) || !annotation.isAop()) {
System.out.println("無需處理");
proceed = joinPoint.proceed();
}else {
System.out.println("進(jìn)入aop判斷");
proceed = joinPoint.proceed();
if(proceed instanceof List){
List proceedLst = (List) proceed;
if(!CollectionUtils.isEmpty(proceedLst)){
TbOrder tbOrder = new TbOrder();
tbOrder.setPaymentType("fffffffffffffffffff");
ArrayList<TbOrder> tbOrderLst = new ArrayList<>();
tbOrderLst.add(tbOrder);
return tbOrderLst;
}
}
System.out.println(proceed);
}
return proceed;
}
}
aop中獲取自定義注解的屬性值
自定義注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface SystemLog {
?
?? ?public String description() default "";
}用在方法上
@ResponseBody
@ValidRequestBody
@RequestMapping("/login")
@SystemLog(description="登錄")
public GlobalResponse login(@RequestBody @Valid User user, BindingResult bindingResult){
? ? ......
}獲取注解的屬性值
@Around("@annotation(com.xxx.xxx.xxx.SystemLog)")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable{
? ? SystemLog systemLog = ((MethodSignature)joinPoint.getSignature()).getMethod().getAnnotation(SystemLog.class); ? ?
? ? ......
}以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java 守護(hù)線程_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
Java語言機(jī)制是構(gòu)建在JVM的基礎(chǔ)之上的,意思是Java平臺(tái)把操作系統(tǒng)的底層給屏蔽起來,所以它可以在它自己的虛擬的平臺(tái)里面構(gòu)造出對(duì)自己有利的機(jī)制,而語言或者說平臺(tái)的設(shè)計(jì)者多多少少是收到Unix思想的影響,而守護(hù)線程機(jī)制又是對(duì)JVM這樣的平臺(tái)湊合,于是守護(hù)線程應(yīng)運(yùn)而生2017-05-05
java正則表達(dá)式匹配規(guī)則超詳細(xì)總結(jié)
正則表達(dá)式并不僅限于某一種語言,但是在每種語言中有細(xì)微的差別,下面這篇文章主要給大家介紹了關(guān)于java正則表達(dá)式匹配規(guī)則的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10
常用校驗(yàn)注解之@NotNull,@NotBlank,@NotEmpty的區(qū)別及說明
這篇文章主要介紹了常用校驗(yàn)注解之@NotNull,@NotBlank,@NotEmpty的區(qū)別及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01

