This is probably the most easy and straightforward option. In circular dependency, if constructor injection creates a circular reference, you can defer the DI in the setter method. This allows Spring to load a bean context without any issues. The updated code would be as follows:
@Component("employee")
public class Employee {
private HRService hrService;
@Autowired
public void setHrService(HRService hrService) {
this.hrService = hrService;
System.out.println(" HRService dependency is set ");
}
}
@Component("hrService")
public class HRService {
private CommonUtilService commonUtilService;
@Autowired
public void setCommonUtilService(CommonUtilService commonUtilService) {
this.commonUtilService = commonUtilService;
System.out.println(" CommonUtilService dependency is set ");
}
}
@Component("commonUtilService")
public class CommonUtilService {
private Employee employee;
@Autowired
public void setEmployee(Employee employee) {
this.employee = employee;
System.out.println(" Employee dependency is set ");
}
}
All dependencies are set in the setter method with the @Autowired annotation. Spring will create instances of all three beans first and will then set them with the setter method.
Setting the @Autowired annotation on fields of the bean is equivalent to setter injection. If you annotate the fields of the class with the @Autowired annotation, Spring will not complain about circular dependency.