【发布时间】:2021-03-03 10:16:03
【问题描述】:
我发现@Repository中的自引用不起作用,例如:
@Repository
public class HelloService {
static final Logger Log = LoggerFactory.getLogger(HelloService.class);
@Autowired
HelloService self; // <----- self reference
...
}
循环引用错误
o.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext - 上下文初始化期间遇到异常 - 取消刷新尝试:org.springframework.beans.factory.BeanCurrentlyInCreationException:创建名为“helloService”的bean时出错:名为“helloService”的bean已注入其他bean [helloService]在其原始版本中作为循环引用的一部分,但最终已被包装。这意味着所说的其他 bean 不使用 bean 的最终版本。这通常是过度渴望类型匹配的结果 - 例如,考虑使用 'getBeanNamesOfType' 并关闭 'allowEagerInit' 标志。
但是,当将 Repository 更改为 @Component 或 @Service 时,此技巧可能会起作用。作为一种解决方法,我必须在self 中添加一个@Lazy。
【问题讨论】:
-
为什么有人要这样做?
-
我们想使用
self通过代理对象而不是目标对象来访问AOP方法。尽管这可能是一个不好的做法,但它是一个非常简单的解决方案。