Перечислите сплетенные во время загрузки аспекты? - PullRequest
0 голосов
/ 21 декабря 2011

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 07 февраля 2012

Довольно хакерское решение, но, тем не менее, решение: вручную загрузить файл 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);
}
0 голосов
/ 05 января 2012

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

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

...