2013-07-26 11 views
6

@Configurable 주석이 표시된 클래스에 대해 컴파일 시간 구성을 구성하여 new 연산자로 시작된 클래스에 스프링 종속성을 주입 할 수 있습니다. 응용 프로그램 서버의 스크립트를 실행할 수있는 권한이 없으므로로드 시간 짜기를 사용하지 않으므로 수정할 수 없습니다. 또한이 클래스를 테스트에서 사용할 수 있기를 원합니다. IDE에서 테스트 케이스를 실행한다는 의미입니다. 웹 및 스프링 참조에 대한 로딩 시간 정보와 컴파일 타임 구성 구성에 대한 정보는 찾지 못했습니다.비 스프링 관리 클래스에서 DI를 컴파일 할 때 컴파일 시간이

추신. 나는 그런 당신이 당신의 클래스 패스에 스프링 부분이 있는지 확인 받는다는와 함께 작동합니다 당신의 치어이 같은

+0

Eclipse 또는 IntelliJ 또는 기타? –

+0

Eclipse를 사용합니다. – maks

답변

1

뭔가 ...

  <plugin> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>aspectj-maven-plugin</artifactId> 
       <version>1.4</version> 
       <executions> 
        <execution> 
         <id>compile</id> 
         <configuration> 
          <source>${source}</source> 
          <target>${target}</target> 
          <verbose>true</verbose> 
          <aspectLibraries> 
           <aspectLibrary> 
            <groupId>org.springframework</groupId> 
            <artifactId>spring-aspects</artifactId> 
           </aspectLibrary> 
          </aspectLibraries> 
         </configuration> 
         <goals> 
          <goal>compile</goal> 
         </goals> 
        </execution> 
        <execution> 
         <id>test-compile</id> 
         <configuration> 
          <source>${source}</source> 
          <target>${target}</target> 
          <verbose>false</verbose> 
          <aspectLibraries> 
           <aspectLibrary> 
            <groupId>org.springframework</groupId> 
            <artifactId>spring-aspects</artifactId> 
           </aspectLibrary> 
          </aspectLibraries> 
         </configuration> 
         <goals> 
          <goal>test-compile</goal> 
         </goals> 
        </execution> 
       </executions> 
       <dependencies> 
        <!-- Ensure aspectj tools version used by compiler is the same version used as dependency. Avoids warning --> 
        <dependency> 
         <groupId>org.aspectj</groupId> 
         <artifactId>aspectjtools</artifactId> 
         <version>${aspectj.version}</version> 
        </dependency> 
        <dependency> 
         <groupId>org.aspectj</groupId> 
         <artifactId>aspectjweaver</artifactId> 
         <version>${aspectj.version}</version> 
        </dependency> 
       </dependencies> 
      </plugin> 

봄을 사용합니다.

는 그리고 이클립스에서 aspecting에 대한 - AJDT

+0

클래스 경로에 스프링 특성이 있습니다. 그러나 프로젝트를 컴파일 (mvn 컴파일) 할 때 오류가 발생합니다. '누락 된 유형 javax.persistence.Entity' 주석을 결정할 수 없습니다. 그러나 나는 심지어 내 프로젝트에서 그것을 사용하지 않는다. (나는 최대 절전 모드 나 다른 jpa 호환 툴을 가지고 있지 않다.) – maks

+0

또한 나는 그것이 모든 클래스를 짜는 것을 알아 차렸다. (@Configurable ') – maks

+0

또한'$ {aspectj.version}'은 무엇입니까? 그것이 의미하는 것의 버전? – maks

4

를 설치 그래서 다른 대답은 또한 유효하지만 난 내가 좀 더 구체적으로이 방법의 의미의 일부를 포함 거라고 생각했다.

내가 사용하는 설정은 기본 수준이에있다 : -

이제
 <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>aspectj-maven-plugin</artifactId> 
      <version>1.4</version> 
      <dependencies> 
       <dependency> 
        <groupId>org.aspectj</groupId> 
        <artifactId>aspectjrt</artifactId> 
        <version>${aspectj.version}</version> 
       </dependency> 
       <dependency> 
        <groupId>org.aspectj</groupId> 
        <artifactId>aspectjtools</artifactId> 
        <version>${aspectj.version}</version> 
       </dependency> 
      </dependencies> 
      <configuration> 
       <outxmlfile>META-INF/aop.xml</outxmlfile> 
       <aspectLibraries> 
        <aspectLibrary> 
         <groupId>org.springframework</groupId> 
         <artifactId>spring-aspects</artifactId> 
        </aspectLibrary> 
       </aspectLibraries> 
       <source>1.7</source> 
       <target>1.7</target> 
       <forceAjcCompile>true</forceAjcCompile> 
      </configuration> 
     </plugin> 

, 의존성에 대한 몇 가지 추가 정보 : -

<dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-aop</artifactId> 
     <version>${dep.spring}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-aspects</artifactId> 
     <version>${dep.spring}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.aspectj</groupId> 
     <artifactId>aspectjrt</artifactId> 
     <version>${aspectj.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.aspectj</groupId> 
     <artifactId>aspectjweaver</artifactId> 
     <version>${aspectj.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.persistence</groupId> 
     <artifactId>persistence-api</artifactId> 
     <version>1.0</version> 
     <scope>provided</scope> 
    </dependency> 

난 당신이 지속성 API를 그리워한다고 가정한다 직조에 사용됩니다.

편집 : 봄에 https://jira.springsource.org/browse/SPR-6819 버그 관련. 그게 왜 persistence API가 필요한지하는 것 같습니다.

클래스가 ide에서 unweaved되면 직조 작업을 생성하는 데 도움이 될 수 있습니다 (이것은 나에게 많이 발생합니다).

aspectj:compile 

마지막으로 클래스를 단위 테스트하려는 경우이 단계 후에 클래스를 조합하는 것이 유용 할 수 있습니다. 우리는 prepare-package 단계에서 짜다. 추가 하시려면

 <executions> 
       <execution> 
        <phase>prepare-package</phase> 
        <goals> 
         <goal>compile</goal> 
        </goals> 
       </execution> 
      </executions> 

귀하의 플러그인에 추가하십시오.

IDE에서이 접근 방식을 사용하는 것이 까다로울 수 있으므로 도움이 되길 바랍니다.

+0

왜 persistance API가 필요합니까? 나는 그것을 사용하지 않는다. 그리고 그것이 직조에 어떻게 사용될 수 있는지 상상할 수 없습니다. 나는 봄 - 측면의 일부 측면이이 API와 함께 작동하므로 aspectj-maven-pluging은 aspectjLibraries의 구체적인 측면을 선택하여 직조 과정에 사용하는 옵션이 있어야합니다. 또한 aspectjrt 종속성이 필요한 이유는 무엇입니까? 로딩 시간을 사용하지 않습니다. – maks

+1

안녕하세요, 지속성 문제에 대한 jira 문제를 추가했습니다. – MikePatel

+0

또한 aspect runtime은 컴파일 타임 짜기와 결합되지 않습니다. cflow pointcut 지정자와 thisJoinPoint 작업 (필자는 읽음)을 피함으로써 사용의 필요성을 최소화 할 수 있습니다. 프로젝트 나 다른 것에 의존성을 더 이상 도입 할 수없는 상황에 처해 있습니까? – MikePatel