如何在Apache Felix中使用AOP AspectJ来实现OSGi?

5
我正在开发一个OSGi项目。 尽管我没有在AOP与OSGi结合方面的多年经验,但我想知道如何在OSGi环境中最好地进行AOP? 我们已经实现了AOP场景,以创建一个控制台来拦截对bundle的调用,以便为此bundle启动的每个任务存储经过的时间。 今天,这个方面已经部署在jboss容器上,使用aspectj提供的LoadTimeWeaver(向jboss启动脚本添加代理程序以将容器中的jar包进行逐项处理-javaagent:%APP_HOME%\application\lib\aspectjweaver-1.6.11.jar)。 我读了一些关于这个问题的文章,但没有找到一个适合我的解决方法。例如,Equinox孵化器项目就有针对AspectJ的解决方案。但由于我正在使用Apache Felix和Bnd(tools),我不想使用Equinox的任何东西。编织过程的一个要求是应该是在加载时进行的(一个针对另一个bundle内部方法进行工具类的AspectJ bundle)。 是否有人可以分享使用AOP aspectj与OSGI Felix进行这种用例的经验?

在OSGi中,编织是标准化的,因此您可以将其作为一个bundle来完成。 - Peter Kriens
3
你能增加更多的信息、链接等吗?在所解释的情况下,我们需要创建一个bundle_A,其中必须有pointcut来处理在bundle_B中存在的方法。通过在bundle_A的aspect类中使用@Before和@After注释,我们可以执行某些操作的日志记录。你能更好地解释一下在OSGi环境中的解决方案吗?我看到过WeavingHook,但它并不像AspectJ Load Time Weaving那样简单。 - freedomind
1个回答

1

这是一个关于最小化 felix aspectj setup 的工作示例。

基本模式为:

  1. register weaving hook on activation

    public class Activator implements BundleActivator {
       public void start(BundleContext context) throws Exception {
           AspectWeaver weaver = new AspectWeaver();
           servList.add(context.registerService(WeavingHook.class, weaver, null));
       }
    }
    
  2. inject weaving definition context:

    public class AspectContext extends DefaultWeavingContext {
        @Override
        public List<Definition> getDefinitions(final ClassLoader loader, final WeavingAdaptor adaptor) {
            if (definitionList == null) {
                definitionList = AspectSupport.definitionList(loader, rootConfig);
            }
            return definitionList;
        }
    }
    
  3. provide weaving hook implementation

    public class AspectWeaver implements WeavingHook {
      @Override
      public void weave(WovenClass woven) {
          String name = woven.getClassName();
          BundleWiring wiring = woven.getBundleWiring();
          ClassLoaderWeavingAdaptor adaptor = ensureAdaptor(wiring);
          final byte[] source = woven.getBytes();
          final byte[] target;
          // aspectj is single-threaded
          synchronized (adaptor) {
              target = adaptor.weaveClass(name, source);
          }
          woven.setBytes(target);
     }
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接