2011-12-21 8 views
0

は、私がaspectOf()メソッドを使用して側面のシングルトンインスタンスを手に入れることができます。ロード時の織り方を列挙しますか? AspectJのを使用して

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

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

私の実行中のJavaアプリケーションの側面の全てのリストを取得する方法はありますか?ロードタイム織りとAspectJ 1.6.7を使用していますが、必要に応じてバージョンをアップグレードできます。

自分のアプリケーション内側面の全てのリストは、私は、起動時にそれらに依存性を注入することができます。

答えて

1

むしろハック溶液、それでも溶液:手動クラスパスから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

あなたの側面の一つ一つを一覧表示したくない場合は、多分あなたはあなたの依存関係を注入する別の態様を使用して検討すべき?

ない場合は、お使いのDIフレームワークはいくつかの有用なメカニズムを提供することができます。

関連する問題