2012-12-06 19 views
5

Napisałem prosty Aspect z prymitywnego punktu przekroju i doradzić metoda:ustawić doradztwo AspectJ dla metody statycznej

@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 
    } 
} 

Mam następnej wiosny adnotacji oparte aplikacji config:

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

i użyteczność klasy w pakiet com.mtag.util:

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

ale gdy zgłoszę

SomeUtil.someMethod(arg1, arg2); 

w teście jednostkowym Widzę, że wywołanie metody nie zostało przechwycone, a moja funkcja @AfterReturning nie działa.

Ale jeśli zmienię SomeMethod() wpisać na przykład metodę (non-statyczne), punktu przekroju do

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

i zarządzać SomeUtil fasoli do wiosny dodając @Component adnotacji i połączeń cel Metod tak:

@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(...); 
    } 
} 

Wszystko w porządku.

W jaki sposób mogę ustawić Advice dla metody statycznej?

+0

'@AfterReturning (value = "someMethodInvoke())"' masz dodatkowy wspornik – tibtof

+0

@izhamoidsin, jest odpowiedzią warunkiem (przeze mnie) zaakceptowany. Czy ten jest nieprawidłowy? –

Odpowiedz

4

W rzeczywistości nie ma rozwiązań do przechwytywania metod statycznych przy użyciu automatycznego proxy w ramach wiosennej. Należy użyć rozwiązania LWT AspectJ.

W dużym skrócie należy użyć tych samych adnotacji, ale z dodatkową konfiguracją.

1) dodać do pliku kontekstowego wiosny następnego wiersza:

<context:load-time-weaver/> 

(może być w tej sytuacji nie jest konieczne)

2) Niestety należy również dodać META-INF/AOP. xml. Przykład:

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

3) podczas uruchamiania JVM argumentu

-javaagent:${PATH_TO_LIB }/aspectjweaver.jar 

powinny być dodane.

To rozwiązanie jest dość pracochłonne.

Aby uzyskać więcej informacji przeczytaj rozdział 7.8.4 tutaj http://docs.spring.io/spring/docs/3.0.0.RC2/reference/html/ch07s08.html

+1

Dobra odpowiedź, Eugene. Nie sądzę, że to rozwiązanie jest pracochłonne. Po skonfigurowaniu będzie działać na zawsze. :-) Anway, jeśli chcesz uniknąć dodatkowej konfiguracji runtime, nadal możesz korzystać z tkania w czasie kompilacji. – kriegaex

+0

tak, miałem na myśli, że to rozwiązanie jest pracochłonne, zależy od przechwytywania metod niestatycznych, ale dla mnie było to trudne do zbadania. =) –

+0

Czy możesz przetłumaczyć komentarze w kodzie? – Kwadz

Powiązane problemy