当前位置: 首页 > 知识库问答 >
问题:

AspectJ方面是单例吗?

冯阳华
2023-03-14
@Aspect
public class CountAspect {

    private Map<String, Integer> counter = new HashMap<>(); 

    @Before("execution(* *.*(..))")
    public void countMethodCalls(JoinPoint jp) {
        String methodName = jp.getSignature().getName();
        counter.merge(methodName, 1, Integer::sum);
        System.out.println(counter);
    }
}

当测试这方面时,所有的工作都是预期的。多次调用方法ABC时,输出为

{main=1}
{a=1, main=1}
{a=1, b=1, main=1}
{a=1, b=1, c=1, main=1}
{a=2, b=1, c=1, main=1}
{a=3, b=1, c=1, main=1}

这个结果靠谱吗?或者我的例子只是因为我这里有一个相当简单的例子才起作用?

在更复杂的场景中,是否会出现AspectJ运行时会创建CountAspect的第二个实例,从而在此之前丢失在Count映射中收集的数据?

共有1个答案

齐胜涝
2023-03-14

AspectJ知道多个实例化模型,其中一个(默认)是Singleton。您可以在AspectJ手册中找到更多信息。在这里,您将看到以下安装模型:

  • perthis:每个匹配切入点的每个调用方实例都有一个方面实例
  • pertarget:每个匹配切入点的每个被调用方实例的一个方面实例
  • PercFlow:每次进入某个控制流时一个方面实例
  • PercFlowBelow:每次进入被拦截的控制流下面的某个控制流的一个方面实例(被拦截的方法调用的所有内容)

这里还描述了一个实例化模型:

    null
 类似资料:
  • 我正在尝试为一个大型Spring Boot项目上的私有方法启用方面编织。我已经有一些以公共方法为目标的方面工作得很好,但我的研究使我想到Spring AOP方面只能与公共方法交互。 我遵循了评论中的建议,现在在启动时有以下例外情况: 我需要同时添加aspectjweaver和spring-instrument java代理吗?

  • 问题内容: 读一本书说servlet从容器方面是单例的。这是真的? 但是,即使是单例,我们也需要处理数据同步等 问题答案: 不能。您可以在同一Web容器中,甚至在同一Web应用程序中,在不同的Servlet名称和URL下多次实例化同一Servlet类。

  • 我有什么 我为一些特定方法设置了AspectJ连接点,以便能够测量它们的执行时间。我从不拦截代码流中的任何内容(因此我们可以称之为“只读”类型的编织代码)。相应的代码如下所示: 此外,在应用程序代码本身中,我有如下内容: 这意味着我会优雅地处理该层中任何可能的异常,并禁止将其抛出到上层。 出了什么问题 如果应用程序代码没有抛出异常,那么就没有问题,所有逻辑都正常工作——时间被测量、记录和跟踪。但是

  • 问题内容: 根据Spring的使用Spring IoC配置AspectJ方面 的文档,以便为Spring IOC配置方面,必须在xml配置中添加以下内容: 正如@SotiriosDelimanolis所建议的那样,应在JavaConfig中将其重写为以下内容: 但是,这仅在以本机AspectJ 语法编写方面时才起作用。如果它是用Java编写并带有注释的,则会收到以下错误消息: 未为Profiler

  • 本文向大家介绍PHP单例模式是什么 php实现单例模式的方法,包括了PHP单例模式是什么 php实现单例模式的方法的使用技巧和注意事项,需要的朋友参考一下 一、什么是单例模式? 1、含义       作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局地提供这个实例。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。 2、单例模式的三个要点: (1).

  • 我使用的是aspectj的weaving而不是SpringAOP,因此我的aspectj maven插件如下所示: 我还有另一个方面看起来是这样的: 我需要的是把上面的(集成方面)放在任何其他方面(包括Spring的安全方面)之前,正如您所看到的,我用尝试过(我也用在.aj文件中尝试过),不幸的是,没有成功。