java Spring AOP this()PCD上下文绑定器不能与方面示例化模型perthis()一起工作

new9mtju  于 2023-02-20  发布在  Java
关注(0)|答案(1)|浏览(120)

我试图记录哪个方面示例负责哪个代理对象,然而,当我通过这个()PCD收集代理对象上下文,并使用perthis()示例化模型时,我得到了一个与我在切入点表达式中使用的代理对象变量名相关的错误:

warning no match for this type name: bean [Xlint:invalidAbsoluteTypeName]

我使用的Maven依赖项:

<properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>6.0.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>6.0.3</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.19</version>
        </dependency>
</dependencies>

这是我用来实现所需功能的一个方面:

@Aspect("perthis(com.sj.aspects.AssociationsAspect.exampleBeans())")
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class AssociationsAspect {
    public AssociationsAspect(){
        System.out.println("Creating aspect instance!");
    }

    @Pointcut("execution(* com.sj.utilities.Example.*(..))")
    public void exampleBeans(){};

    @Pointcut("execution(* com.sj.utilities.Example.*(..)) && this(bean)")
    public void exampleOperations(Object bean){};

    @Before(value = "exampleOperations(bean)", argNames = "jp,bean")
    public void beforeExampleMethodsExecution(JoinPoint jp, Object bean){
        System.out.println(
                "JoinPoint: " + jp.getStaticPart() +
                        "\n\taspect: " + this +
                        "\n\tobject: " + bean
        );
    }
}

我尝试将 bean 作为变量名更改为具体类型,但从文档来看,它将给予与绑定结果不同的结果:
代理实现AccountService接口的任何连接点(仅在Spring AOP中执行方法):

this(com.xyz.service.AccountService)

同时,它会将现有错误更改为另一个错误:

error at ::0 formal unbound in pointcut

有趣的是,如果你把("perthis(com.sj.aspects.AssociationsAspect.exampleBeans())")放在一边,那么一切都会很好地工作,Spring容器会为其中的每个代理对象创建一个单独的方面示例。然而,这并不可取,很可能是一个bug,因为通过@Scope()注解,我只说同一个方面可以有多个示例,Spring容器需要在我告诉它的时候创建新的示例。但并不意味着它需要在需要时创建它们。
最后一个解决方案是使用JoinPoint反射API,而不是通过 this() PCD收集上下文。它工作得很好,但是我对 @Scope() 在没有 perthis() 示例化模型和有 perthis() 示例化模型的情况下如何工作有一些先入为主的看法。
最后,我想知道,'有没有一个解决方案可以同时使用 this() PCD和 perthis() 示例化模型来收集代理对象上下文?'以及我之前描述的方面中有哪些错误会给予这样的错误。

uubf1zoe

uubf1zoe1#

我假设你从Spring手册的这一部分中得到了perthis()的语法示例。不幸的是,语法是错误的。在perthis()中,你需要指定一个有效的切入点,比如,而不仅仅是一个没有返回类型的方法名。有效子句的示例如下:

  • perthis(myPointcut()),如果将myPointcut指定为单独的命名切入点
  • perthis(this(org.acme.MyClass))
  • perthis(execution(* doCommand(..))
  • perthis(execution(* doCommand(..)) && this(org.acme.MyClass))

也可以参见AspectJ文档here和那里,不幸的是,文档很少。
在您的特定情况下,您可能需要:

perthis(execution(* com.sj.utilities.Example.*(..)))

**更新:**我创建Spring pull request # 29998是为了改进文档。

相关问题