2013-03-07 3 views
0

스프링을 사용하여로드 시간에 기존 tomcat webapp에 aspect를 직조 할 수 있습니다. & AspectJ. 나는 생성자 pointcut을 수행해야하기 때문에 AspectJ를 사용하고있다.
두 가지 테스트 시나리오가 있습니다. 하나는 내 애스펙트가 간단한 서블릿 애플리케이션의 일부입니다. 애플리케이션에 애스펙트 소스가 포함되어 있으며 MVN과 aspectJ 플러그인을 사용하여 WAR과 Aspect를 컴파일합니다. 이 부분은 예상대로 작동합니다. 두 번째 시나리오는 aspect를 자체 프로젝트로 분리하고 AJC와 AJDT를 모두 사용하여 JAR 파일로 컴파일하고 war/WEB-INF/lib 폴더에 jar 파일을 포함시킨다. war 파일 컨텍스트가로드 될 때 Aspect가 선택되지만 war 파일의 모든 개체에는 적용되지 않는 것으로 보입니다.WebApp에서 LTW를 작동시키는 데 필요한 트릭은 무엇입니까?

<aspectj> 
    <aspects> 
     <aspect name="com.ddvc.ivr.ProjectMonitor" /> 
    </aspects> 
</aspectj> 

그리고 내 스프링 컨텍스트 : 나는 웹 응용 프로그램/META-INF 폴더에 aop.xml 파일을 포함했다

@SuppressWarnings("unused") 
public aspect ProjectMonitor{ 

    pointcut constr() : call(com.avaya..*.new(..)) ; 
    Object around() : constr(){ 
     System.out.println("In Constructor for " 
       + thisJoinPointStaticPart.getSignature()); 
     Object ret = proceed(); 
     return ret; 
    } 

    pointcut publicOperation() : execution(public * *.*(..)); 
    Object around() : publicOperation() { 
     long start = System.nanoTime(); 
     Object ret = proceed(); 
     long end = System.nanoTime(); 
     System.out.println(thisJoinPointStaticPart.getSignature() + " took " 
       + (end - start) + " nanoseconds"); 
     return ret; 
    } 

    pointcut callConst() : call(public *..*SCESession.new(..)); 
    public Object callConst(ProceedingJoinPoint jp) throws Throwable { 
     System.out.println("In Project Monitor!!!"); 
     return jp.proceed(); 
    } 


} 

: 여기

는 화면 코드 파일은 다음과 같이 표시됩니다.

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:aop="http://www.springframework.org/schema/aop" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xmlns:p="http://www.springframework.org/schema/p" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 


    <context:load-time-weaver aspectj-weaving="on" /> 
    <context:spring-configured /> 
    <context:component-scan base-package="com.avaya.sce.runtimecommon"/> 
    <context:annotation-config /> 
    <aop:aspectj-autoproxy /> 

    <!-- Aspect Mapping --> 

    <bean id="monitor" class="com.ddvc.ivr.ProjectMonitor" factory-method="aspectOf"/> 

</beans> 

아주 똑바로, 맞습니까? 나는 심지어 -javaagent 세트를 가지고 :

export JAVA_OPTS="-Xmx1024M -Xms1024M -server -javaagent:/software/apache-tomcat-6.0.36/lib/spring-instrument-3.2.1.RELEASE.jar"  

왜 소스가 WAR 파일로 컴파일하지만이 클래스 경로에 JAR 파일을 포함 할 때, 그것은 전혀 작동하지 않습니다이 작동합니다. 전쟁 상황에 맞는 파일을 다시로드 할 때 내가 바람둥이 로그에 다음을 참조

여러 번 파일 :

11 : 27 : 51,285 DEBUG GenericTypeResolver : 151 - [공공 정적 조직에 대한 반환 유형을 해결합니다. 구체적인 메소드 인수 [{}]가있는 .

모두/전체 답글 감사합니다! 미리 감사드립니다, 그리프

답변

0

어리석은 실수는 시간과 돈을 요합니다. 포함 된 JAR 파일 대신 WAR 파일/META-INF 폴더에 aop.xml을 포함했습니다. JAR 파일 내에서 aop.xml 파일을 이동하면 문제가 해결되었습니다.