首页 > 解决方案 > @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 参数构造函数

需要解释,为什么会这样?

标签: javaspringcircular-dependencyspring-annotationsspring-bean

解决方案


来自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被抛出。


推荐阅读