Enjoying This Tutorial?
Subscribe to Ram N Java for high-quality, practical Java and Spring tutorials!
SUBSCRIBE NOWIntroduction
In the Spring Framework, bean scopes define the lifecycle, visibility, and instantiation behavior of beans managed inside the Spring IoC container. The default and most fundamental scope is the Singleton scope. Understanding how the container creates, caches, and supplies singleton beans is essential for developing performant and reliable Spring applications.
What Is Singleton Scope in Spring?
- One Instance Per Container: Unlike the Gang of Four (GoF) singleton pattern (which enforces one instance per ClassLoader), Spring creates exactly one shared instance per
ApplicationContext. - Shared and Cached: When the container starts, it creates the singleton instance and places it into an internal cache. Every subsequent lookup or injection returns that identical instance.
- Default Behavior: If you omit the
scopeattribute in your XML bean definition, Spring automatically treats the bean as a singleton.
Step-by-Step Configuration Example
Here is how you configure and test a singleton bean using Spring XML configuration:
1. Declaring the Bean in applicationContext.xml
<!-- scope="singleton" can be explicitly set or omitted -->
<bean id="welcomeService"
class="com.ram.service.WelcomeService"
scope="singleton">
<property name="message" value="Welcome to Spring!" />
</bean>
2. Verifying Single Shared Reference in Java
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
WelcomeService service1 = (WelcomeService) context.getBean("welcomeService");
WelcomeService service2 = (WelcomeService) context.getBean("welcomeService");
// Both point to the exact same object reference
System.out.println("Are beans identical? " + (service1 == service2)); // true
System.out.println("Hash code 1: " + service1.hashCode());
System.out.println("Hash code 2: " + service2.hashCode());
Key Takeaway
Singleton beans are best suited for stateless components such as service layers, repositories, and controllers. Because multiple threads concurrently access the single shared instance, avoid storing client-specific mutable state within singleton beans.
Click here to watch on Youtube:
https://www.youtube.com/watch?v=4dYXQJxTGjM&list=UUhwKlOVR041tngjerWxVccw
Click the below Image to Enlarge:
| Spring Singleton scope |
| Spring Singleton scope |
pom.xml
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0%20http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ram.core</groupId>
<artifactId>SpringDemo</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>SpringDemo</name>
<url>http://maven.apache.org</url>
<properties>
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- Spring 5 dependencies -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
</project>
Employee.java
public class Employee
{
private String name;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
@Override
public String toString()
{
return "Employee [name=" + name + "]";
}
}
applicationContext.xml
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
<bean id="employee" class="com.ram.model.Employee">
</bean>
</beans>
App.java
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.ram.model.Employee;
public class App
{
public static void main(String[] args)
{
ApplicationContext context = new ClassPathXmlApplicationContext(
"applicationContext.xml");
System.out.println("-------------------------------------------");
Employee employee1 = (Employee) context.getBean("employee");
employee1.setName("John");
System.out.println(
"Got employee object from the ApplicationContext(Spring Container)");
System.out.println(employee1);
System.out.println("-------------------------------------------");
Employee employee2 = (Employee) context.getBean("employee");
System.out.println(
"Got employee object from the ApplicationContext(Spring Container)");
System.out.println(employee2);
}
}
Output
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@5b37e0d2: startup date [Sat Jul 21 08:24:17 IST 2018]; root of context hierarchy
Jul 21, 2018 8:24:18 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
-------------------------------------------
Got employee object from the ApplicationContext(Spring Container)
Employee [name=John]
-------------------------------------------
Got employee object from the ApplicationContext(Spring Container)
Employee [name=John]
Click the below link to download the code:
https://sites.google.com/site/ramj2eev2/java_basics/SpringDemo_singleton_scope.zip?attredirects=0&d=1
Github Link:
https://github.com/ramram43210/javaee/tree/master/Spring_2018/SpringDemo_singleton_scope
Bitbucket Link:
https://bitbucket.org/ramram43210/spring/src/764179f1702395ebc0d4ce50fe5125258c342eb8/Spring_2018/SpringDemo_singleton_scope/?at=master
See also:
Its very good explanation and easy to learn java concepts very clearly..Thanks for making video's.
ReplyDeleteI am requesting please make videos on micro services