How @Aspect with @Component annotation works under the hood

邮差的信 提交于 2021-01-05 06:04:28

问题


I've been looking for an answer for a while, but no luck so far, thus I'm coming here for some words of wisdom.

I've created an aspect using @Aspect annotation, because I need to @Autowire some singleton dependencies I've decided to annotate this aspect class with @Component and let the Spring to do the magic. It works, however ...

I'm fairly familiar with AOP concept, what's weaving and different flavors of it (cglib vs aspectj) but it's not fully intuitive to me how it works under the hood.

@Component means a given class will be a singleton within a given context, @Aspect means that the content of an aspect class will be somehow weaved into the target class during runtime/compilation - and this target class is not a singleton but prototype for instance. So what I'm ending up with at the end?


回答1:


Spring AOP does not do compile-time-weaving and does not modify the code of the advised target. Instead it works with proxies that are weaved around the joinpoints. That is why Spring AOP aspects and be used as (singleton) components, have their fields autowired, etc., like any other Spring Proxy.

It is also the reason why Spring AOP aspects only work for public method executions, not field accesses and the like.

The documentation is quite well written and goes into as much (or as little) detail as one might like: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html




回答2:


The book AspectJ in Action's section 2.5 is on the internal working of the weaving step, it is only 2 page but gets the point across well.

Luckily the section is available here.

This is for posterity.



来源:https://stackoverflow.com/questions/33612156/how-aspect-with-component-annotation-works-under-the-hood

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!