2017-01-23 4 views
5

Używam Spring Boot, i chciałbym użyć z nim AspectJ.@EnableAspectJAutoProxy nie działa

następujące prace (oczywiście):

 
@Aspect 
@Component 
public class RequestMappingAspect { 

    @Before("@annotation(org.springframework.web.bind.annotation.RequestMapping)") 
    public void advice(JoinPoint joinPoint) { 
     ... 
    } 
} 

Jednak jeśli @Component jest usuwany i @EnableAspectJAutoProxy dodaje się następujące nie działa.

 
@SpringBootApplication 
@EnableSwagger2 
@EnableAspectJAutoProxy 
public class Application { 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 
} 

Jak poprawnie włączyć Auto proxy AspectJ?

+0

Z '@ EnableAspectJAutoProxy' nie używasz AspectJ, ale opartego na proxy Spring AOP. Ale prawdopodobnie tego właśnie chcesz. – kriegaex

+2

Oczywiście, że nie zadziała ... Jeśli usuniesz '@ Component', nie zostanie utworzona żadna instancja tego aspektu, a więc żadne aspekty nie będą dostępne, więc nic do użycia. Aby to działało, potrzebujesz zarówno '@ Component' i' @ Aspect' (lub zdefiniuj aspekt jako metodę @ @ Bean'). Tak czy inaczej, musi być tam instancja aspektu, aby działała. –

Odpowiedz

1

Zastanawiasz się o to samo, skończyło się robić coś podobnego do tego:

@EnableAspectJAutoProxy(proxyTargetClass = true) 
@Configuration("Main applicationContext") 
@ComponentScan(
    basePackages = {"com.where.ever"}, 
    excludeFilters = {@ComponentScan.Filter(Aspect.class)}) 
public class ApplicationConfiguration { 
    @Bean(autowire = Autowire.BY_TYPE) 
    public SomeAspect someAspect() { 
     return Aspects.aspectOf(SomeAspect.class); 
    } 
    ... 
    ... 
} 

Pozwoliło to nam wystarczy dodać @Aspect -annotation na aspektach, które również przewodowych je poprawnie. Może to być bezsensowna odpowiedź, ale wyjaśnia, w jaki sposób rozwiązaliśmy problem, a nie rzeczywiste rozwiązanie problemu. Daj mi znać, jeśli chcesz, aby to zostało usunięte.

+0

Nie ma w tym nic automatycznego ... Aspekt jest tworzony za pomocą metody '@ Bean', więc jeśli dodasz nowy aspekt, musisz dodać inną metodę. –

2

trzeba mieć @EnableAspectJAutoProxy dla konfiguracji sprężyny i kombinacji @Aspect/@Component adnotacje

@EnableAspectJAutoProxy robi to samo, co oparty na XML < AOP: AspectJ AutoProxy >