2012-12-06 9 views
5

Ich habe einfach Aspect mit primitiven Pointcut geschrieben und Beratung Methode:Set eine AspectJ Beratung für statische Methode

@Aspect 
public class MyAspect { 

    @Pointcut("execution(static * com.mtag.util.SomeUtil.someMethod(..))") 
    public void someMethodInvoke() { } 

    @AfterReturning(value = "someMethodInvoke())", returning = "comparisonResult") 
    public void decrementProductCount(List<String> comparisonResult) { 
    //some actions 
    } 
} 

Ich habe folgenden Frühling Annotation-basierte Anwendung config:

@Configuration 
@EnableAspectJAutoProxy 
public class AppConfig { 
    //... 
} 

und Utility-Klasse in com.mtag.util Paket:

public class SomeUtil { 
    static List<String> someMethod(List<String> oldList, List<String> newList) { 
    //... 
    } 
} 

aber wenn ich rufe

im Komponententest Ich kann sehen, dass Methodenaufruf nicht abgefangen wird und mein @AfterReturning Advise funktioniert nicht.

Aber wenn ich irgendeinemethode() ändern, um beispielsweise ein (nicht statisch) Methode, pointcut zu

@Pointcut("execution(* com.mtag.util.SomeUtil.someMethod(..))") 

und SomeUtil Bohne von Spring verwalten, indem @Component Annotation und Anrufziel Hinzufügen metod wie folgt aus:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = {AppConfig.class}, loader = AnnotationConfigContextLoader.class) 
public class SomeUtilTest { 

    @Autowired 
    private SomeUtil someUtil; 

    @Test 
    public void categoriesDiffCalc() { 
     List<String> result = someUtil.someMethod(...); 
    } 
} 

Alles ist in Ordnung.

In welcher Weise kann ich einen Hinweis für statische Methode einstellen?

+0

'@AfterReturning (value = "someMethodInvoke())"' Sie eine zusätzliche Halterung – tibtof

+0

@izhamoidsin haben, ist die Antwort zur Verfügung gestellt (von mir) akzeptiert. Oder dieser ist falsch? –

Antwort

4

Tatsächlich gibt es keine Lösungen zum Abfangen von statischen Methoden mit Auto-Proxy im Frühjahr-Framework. Sie sollten die LWT AspectJ-Lösung verwenden.

Kurz gesagt, Sie sollten die gleichen Anmerkungen verwenden, aber mit einigen zusätzlichen Konfiguration.

1) in den Frühling Kontextdatei nächste Zeile:

<context:load-time-weaver/> 

(kann in Ihrer Situation sei es nicht notwendig ist)

2) leider sollten Sie auch META-INF/AOP hinzufügen. XML. Beispiel:

<weaver> 
    <include within="com.example.ClassA"/> <!-- путь к конкретному классу --> 
    <include within="com.log.* "/> <!—путь к пакету с аспектами> 
</weaver> 
<aspects> 
    <aspect name="com.log.AspectA"/> 
</aspects> 

3) beim Starten JVM das Argument

-javaagent:${PATH_TO_LIB }/aspectjweaver.jar 

sollte hinzugefügt werden.

So ist diese Lösung ziemlich mühsam.

Für weitere Informationen lesen 7.8.4 Kapitel hier http://docs.spring.io/spring/docs/3.0.0.RC2/reference/html/ch07s08.html

+1

Gute Antwort, Eugene. Ich denke nicht einmal, dass diese Lösung mühsam ist. Sobald es eingerichtet ist, wird es für immer funktionieren. :-) Wenn Sie eine zusätzliche Laufzeitkonfiguration vermeiden möchten, können Sie trotzdem das Kompilieren verwenden. – kriegaex

+0

Ja, ich meinte, dass diese Lösung mühsam ist, hängt davon ab, nicht-statische Methoden abzufangen, aber für mich war es mühsam zu untersuchen. =) –

+0

Können Sie die Kommentare im Code übersetzen? – Kwadz