Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Spring Boot AOP中,如何在方法中获取类注释;大约;时期_Java_Spring_Spring Boot_Spring Aop_Java Annotations - Fatal编程技术网

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)中的参数相同{
。我们可以得到变量。我按顺序更新了答案