问题标签 [pointcut]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
212 浏览

java - 使用连接点调用(* *.*(..)),如果可用,我可以将参数公开给建议吗?

java.util.Set就我而言,我通过建议对 的实例(尤其是add(Object)和)的某些方法调用来跟踪某些集合的更改remove(Object)。由于更改未反映在集合本身中,因此调用Set.contains(Object)Set.size()返回错误结果。

因此,我想拦截对 Set 实例的所有方法调用(除了addand remove),并将调用转发到我的最新集合。

当然,我可以使用不同的切入点定义两个建议,如下所示:

它有效,但它非常丑陋,我的建议的主体非常相似。所以我想“组合”它们;有效地为两个切入点编织了一个建议,就像这样:

这可能吗?我感觉不是,因为在其中一个切入点中我公开了参数(随后在建议中使用它),而在另一个切入点中没有参数,因此似乎不可能在封闭建议中绑定“潜在标识符” ......但我希望我忽略了一些事情,你也许能指出我正确的方向。谢谢!

0 投票
2 回答
37220 浏览

java - 与接口上的注释匹配的 Spring AOP 切入点

我有一个在 Java 6 / Spring 3 中实现的服务类,它需要一个注释来限制角色的访问。

我定义了一个名为RequiredPermission 的注释,它的值属性是一个或多个来自名为OperationType 的枚举的值:

我还有以下方面定义:

参数对象包含一个用户名,我想在允许访问该方法之前查找用户所需的角色。

当我将注释放在 MyServiceImpl 中的方法上时,一切正常,切入点匹配并且方面启动。但是,我相信注释是服务合同的一部分,应该与接口一起发布在单独的 API 包中. 显然,我不想将注释放在服务定义和实现(DRY)上。

我知道在 Spring AOP 中有一些情况是由注释一个接口方法(例如事务)触发的。这里是否有特殊的语法,或者开箱即用是不可能的。

PS:我没有发布我的弹簧配置,因为它似乎工作得很好。不,这些既不是我原来的类也不是方法名。

PPS:实际上,这是我的 spring 配置的相关部分:

0 投票
2 回答
477 浏览

java - 定义切入点以捕获接口但不捕获父或子接口

我想知道如何在 aspecJ 中定义一个切入点,该切入点捕获接口的任何方法,但不捕获任何父接口或子接口的方法。

我想要一个只捕获methodB() 而不是methodA() 或methodC() 的切入点。有什么方法可以在不列出切入点中的所有子接口和超级接口的情况下以一般方式执行此操作?

0 投票
1 回答
318 浏览

java - 具有简单类型的 AspectJ 连接点

我可以捕捉到算术中定义的连接点吗?

就像是:

我可以制作一个pointcut捕捉其中任何一条的线吗?我能得到什么背景?

我想before()在类的特定方法中完成的所有 int/float/double 操作中添加一个,这可能吗?

我在AspectJ 文档中看到为对象初始化和方法调用定义了连接点。是在声明一个int对象初始化并且+操作符算作方法调用吗?

谢谢!

0 投票
1 回答
357 浏览

java - 尽管我也添加了 aspectjrt.jar,但使用 spring aop 切入点出现错误

无法解决此问题错误:

java.lang.IllegalStateException:ContainerBase.addChild:开始:org.apache.catalina.LifecycleException:javax.xml.parsers.FactoryConfigurationError:在org.apache.catalina.core.ContainerBase中找不到提供程序org.apache.xerces.jaxp.SAXParserFactoryImpl .addChildInternal(ContainerBase.java:932) 在 org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:912) 在 org.apache.catalina.core.StandardHost.addChild(StandardHost.java:694) 在 com。 sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1933) 在 com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1605) 在 com.sun.enterprise.web.WebApplication.start(WebApplication. java:90) 在 org.glassfish.internal.data.EngineRef.start(EngineRef.java:126) 在 org.glassfish.internal.data。ModuleInfo.start(ModuleInfo.java:241) at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:236) at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:339)在 com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:183) 在 org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:272) 在 com.sun.enterprise.v3.admin .CommandRunnerImpl$1.execute(CommandRunnerImpl.java:305) at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:320) at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl. java:1176) 在 com.sun.enterprise.v3.admin.CommandRunnerImpl.access $900(CommandRunnerImpl.java:83) 在 com.sun.enterprise.v3.admin。CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1235) at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1224) at com.sun.enterprise.v3.admin.AdminAdapter.doCommand( AdminAdapter.java:365) 在 com.sun.enterprise.v3.admin.AdminAdapter.service(AdminAdapter.java:204) 在 com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:166) 在 com .sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:100) 在 com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:245) 在 com.sun.grizzly.http .ProcessorTask.invokeAdapter(ProcessorTask.java:791) 在 com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693) 在 com.sun.grizzly.http.ProcessorTask。在 com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135) 在 com.sun.grizzly 的 com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170) 的进程(ProcessorTask.java:954) .DefaultProtocolChain.execute(DefaultProtocolChain.java:102) 在 com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88) 在 com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76) 在 com. sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57) at com.sun.grizzly.ContextTask.run(ContextTask.java:69) at com .sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330) 在 com。sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309) 在 java.lang.Thread.run(Thread.java:619)

0 投票
1 回答
1754 浏览

aop - 方面扫描过多的类和方法缓存填充内存

在我们的应用程序中,我们有几个(实际上很多,大约 30 个)Web 服务。每个 Web 服务都驻留在自己的 WAR 文件中,并有自己的 Spring 上下文,该上下文在应用程序启动时被初始化。

我们还有许多注释驱动的方面类,我们将它们应用于 Web 服务类。一开始,切入点表达式看起来像这样:

并且通过配置条目在服务上启用了 AOP。

但是当网络服务的数量增加时,我们开始OutOfMemoryException在我们的服务器上体验 s。在进行了一些分析和分析之后,似乎内存被 AspectJExpressionPointcut 类的实例保存的缓存占用。

每个实例的缓存大约为 5 MB。由于我们有 3 个方面和 30 个服务,因此总共有 90 个实例持有 450MB 的数据。

在检查缓存的内容后,我们意识到它包含 WAR 中存在的所有类的 Java 反射方法实例,即使是那些不属于 my.package.service.business 包的类。将切入点表达式修改为具有附加within子句后:

内存使用再次下降到正常水平。并且所有 AspectJExpressionPointcut 实例总共占用不到 1MB。

有人可以解释这是为什么吗?为什么第一个切入点表达式还不够?AspectJExpressionPointcut为什么不共享缓存?

0 投票
2 回答
3261 浏览

java - 方法变量上的 AspectJ 切入点,可能吗?

我使用 AspectJ 已经有一段时间了,它在包含注释的对象范围字段上效果很好。我刚刚遇到了一种情况,我想注释一个方法范围的变量,该变量将与我的切入点一起使用,但我遇到了麻烦。

这是我正在使用的切入点。如果我的变量是对象的字段,它可以正常工作,但是如果我将范围缩小到方法(在方法内声明的变量),那么它就不再起作用了,我不知道为什么。让我知道我能做什么,谢谢。

另外,这是我想要工作的一个例子。上面的 System.out.println 应该在 Trigger 被实例化时触发:

0 投票
2 回答
1310 浏览

java - Spring AOP忽略了Hessian Service的一些方法

我有一个具有以下切入点定义的方面

和包含以下内容的弹簧配置

(真实配置中有多个服务)

我看到在某些方法中调用了方面,但不是全部。我怀疑(但还没有完全确定)只有直接在接口中声明的方法被包装在方面,而在超接口中声明的方法被忽略(尽管该接口应该匹配相同的切入点)。

这是预期的行为吗?我怎样才能改变它?还有什么可能发生的?

0 投票
1 回答
1920 浏览

spring - 我需要一个 Spring AOP 切入点解释

我已经看到了切入点模式的两种变体:

还有这个

最后两个 * 之间的点(或不存在)是什么意思?

0 投票
3 回答
28605 浏览

exception - 从 AspectJ 获取返回值或异常?

我能够从建议的方法调用中获取签名和参数,但我无法弄清楚如何获取返回值或异常。我有点假设它可以以某种方式使用 around 并继续来完成。