Enjoying This Tutorial?
Subscribe to Ram N Java for high-quality, practical Java and Spring tutorials!
SUBSCRIBE NOWIntroduction
In the Spring Framework, Singleton scope is the default lifecycle management behavior for all beans. When a bean is defined with singleton scope, the Spring IoC container creates exactly one shared instance of that bean per Spring container context. Every time the bean is requested or injected, Spring supplies that same shared cached instance.
Why Use Singleton Scope?
- Memory Efficiency: Only a single object instance is allocated in memory throughout the lifetime of the application context.
- Stateless Services & Repositories: Perfect for service classes, DAO components, and utilities that do not store state specific to a particular user or thread.
- Explicit Annotation Clarity: While singleton is default, explicitly annotating with
@Scope("singleton")documents your design intent clearly for team members.
Step-by-Step Configuration with Annotations
You can declare a singleton bean cleanly by decorating your class with @Component (or @Service / @Repository) and @Scope("singleton"):
1. Declaring the Singleton Bean
package com.ram.service;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component
@Scope("singleton")
public class UserService {
public void printStatus() {
System.out.println("Executing from singleton instance: " + this.hashCode());
}
}
2. Verifying Single Shared Instance
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
UserService service1 = context.getBean(UserService.class);
UserService service2 = context.getBean(UserService.class);
// Returns true because both references point to the exact same memory address
System.out.println("Are beans identical? " + (service1 == service2));
Key Takeaway
Singleton beans should remain stateless or thread-safe because they are concurrently accessed across multiple application requests. If your bean requires mutable user state, consider switching to prototype scope or web-aware scopes.
Click here to watch on Youtube:
https://www.youtube.com/watch?v=9p-Kv84R1Bk&list=UUhwKlOVR041tngjerWxVccw
Click the below Image to Enlarge:
| Spring bean Singleton scope using annotation |
| Spring bean Singleton scope using annotation |
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
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component
@Scope("singleton")
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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd">
<context:component-scan base-package="com.ram.model" />
</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 [Sun Jul 22 13:33:14 IST 2018]; root of context hierarchy
Jul 22, 2018 1:33:14 PM 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_annotation.zip?attredirects=0&d=1
Github Link:
https://github.com/ramram43210/javaee/tree/master/Spring_2018/SpringDemo_singleton_scope_annotation
Bitbucket Link:
https://bitbucket.org/ramram43210/spring/src/e1b6e4c3fbeda148bbe23a5cd92f521a01e39305/Spring_2018/SpringDemo_singleton_scope_annotation/?at=master
See also: