This example shows how to successfully use circular dependencies in Spring by using @Lazy annotation at injection point. Spring uses a proxy instead of the real object at the injection point. This proxy delays the initialization of the underlying object until it is first used. This is the preferable way to handle circular dependencies in Spring.
Examples
Bean with circular dependencies
We need to use @Lazy only with one bean.
package com.logicbig.example;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
@Component
public class Car {
private final Driver driver;
public Car(@Lazy Driver driver) {
this.driver = driver;
}
public void drive() {
System.out.println("driven by: " + driver);
}
}
package com.logicbig.example;
import org.springframework.stereotype.Component;
@Component
public class Driver {
private final Car car;
public Driver(Car car) {
this.car = car;
}
public void showCar() {
System.out.println("my car: " + car);
}
}
Main class
package com.logicbig.example;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
@ComponentScan
@Configuration
public class ExampleMain {
@Autowired
private Car car;
@Autowired
private Driver driver;
@PostConstruct
public void postConstruct() {
car.drive();
driver.showCar();
}
public static void main(String[] args) {
new AnnotationConfigApplicationContext(ExampleMain.class);
}
}
Output
driven by: com.logicbig.example.Driver@5b65f8e1 my car: com.logicbig.example.Car@69a9f050
Example Project
Dependencies and Technologies Used:
spring-context 5.3.12 (Spring Context) Version Compatibility: 4.3.0.RELEASE - 5.3.12Version List
×
Version compatibilities of spring-context with this example:
4.3.0.RELEASE
4.3.1.RELEASE
4.3.2.RELEASE
4.3.3.RELEASE
4.3.4.RELEASE
4.3.5.RELEASE
4.3.6.RELEASE
4.3.7.RELEASE
4.3.8.RELEASE
4.3.9.RELEASE
4.3.10.RELEASE
4.3.11.RELEASE
4.3.12.RELEASE
4.3.13.RELEASE
4.3.14.RELEASE
4.3.15.RELEASE
4.3.16.RELEASE
4.3.17.RELEASE
4.3.18.RELEASE
4.3.19.RELEASE
4.3.20.RELEASE
4.3.21.RELEASE
4.3.22.RELEASE
4.3.23.RELEASE
4.3.24.RELEASE
4.3.25.RELEASE
4.3.26.RELEASE
4.3.27.RELEASE
4.3.28.RELEASE
4.3.29.RELEASE
4.3.30.RELEASE
5.0.0.RELEASE
5.0.1.RELEASE
5.0.2.RELEASE
5.0.3.RELEASE
5.0.4.RELEASE
5.0.5.RELEASE
5.0.6.RELEASE
5.0.7.RELEASE
5.0.8.RELEASE
5.0.9.RELEASE
5.0.10.RELEASE
5.0.11.RELEASE
5.0.12.RELEASE
5.0.13.RELEASE
5.0.14.RELEASE
5.0.15.RELEASE
5.0.16.RELEASE
5.0.17.RELEASE
5.0.18.RELEASE
5.0.19.RELEASE
5.0.20.RELEASE
5.1.0.RELEASE
5.1.1.RELEASE
5.1.2.RELEASE
5.1.3.RELEASE
5.1.4.RELEASE
5.1.5.RELEASE
5.1.6.RELEASE
5.1.7.RELEASE
5.1.8.RELEASE
5.1.9.RELEASE
5.1.10.RELEASE
5.1.11.RELEASE
5.1.12.RELEASE
5.1.13.RELEASE
5.1.14.RELEASE
5.1.15.RELEASE
5.1.16.RELEASE
5.1.17.RELEASE
5.1.18.RELEASE
5.1.19.RELEASE
5.1.20.RELEASE
5.2.0.RELEASE
5.2.1.RELEASE
5.2.2.RELEASE
5.2.3.RELEASE
5.2.4.RELEASE
5.2.5.RELEASE
5.2.6.RELEASE
5.2.7.RELEASE
5.2.8.RELEASE
5.2.9.RELEASE
5.2.10.RELEASE
5.2.11.RELEASE
5.2.12.RELEASE
5.2.13.RELEASE
5.2.14.RELEASE
5.2.15.RELEASE
5.2.16.RELEASE
5.2.17.RELEASE
5.2.18.RELEASE
5.3.0
5.3.1
5.3.2
5.3.3
5.3.4
5.3.5
5.3.6
5.3.7
5.3.8
5.3.9
5.3.10
5.3.11
5.3.12
Versions in green have been tested.
JDK 8
Maven 3.8.1
Spring example of avoiding circular dependencies error via @Lazy