2011-12-21 2 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

오히려 hackish 솔루션,하지만 그럼에도 불구하고 해결책 : 수동으로 클래스 경로에서 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 프레임 워크가 유용한 메커니즘을 제공 할 수 있습니다.

관련 문제