【发布时间】:2019-06-17 14:03:28
【问题描述】:
Spring 使用 JDK 动态代理或 CGLIB 为给定的目标对象创建代理。如果一个类使用@Configuration 注解,则使用CGLIB。
然而,Spring AOP 的一个限制是,一旦调用最终到达目标对象,它可能对自身进行的任何方法调用都将针对 this 引用而不是代理调用。在使用 @Transactional 以及在其他地方时,记住这条信息很重要。
那么知道,在下面的代码中,Spring 是在注入实际实例还是SimpleBean 的代理?
@Configuration
public class Config {
@Bean
public SimpleBean simpleBean() {
return new SimpleBean();
}
@Bean
public SimpleBeanConsumer simpleBeanConsumer() {
return new SimpleBeanConsumer(simpleBean()); //<---
}
}
如果一个类被@Component注解,会有什么行为?
【问题讨论】:
-
应该差不多。
-
@EdwardAung 抱歉我没听明白。
-
使用
@Configuration,您将获得相同的代理对象。使用@Component,您在所谓的精简模式下运行,您将获得一个代理,但当多次调用simpleBean()时,您将获得一个新的代理实例。 -
@M.Deinum 这将是一个全新的副本,但不是代理,我认为。
-
它将被代理,应用相同的语义,但对方法的调用不会通过配置代理。
标签: spring spring-aop