Java 在Spring Boot AOP中,如何在方法中获取类注释;大约;时期
谢谢这里所有的朋友。我知道如何获取Java 在Spring Boot AOP中,如何在方法中获取类注释;大约;时期,java,spring,spring-boot,spring-aop,java-annotations,Java,Spring,Spring Boot,Spring Aop,Java Annotations,谢谢这里所有的朋友。我知道如何获取方法上注释集的注释参数 而我想在类级别添加注释。如何从AOP Around方法中的类中检索属性 顺便提一下,我还有另一个问题,为什么我需要将响应值从void更改为Object,并返回pjp.continue()。如果该方法没有响应,则请求将被冻结 对于具有角色注释的方法 @Around("@annotation(com.example.demo.aspect.annotation.HasRole) && @annotation(anno
方法
上注释集的注释参数
而我想在类
级别添加注释。如何从AOP Around方法中的类
中检索属性
顺便提一下,我还有另一个问题,为什么我需要将响应值从void
更改为Object
,并返回pjp.continue()
。如果该方法没有响应,则请求将被冻结
对于具有角色注释的方法
@Around("@annotation(com.example.demo.aspect.annotation.HasRole) && @annotation(annotation)")
public void aroundHasRole(ProceedingJoinPoint pjp, HasRole annotation) throws Throwable {
log.info("value->>{}", annotation.value());
pjp.proceed();
}
@Around("(@within(com.example.demo.aspect.annotation.IsAdmin)"
+ "|| @annotation(com.example.demo.aspect.annotation.IsAdmin))")
public Object aroundHasRole(ProceedingJoinPoint pjp) throws Throwable {
<<How to get annotation information here?>>
return pjp.proceed();
}
用于具有角色注释的类或方法
@Around("@annotation(com.example.demo.aspect.annotation.HasRole) && @annotation(annotation)")
public void aroundHasRole(ProceedingJoinPoint pjp, HasRole annotation) throws Throwable {
log.info("value->>{}", annotation.value());
pjp.proceed();
}
@Around("(@within(com.example.demo.aspect.annotation.IsAdmin)"
+ "|| @annotation(com.example.demo.aspect.annotation.IsAdmin))")
public Object aroundHasRole(ProceedingJoinPoint pjp) throws Throwable {
<<How to get annotation information here?>>
return pjp.proceed();
}
周围((@in(com.example.demo.aspect.annotation.IsAdmin)中)
+“||@annotation(com.example.demo.aspect.annotation.IsAdmin)))
HasRole周围的公共对象(ProceedingJoinPoint pjp)抛出可丢弃的{
返回pjp.procedure();
}
通过反射获取类,通过类获取固定的方法信息,并获取方法上的注释。通过这种方式,您应该能够反映,正如您可能已经注意到的那样,您不能将来自不同
|
分支的信息绑定到advice方法参数,因为它可能不明确,请参见我的答案和。因此,如果您想避免丑陋(且缓慢)的反射,请按照我在其他答案中的建议,编写两个不同的建议,如果您关心的是避免代码重复,请将常见代码分解为辅助方法。类似这样的内容(未经测试,只是为了让您了解代码结构):
周围(“@内(注释)”)
公共对象classIsAdmin(ProceedingJoinPoint pjp,IsAdmin注释)抛出可丢弃的{
返回commonIsAdmin(pjp,注释);
}
@周围(“@annotation(annotation)”)
公共对象方法IsAdmin(ProceedingJoinPoint pjp,IsAdmin注释)抛出可丢弃的{
返回commonIsAdmin(pjp,注释);
}
公共对象commonIsAdmin(ProceedingJoinPoint pjp,IsAdmin注释)抛出可丢弃的{
//在这里,您可以放置所有常见的建议代码。
//非通用代码可以保留在原始通知方法中。
log.info(“value->>{}”,annotation.value());
返回pjp.procedure();
}
为什么我需要将响应值从
void
更改为Object
并返回pjp.continue()
。如果该方法没有响应,则请求将被冻结
与@Before
或@After
建议不同,在@Around
建议中,您可以通过不调用继续()
完全跳过目标方法执行,或者放弃或修改继续()
的结果来修改返回值。您可以完全自由地返回想要返回的内容,只需匹配目标方法的返回类型即可
话虽如此,但应该清楚的是,一个around advice方法也必须有一个与其截获的目标方法相匹配的返回类型。如果您的建议针对的是多种类型,而没有通用的超级类型,则它可以是一个精确的类型,如MyType
,一个超级类型,也可以是简单的Object
(所有类型的超级类型)。如果(且仅当)所有目标方法也返回void
(否则,即使切入点匹配,通知也不会匹配这些方法),则通知的返回类型也可以是void
因此,如果一个around通知匹配是由切入点本身和返回类型的组合决定的。您可以使用它作为一种工具,通过定义特定的返回类型来限制切入点匹配(然后需要将返回值转换为继续()
,因为继续()
始终返回对象
)
顺便说一句,如果目标方法返回一个基本类型,如int
,boolean
等,那么通知将自动将结果包装为整数
或boolean
您真的应该阅读SpringAOP和AspectJ手册或教程,因为我在这里解释可以在那里找到的东西
更新:OP要求提供有关参数绑定的文档,并说明如何确定名称:
- 您可以为所有通知类型指定
参数,例如argNames
,@Before
,@Before
,@After
@Around
- 若注释参数不存在,SpringAOP将尝试通过类文件调试信息(若在中编译)匹配通知方法参数名称。否则,在这种情况下匹配将失败
- 当使用编译时编织的完整AspectJ而不是Spring AOP时,确定名称也可以在没有调试信息的情况下工作,因为AspectJ编译器可以在编译期间确定必要的信息
所有这些都在中描述。您的问题不清楚,正如您所说,您提出了两个问题。请澄清并专注于你到底在寻找什么。对此感到抱歉。但问题在于相同的
方法
。我认为它们都是相关的。所以我在同一个帖子里问他们。但不管怎样,谢谢你的提醒@GiorgiTsiklauriOP对来自Around建议的回报有疑问。如果你能涵盖这一点,答案将是完整的。谢谢你的帮助!当通知中的参数名称与方法参数相同时,是否有任何手动显示将自动绑定?我只是在论坛上找到的。你说的“自动绑定”是什么意思?请给出一个示例或只是链接到找到您所问内容的位置。我的意思是“自动绑定”是指@Around(“@annotation(nameBinding)”)
中的变量“nameBinding”与方法公共对象methodIsAdmin(ProceedingJoinPoint pjp,IsAdmin nameBinding)中的参数相同{
。我们可以得到变量。我按顺序更新了答案