java - @Lazy 注解和lazy-init 属性有什么区别标签?
问题描述
根据我的理解,标签的@Lazy 注释和lazy-init 属性应该具有相同的功能。但是当我开发以下代码时,它显示出不同的行为。在下面的代码中,我期待:-(循环依赖错误)
org.springframework.beans.factory.BeanCurrentlyInCreationException
我已经使用@Lazy 注释附加了代码,根据我的期望,它不应该允许循环依赖。
@Component
public class A {
private B b;
@Autowired
public A(@Lazy B b) {
System.out.println("A.A() - 1-param Constructor");
this.b = b;
}
}
@Component
public class B {
private A a;
@Autowired
public B(A a) {
System.out.println("B.B() - 1-param Constructor");
this.a = a;
}
}
主要课程:
public class AnnotationApp{
public static void main(String[] args){
ApplicationContext ctx = new ClassPathXmlApplicationContext("com/ry/cfgs/annotationAppContext.xml");
B objB = ctx.getBean("b", B.class);
A objA = ctx.getBean("a", A.class);
}
}
弹簧配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<context:component-scan base-package="com.ry.beans.annotation"></context:component-scan>
</beans>
输出 :-
AA() - 1 参数构造函数
BB() - 1 参数构造函数
需要解释,为什么会这样?
解决方案
来自Spring 框架文档:
...您还可以将注释放在标有或
@Lazy
的注入点上。在这种情况下,它会导致延迟解析代理的注入。@Autowired
@Inject
因此,在以下代码中:
@Autowired
public A(@Lazy B b) {
// ...
}
b
将在首次访问时而不是在启动时注入(自动装配)。
现在,如果您将代码更改为以下内容:
@Autowired
public A(@Lazy B b) {
System.out.println("A.A() - 1-param Constructor");
System.out.println(b.toString());
this.b = b;
}
你会看到它org.springframework.beans.factory.BeanCurrentlyInCreationException
被抛出。