@Aspect与@Component注释的工作原理

时间:2015-11-09 15:11:17

标签: spring aop aspectj

我一直在寻找答案,但到目前为止没有运气,所以我来这里寻求一些智慧的话。

我已经使用@Aspect注释创建了一个方面,因为我需要@Autowire一些单例依赖关系我决定使用@Component注释这个方面类,并让Spring做出魔术。但它有效......

我非常熟悉AOP的概念,它的编织方式和不同的风格(cglib vs aspectj),但它对我的说法并不完全直观。

@Component意味着给定的类将是给定上下文中的单例,@ Aspect意味着在运行时/编译期间,方面类的内容将以某种方式编织到目标类中 - 并且此目标类不是单例但是例如原型。那么我最后会得到什么呢?

2 个答案:

答案 0 :(得分:3)

Spring AOP不进行编译时编织,也不修改建议目标的代码。相反,它适用于在连接点周围编织的代理。这就是为什么Spring AOP方面被用作(单例)组件,使其字段自动装配等,就像任何其他Spring代理一样。

这也是Spring AOP方面仅适用于公共方法执行而不是字段访问等的原因。

文档编写得非常好,并且可以根据需要尽可能多地(或尽可能少)详细说明: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html

答案 1 :(得分:1)

“AspectJ in Action”第2.5节中的书是关于编织步骤的内部工作,它只有2页,但很好地说明了这一点。

幸运的是,该部分可用here

这是为了后代。