Circular dependencies in Spring

In this post, we will discuss one of the most asked Spring interview questions. What happens if there are circular dependencies in Spring.

Problem

What if there are circular dependencies in Spring?
For example: Class A requires an instance of Class B and Class B requires an instance of Class A.

Let’s create an example for the same.
1. Create a simple java maven project.
2. Maven dependency
put spring and cglib maven dependency in pom.xml.

💻 Awesome Tech Resources:
  • Looking for ⚒️ tech jobs? Go to our job portal.
  • Looking for tech events? Go to tech events 🗓️ Calendar.️

So your pom.xml will look like:

3. Create Bean class

Create a bean class called A.java in package org.arpit.java2blog .
Create another bean class called B.java in package org.arpit.java2blog. This class will have dependency to above A.java .

4. ApplicationContext.xml
Create ApplicationContext.xml in src/main/resources as below.

Please note that we are using Contructor injection to inject dependencies here.
5. Create CircularDependencyMain.java

6. Run it
When you run above program, you will get below output.

Jun 15, 2018 11:21:58 AM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
INFO: Refreshing org[email protected]31cefde0: startup date [Fri Jun 15 11:21:58 IST 2018]; root of context hierarchy
Jun 15, 2018 11:21:58 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [ApplicationContext.xml] Exception in thread “main” org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘a’ defined in class path resource [ApplicationContext.xml]: Cannot resolve reference to bean ‘b’ while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘b’ defined in class path resource [ApplicationContext.xml]: Cannot resolve reference to bean ‘a’ while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name ‘a’: Requested bean is currently in creation: Is there an unresolvable circular reference?
.
.
.
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘b’ defined in class path resource [ApplicationContext.xml]: Cannot resolve reference to bean ‘a’ while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name ‘a’: Requested bean is currently in creation: Is there an unresolvable circular reference?
.
.
.

As you can see, we are getting BeanCurrentlyInCreationException.Requested bean is currently in creation: Is there an unresolvable circular reference?

Solution

There are many solution to this problem.

Redesign

Can you redesign your classes to avoid circular dependencies. Circular dependencies are bad and should be avoided if possible at all. There are very rare situations where circular dependencies can not be avoid.

Setter injection

If you use Setter injection instead of Constructor injection to solve Circular dependencies in Spring, there won’t be any issue.
Let’s change the above example and try Setter injection.
Update A.java

Update B.java

Update ApplicationContext.xml

Run CircularDependencyMain again
Output

Jun 15, 2018 11:35:26 AM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
INFO: Refreshing org[email protected]31cefde0: startup date [Fri Jun 15 11:35:26 IST 2018]; root of context hierarchy
Jun 15, 2018 11:35:26 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [ApplicationContext.xml] Doing some work
Jun 15, 2018 11:35:26 AM org.springframework.context.support.ClassPathXmlApplicationContext doClose
INFO: Closing org[email protected]31cefde0: startup date [Fri Jun 15 11:35:26 IST 2018]; root of context hierarchy

@Lazy with @Autowired annotation

You use @Lazy with @Autowired to solve circular dependencies in Spring.
Let’s change the above example and try with @Lazy annotation.
Update A.java
Please note that we have used @Autowired and @Lazy annotations here.

Update B.java

Update ApplicationContext.xml

Run CircularDependencyMain again
Output

Jun 15, 2018 11:35:26 AM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
INFO: Refreshing org[email protected]31cefde0: startup date [Fri Jun 15 11:35:26 IST 2018]; root of context hierarchy
Jun 15, 2018 11:35:26 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [ApplicationContext.xml] Doing some work
Jun 15, 2018 11:35:26 AM org.springframework.context.support.ClassPathXmlApplicationContext doClose
INFO: Closing org[email protected]31cefde0: startup date [Fri Jun 15 11:35:26 IST 2018]; root of context hierarchy

As you can see, program works fine with @Lazy annotation as well.

@PostConstruct with @Autowired annotation

You use @PostConstruct with @Autowired to solve circular dependencies in Spring.
Let’s change the above example and try Setter injection.
Update A.java
Please note that we have used @PostConstruct and @Autowired annotations here.

Update B.java

Update ApplicationContext.xml

Run CircularDependencyMain again
Output

Jun 15, 2018 11:35:26 AM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
INFO: Refreshing org[email protected]31cefde0: startup date [Fri Jun 15 11:35:26 IST 2018]; root of context hierarchy
Jun 15, 2018 11:35:26 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [ApplicationContext.xml] Doing some work
Jun 15, 2018 11:35:26 AM org.springframework.context.support.ClassPathXmlApplicationContext doClose
INFO: Closing org[email protected]31cefde0: startup date [Fri Jun 15 11:35:26 IST 2018]; root of context hierarchy

As you can see, program works fine with @PostContruct annotation as well.

Thats’s all about Circular dependencies in Spring.
For more questions, refer Spring interview questions.


import_contacts

You may also like:

Related Posts

  • 24 June

    No qualifying bean of type in Spring or Spring Boot

    In this post, we will see about an exception: No qualifying bean of type. Exceptions are least expected but you might get it while working with Spring. or Spring boot. Did you get this exception: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type? If yes, let’s see different reasons for it. 💻 Awesome Tech Resources: Looking for […]

  • 17 June

    Spring XML configuration example

    In this post, we will see how to create Spring hello world XML based configuration example. Here are simple steps to create Spring XML configuration example. 1. Create a simple java maven project. 2. Maven dependency put spring and cglib maven dependency in pom.xml. 💻 Awesome Tech Resources: Looking for ⚒️ tech jobs? Go to our […]

  • 15 June

    Injecting Prototype bean into a Singleton bean in Spring

    In this post, we will see how to inject prototype bean scope into Singleton Instance in Spring. This is one of the most asked Spring interview questions. Problem When you inject prototype bean to singleton bean, prototype bean still behave like a singleton bean. Let’s understand this with the help of example. 1. Create a […]

  • 12 September

    Spring init-method and destroy-method example

    In this post, we will see about Spring init-method and destroy-method. When bean is instantiated or destroyed , there are some operations you may need to perform, so you can use init-method and destroy-method to call this methods while bean is being created or destroyed. Lets understand it with the help of simple example: For […]

  • 27 July

    Prefix “context” for element “context:component-scan” or “context:annotation-config” is not bound : Spring error

    When you are working on spring or spring mvc application, you may encounter below error message. org.xml.sax.SAXParseException: The prefix “context” for element “context:component-scan” is not bound . or org.xml.sax.SAXParseException: The prefix “context” for element “context:annotation-config” is not bound . This issue generally occurs when you do not include context namespace. For example: Lets say you have below […]

  • 26 July

    How to load multiple Spring configuration files

    In this post , we will see how to load multiple spring bean configuration files. Sometimes, you have multiple spring bean configuration file , you may have different configuration file for service, different for business object. When you are working on complex application, it is not good practice to have only single xml configuration, you […]

Leave a Reply

Your email address will not be published. Required fields are marked *

Subscribe to our newletter

Get quality tutorials to your inbox. Subscribe now.