Spring循环依赖

发布时间 2023-12-15 23:18:59作者: 轻寒

Java中的循环依赖分两种:

构造器的循环依赖:就是在构造器中有属性循环依赖,如下所示的两个类就属于构造器循环依赖

@Service
public class Student {

    @Autowired
    private Teacher teacher;

    public Student (Teacher teacher) {
        System.out.println("Student init1:" + teacher);
    }

    public void learn () {
        System.out.println("Student learn");
    }
}

@Service
public class Teacher {

    @Autowired
    private Student student;

    public Teacher (Student student) {
        System.out.println("Teacher init1:" + student);

    }

    public void teach () {
        System.out.println("teach:");
        student.learn();
    }
}

这两个类都是定义了一个有参构造方法,所以Spring实例化的时候只能选取该构造方法了,这就意味着实例化的时候会尝试进行依赖注入。

这种循环依赖没有什么解决办法,因为JVM虚拟机在对类进行实例化的时候,需先实例化构造器的参数,而由于循环引用这个参数无法提前实例化,故只能抛出错误。

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException....

属性的循环依赖:就是A对象依赖了B对象,B对象依赖了A对象。

@Service
public class Teacher {

    @Autowired
    private Student student;

    public Teacher () {
        System.out.println("Teacher init1:" + student);

    }

    public void teach () {
        System.out.println("teach:");
        student.learn();
    }

}

@Service
public class Student {

    @Autowired
    private Teacher teacher;

    public Student () {
        System.out.println("Student init:" + teacher);
    }

    public void learn () {
        System.out.println("Student learn");
    }
}

两个类都只有默认的无参构造,所以实例化的时候不会主动进行依赖注入,只能按照@Autowired注解去注入属性了。 @Autowired注解注入也就相当于是setter注入了,这是即使发生了循环依赖,Spring也是可以解决的。