在运行时获取方面的实例
Get instance of aspect at runtime
我是 运行 一个使用基于注释的方面来收集统计信息的命令行应用程序。
是否可以检索方面实例以获取统计信息?或者唯一可能的方法是将统计数据保存为 static
变量并在需要的时候获取它?
@Aspect
public class StatisticsAspect {
private static final Logger LOGGER = Logger.getLogger(StatisticsAspect.class);
private final Statistics statistics;
public StatisticsAspect() {
statistics = new Statistics();
}
// Some code...
}
AspectJ 方面默认是单例,即使用静态变量(如果存储 thread-related 信息,则可能是静态 ThreadLocal
)并且可能提供一个很好的静态 getter 方法是一个不错的选择。还有其他实例化模型,但对于它们,您需要以不同的方式声明方面,例如 @Aspect("perthis(execution(* ajia.Account.*(..)))")
。总而言之,实例化类型有perthis()
、pertarget()
、percflow()
、percflowbelow()
和pertypewithin()
。如果您的统计数据确实是全球性的,那么您的情况无需担心。
作为替代方案,您也可以将统计信息保存在一个实例变量中,但如果它像您的情况一样是私有的,您还需要为其提供一个 getter 方法,例如 public Statistics getStatistics()
.在那种情况下,如果您想访问 AspectJ-managed 单例方面实例,您应该使用 Aspects.aspectOf(StatisticsAspect.class)
,另请参阅 AspectJ manual。然后您将像这样访问数据:
Aspects.aspectOf(StatisticsAspect.class).getStatistics();
我是 运行 一个使用基于注释的方面来收集统计信息的命令行应用程序。
是否可以检索方面实例以获取统计信息?或者唯一可能的方法是将统计数据保存为 static
变量并在需要的时候获取它?
@Aspect
public class StatisticsAspect {
private static final Logger LOGGER = Logger.getLogger(StatisticsAspect.class);
private final Statistics statistics;
public StatisticsAspect() {
statistics = new Statistics();
}
// Some code...
}
AspectJ 方面默认是单例,即使用静态变量(如果存储 thread-related 信息,则可能是静态 ThreadLocal
)并且可能提供一个很好的静态 getter 方法是一个不错的选择。还有其他实例化模型,但对于它们,您需要以不同的方式声明方面,例如 @Aspect("perthis(execution(* ajia.Account.*(..)))")
。总而言之,实例化类型有perthis()
、pertarget()
、percflow()
、percflowbelow()
和pertypewithin()
。如果您的统计数据确实是全球性的,那么您的情况无需担心。
作为替代方案,您也可以将统计信息保存在一个实例变量中,但如果它像您的情况一样是私有的,您还需要为其提供一个 getter 方法,例如 public Statistics getStatistics()
.在那种情况下,如果您想访问 AspectJ-managed 单例方面实例,您应该使用 Aspects.aspectOf(StatisticsAspect.class)
,另请参阅 AspectJ manual。然后您将像这样访问数据:
Aspects.aspectOf(StatisticsAspect.class).getStatistics();