I have written a simple JUnit test to see the difference between prototype and singleton.
I have created two empty classes, both of them implementing the empty interface Scoping:
@Component
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
public class UniqueThing implements Scoping {
}
@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class Notepad implements Scoping {
}
The SCOPE_SINGLETON scope is the default, so usually you won't see it explicitly set in production code. Here is just to remark its existence.The class Notepad, marked with SCOPE_PROTOTYPE is the interesting stuff.
This is what normally happens with beans:
@Test
public void testSingleton() {
UniqueThing thing1 = context.getBean(UniqueThing.class);
UniqueThing thing2 = context.getBean(UniqueThing.class);
assertSame(thing1, thing2);
}
When I get a bean - here I get them through the Spring application context - the same bean is returned.But if the bean is marked as SCOPE_PROTOTYPE, we have a different behavior:
@Test
public void testPrototype() {
Notepad notepad1 = context.getBean(Notepad.class);
Notepad notepad2 = context.getBean(Notepad.class);
assertNotSame(notepad1, notepad2);
}
Each bean is a newly created one!Reference: Advanced wiring, from Spring in Action, Fourth Edition by Craig Walls. Chapter three, section four, Scoping beans.
I pushed the code I created on GitHub, see the scoping package and the associated JUnit test case.
No comments:
Post a Comment