2015-07-04 3 views
0

Новые для аспектно-ориентированного развития.Аспект аннотации ссылки

2 часть вопрос подходит.

  1. Есть ли у вас хорошие сайты, содержащие учебник и код, который работает? До сих пор я видел много учебников, но с фрагментированным кодом, и я ничего не могу собрать вместе, чтобы он работал локально.

  2. Im пытается создать фреймворк с аспектом и классом aspectj, который должен перехватывать все вызовы методов, которые аннотируются с аспектом. Он отлично работает в моем локальном проекте, но когда я пытаюсь использовать этот аспект в другом проекте, он, похоже, не работает. Пример

Код: Аспект перехватчик

@Aspect 
public class InterceptCallAspect { 
    @Around("execution(* *(@InterceptCall (*)));") 
    public void record(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { 
     //Before 
     System.out.println("Before"); 
     proceedingJoinPoint.proceed(); 
     System.out.println("After"); 
     //After 
    } 
} 

Аспект

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.METHOD) 
public @interface InterceptAspectAnnotation { 
} 

Так что, когда я аннотировать мой TestCase в моем проекте я получаю SYSOUT в нужных местах. Но когда я создаю свою банку и собираю ее в другом проекте, она ничего не делает.

Мой ПОМ файл:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
<modelVersion>4.0.0</modelVersion> 
<artifactId>InterceptCall</artifactId> 
<groupId>testing</groupId> 
<packaging>jar</packaging> 
<version>0.0.2-SNAPSHOT</version>  
<dependencies> 
    <dependency> 
     <groupId>org.aspectj</groupId> 
     <artifactId>aspectjrt</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.aspectj</groupId> 
     <artifactId>aspectjweaver</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-aop</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
    </dependency> 
</dependencies> 
<build> 
    <plugins> 
     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>aspectj-maven-plugin</artifactId> 
      <version>1.7</version> 
      <configuration> 
       <complianceLevel>1.8</complianceLevel> 
       <source>1.8</source> 
       <target>1.8</target> 
      </configuration> 
      <executions> 
       <execution> 
        <goals> 
         <goal>compile</goal> 
         <goal>test-compile</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 

ответ

2

Я могу только решить второй вопрос, так что я буду оставить первый для других.

Если вы предоставили аспект через внешнюю библиотеку (например, встроенную банку), вам нужно указать плагин aspectj-maven, где можно найти аспекты, используемые для плетения. Конфигурация-tag должен содержать тег с именем aspectLibraries с aspectLibrary -tags для каждого Lib использовать:

 <aspectLibraries> 
      <aspectLibrary> 
       <groupId>com.your.example.util</groupId> 
       <artifactId>tracing-aspect</artifactId> 
      </aspectLibrary> 
     </aspectLibraries> 
+0

Хм, я хочу, чтобы создать общую библиотеку с аспектами, которые должны быть доступны для любого проект. Итак, если вы правы (нужно проверить это), это означает, что любой проект, который хочет использовать мою фреймворк, должен иметь тег aspectLibraries в своем проекте maven? И если они используют groovy или ant что-то похожее для их скрипта сборки. – Nosfert

+0

Да, независимо от сценария сборки, AspectJ должен знать, какие аспекты использовать для плетения. Он может подобрать все, что является частью кода проекта, любым способом, но если он приходит как библиотека, это не так. Следовательно, тег aspectLibraries. – sheltem

+0

http://www.github.com/abrovinc/methodmock Так я и ходил. – Nosfert

Смежные вопросы