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