2017-01-23 223 views
5

我使用的是Spring Boot,我想用它來使用AspectJ。@EnableAspectJAutoProxy不起作用

下面的作品(當然):

 
@Aspect 
@Component 
public class RequestMappingAspect { 

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

但是,如果@Component被移除,並添加@EnableAspectJAutoProxy,以下是行不通的。

 
@SpringBootApplication 
@EnableSwagger2 
@EnableAspectJAutoProxy 
public class Application { 

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

如何正確啓用AspectJ自動代理?

+0

隨着'@ EnableAspectJAutoProxy'你不使用AspectJ,而是使用基於代理的Spring AOP。但可能這就是你想要的。 – kriegaex

+2

Ofcourse它不會工作...我刪除'@ Component'不會創建方面的實例,因此沒有可用的方面,所以沒有用。您需要'@ Component'和'@ Aspect'來使它工作(或者將方面定義爲'@ Bean'方法)。無論哪種方式,該方面的一個實例必須在那裏才能實現。 –

回答

1

想知道同樣的事情,我們結束了做一些與此類似:

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

這使我們只需添加的方面,這也打電報通知他們正確的@Aspect -annotation。 可能是因爲這是毫無意義的答覆,但是,它解釋了我們如何解決問題 - 而不是問題的實際解決方案。讓我知道你是否希望將其刪除。

+0

這裏沒有什麼是自動的......方面是用'@ Bean'方法創建的,所以如果你添加一個新的方面,你需要添加另一個方法。 –

2

同時需要@EnableAspectJAutoProxy爲春季的配置和@Aspect組合/ @Component註釋

@EnableAspectJAutoProxy做同樣的事情,基於XML < AOP:AspectJ的自動代理>