gpt4 book ai didi

java - 跨 OSGi 包添加服务方面

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:15:28 25 4
gpt4 key购买 nike

我有一个 OSGi 包(不是我所有的 - 所以我无法更改它!),它公开(导出)服务 EchoService,我想将一个方面附加到这个方法服务(以便围绕它执行一些前/后处理)。这些部署在 Apache Felix 容器上。

我已经编写了自己的 OSGi 包(显然导入了 EchoService),并使用标准 Spring AOP 将 Spring 方面附加到它。但是,看起来方面没有附加并且我的拦截器没有被调用。

我怀疑这是因为我试图拦截不属于我的 bundle 的服务(这似乎是合理的)。那是对的吗?我该如何克服这个问题?

这是我的拦截器/方面的样子:

    @Before("serviceOperation()")
public void before(JoinPoint jp) {
logger.debug("Entering method: " + jp.toShortString());
}

@AfterReturning("serviceOperation()")
public void after(JoinPoint jp) {
logger.debug("Exiting method: " + jp.toShortString());
}

最佳答案

我不是 AOP 也不是 Spring 专家,但也许我可以给你一些想法。据我所知Spring use standard J2SE dynamic proxies for AOP proxies .因此你的客户should use the proxy而不是原来的 EchoService 对象。当您使用 CGLIB 代理时也是如此,因为 "the proxies are created by sub-classing the actual class" .

如果您的客户端捆绑请求 EchoService,您必须以某种方式将代理传递给他们。对于 OSGi 容器内的这个,您还应该导出 EchoService(代理)并确保客户端使用代理服务/ bundle ,而不是原始服务。您可以通过为(代理)包设置不同的版本号并将此版本设置为客户端包中的导入要求来完成此操作。 (我想您可以修改 EchoService 的客户端。)对于服务,您可以在注册时设置一个属性并修改客户端以仅查询具有此属性的服务。

如果您无法修改客户端包,另一个解决方案可能是将原始包作为内部 jar 包装在您的包中。您可以从激活器中调用包装包的激活器,并向它们传递修改后的 BundleContext。此 BundleContext 应捕获注册服务调用并注册代理对象而不是原始 EchoService。您可以使用简单的委托(delegate)模式,因为 BundleContextServiceListener 等通常是接口(interface)。我想它可以工作,但它可能有其他挑战。

关于java - 跨 OSGi 包添加服务方面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7488852/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com