Spring Singletons are not Java Singletons.
Spring.xml:
version="1.0"
encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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-3.0.xsd">
<bean id="scopeTest" class="com.example.scope.Scope" scope="singleton">
<property name="name" value="Shamik Mitra"/>
</bean>
<bean id="scopeTestDuplicate" class="com.example.scope.Scope" scope="singleton">
<property name="name" value="Samir Mitra"/>
</bean>
</beans>
Scope.java:
package com.example.scope;
public class Scope {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Scope [name=" + name + "]";
}
}
Main class:
package com.example.scope;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"configFiles/Scope.xml");
Scope
scope = (Scope) ctx.getBean("scopeTest");
Scope
scopeDuplicate = (Scope) ctx.getBean("scopeTestDuplicate");
System.out.println(scope == scopeDuplicate);
System.out.println(scope + "::" + scopeDuplicate);
}
}
Here, I create two beans of the Scope class and
make Spring Scope a singleton, now checking the references.
If we see the output of the program, we will
understand that it will return two different instances, So in a container,
there may be more than one object in spite of the fact that the Scope is the
singleton.
Output:
Reference Check ::false
Scope [name=Shamik Mitra]::Scope [name=Samir Mitra]
So, let's ask the question again. "What do you
mean by Spring Singleton Scope?"
According to the Spring documentation:
"When a bean is a singleton, only one shared
instance of the bean will be managed, and all requests for beans with an id or
ids matching that bean definition will result in that one specific bean
instance being returned by the Spring container.
To put it another way, when you define a bean
definition and it is scoped as a singleton, then the Spring IoC container will
create exactly one instance of the object defined by that bean definition. This
single instance will be stored in a cache of such singleton beans, and all
subsequent requests and references for that named bean will result in the
cached object being returned."
So it is clear that for a given id, a Spring
container maintains only one shared instance in a singleton cache.
In my example, I use two different ids (scopeTest
and ScopeTestDuplicate), so the Spring container creates two instances of the
same class and binds them with respective ids, then stores them in a Singleton
cache.
You can think of a Spring container as managing a
key-value pair, where the key is the id or name of the bean and the value is
the bean itself. So, for a given key, it maintains a Singleton. So if we use
that key as a reference to or of other beans, the same bean will be injected to
those other beans.
In summation, Spring guarantees exactly one shared
bean instance for the given id per IoC container, unlike Java Singletons, where
the Singleton hardcodes the scope of an object such that one and only one
instance of a particular class will ever be created per ClassLoader.
And we'll close on this picture taken from the
Spring docs.

Comments
Post a Comment