Перечислить аспекты, связанные с временем загрузки?

Используя AspectJ, я могу получить одноэлементный экземпляр аспекта, используя aspectOf():

MyAspect aspect = Aspects.aspectOf(MyAspect.class);

// now perform post-application startup initialisation, eg:
aspect.setLogService(logging); 

Есть ли способ получить список всех аспектов моего запущенного Java-приложения? Я использую AspectJ 1.6.7 с переплетением во время загрузки, но при необходимости могу обновить версии.

Список всех аспектов моего приложения позволит мне внедрить в них зависимости при запуске.


person Dan Vinton    schedule 21.12.2011    source источник


Ответы (2)


Довольно хакерское решение, но тем не менее решение: вручную загрузить файл aop.xml из пути к классам и проанализировать его, чтобы получить имена классов аспектов:

final Enumeration<URL> urls =
  getClass().getClassLoader().getResources("META-INF/aop.xml");

final Collection<String> aspectNames = new ArrayList<String>();

for (final URL url : urls) 
{
    final Stream xml = url.openStream();

    final DocumentBuilderFactory docBuilderFactory = 
      DocumentBuilderFactory.newInstance();
    docBuilderFactory.setValidating(false);
    docBuilderFactory.setNamespaceAware(false);

    final XPath xpath = XPathFactory.newInstance().newXPath();
    final Document aspectXml = docBuilderFactory.newDocumentBuilder().parse(xml);
    final XPathExpression selector = xpath.compile("//aspect/@name");

    final NodeList matches = 
      (NodeList) selector.evaluate(aspectXml, XPathConstants.NODESET);

    for (int i = 0; i < matches.getLength(); i++) 
    {
        aspectNames.add(matches.item(i).getNodeValue());
    }    
}

Затем экземпляры аспекта могут быть получены следующим образом:

for (final String className : aspectNames) 
{
    final Class<?> aspectClass = Class.forName(className);
    final Object aspect = Aspects.aspectOf(aspectClass);

    // finally (!) do the initialisation on the aspect itself:
    aspect.setLogService(logging);
}
person Dan Vinton    schedule 07.02.2012

Если вы не хотите перечислять каждый из ваших аспектов, то, возможно, вам следует рассмотреть возможность использования другого аспекта для внедрения ваших зависимостей?

Если нет, ваша структура DI может предоставить какой-то полезный механизм.

person Vincent    schedule 05.01.2012