About Spring bean scope attributes
As we aware of that the beans configured in the
spring beans XML configuration file are instantiated and managed by spring
container. Spring also allows configuring each particular bean scope that
satisfies the requirement. From spring version 2.0, it supports five built-in
scopes Out of which three spring bean scopes are supported only in web
ApplicationContext.
Bean scopes:-
singleton – This is the default scope used by the
spring Ioc container. If we use this scope attribute then it returns a single
bean instance per Spring IoC container. If no scope is defined in bean
configuration file, then the default bean scope is set to singleton.
prototype – It means not singleton, returns a new
bean instance each time when requested or referenced.
request – This scope is valid only when using a web
aware spring ApplicationContext. If specified then this attribute will help to
return a single bean instance per HTTP request.
session – This scope is also valid only when using a
web aware spring ApplicationContext. If specified then this attribute will help
to return a single bean instance per HTTP session. Then the bean scoped with a
session is shared between all the session’s requests.
globalSession – This scope is also valid only when
using a web aware spring ApplicationContext. If specified then this attribute
will help to return a single bean instance per global HTTP session. This scope
has importance only in context of portal-based web applications and it is mainly
related to Portlet applications. Each portlet has its own session but if we
want to store variables globally for all portlets in our applications then we
can use globalSession scope attribute. According to portlet specification, the
conception of a global session is that it is shared among all of the various
portlets that make up a single portlet web application. Beans defined with the
help of global session attribute scope are bound or scoped to the lifetime of
the global portlet Session.
Note: - As we know that three spring bean scopes are
supported only in web ApplicationContext So If we use these scopes with Spring
IoC container such as the ClassPathXmlApplicationContext, then IllegalStateException
will be thrown at runtime complaining that
No Scope registered for scope 'scope
attribute'. In the following way we can use the scope attributes.
Example: - <bean id="kidsBean" class="com.spring.gaurav.constructorinjection.example.Kids"
scope="prototype">
</bean>
Example of Bean Scope attribute:-
System Requirements:-
- Eclipse Editor or any other.
- JDK 1.5 or higher(I am using jdk 1.7.0_03)
- Spring jars.
Required Jars are:-
- spring-core.jar
- spring-2.5.jar
- spring-beans.jar
- spring-context.jar
- commons-logging.jar
- dom4j-1.4.jar
- antlr.jar
- log4j.jar
Steps for creating
Eclipse java project for implementing spring bean scopes:-
- Create a java project in eclipse.
- Create a package in the src folder with the name as com.spring.gaurav.beanscope.test.singleton.example.
- Create the below files in this package and place the corresponding code in those files.
- Create an XML file and name it as beanscope-test-singleton-beans.xml and place this file in the classpath outside the srcfolder.
- Execute the BeanScopeSingletonTestClient.java by selecting the option Run as Java Application.
Singleton Scope attribute example:-
Country.java
package
com.spring.gaurav.beanscope.test.singleton.example;
public class
Country {
private
String countryName;
private
String primeMinisterName;
public
String getCountryName() {
return
countryName;
}
public
void setCountryName(String countryName) {
this.countryName
= countryName;
}
public
String getPrimeMinisterName() {
return
primeMinisterName;
}
public
void setPrimeMinisterName(String primeMinisterName) {
this.primeMinisterName
= primeMinisterName;
}
}
beanscope-test-singleton-beans.xml
<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="countryBean" class="com.spring.gaurav.beanscope.test.singleton.example.Country"
/>
</beans>
BeanScopeSingletonTestClient.java
package
com.spring.gaurav.beanscope.test.singleton.example;
import
org.springframework.context.ApplicationContext;
import
org.springframework.context.support.ClassPathXmlApplicationContext;
public class
BeanScopeSingletonTestClient {
public
static void main(String args[]) {
ApplicationContext
context = new ClassPathXmlApplicationContext(
"beanscope-test-singleton-beans.xml");
Country
country1 = (Country) context.getBean("countryBean");
country1.setCountryName("MAURITIUS(REPUBLIC
OF MAURITIUS)");
country1.setPrimeMinisterName("MR.
NAVINCHANDRA RAMGOOLAM");
//
Requesting first time to retrieve the bean class property value
System.out.println("COUNTRY
NAME IS :- " + country1.getCountryName()
+
" \nCOUNTRY PRIME MINISTER IS :- "
+
country1.getPrimeMinisterName());
System.out.println("****************************************************************");
System.out.println("REQUESTING
SECOND TIME TO RETRIEVE THE BEAN CLASS PROPERTY VALUE");
Country
country2 = (Country) context.getBean("countryBean");
//
Requesting second time to retrieve the bean class property value
System.out.println("COUNTRY
NAME IS :- " + country2.getCountryName()
+
" \nCOUNTRY PRIME MINISTER IS :- "
+
country2.getPrimeMinisterName());
}
}
/**
* Note:- As I have not declared scope
attribute in
* "beanscope-test-singleton-beans.xml"
XML configuration file, so the default
* singleton scope attribute is taken. As I
requested two time but I got the
* same property values for the bean class. So
we can conclude that we have
* single bean instance by default.
*/
Result:-
log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext).
log4j:WARN Please initialize the log4j system properly.
COUNTRY NAME IS :- MAURITIUS(REPUBLIC OF MAURITIUS)
COUNTRY PRIME MINISTER IS :- MR. NAVINCHANDRA RAMGOOLAM
****************************************************************
REQUESTING SECOND TIME TO RETRIEVE THE BEAN CLASS PROPERTY VALUE
COUNTRY NAME IS :- MAURITIUS(REPUBLIC OF MAURITIUS)
COUNTRY PRIME MINISTER IS :- MR. NAVINCHANDRA RAMGOOLAM
log4j:WARN Please initialize the log4j system properly.
COUNTRY NAME IS :- MAURITIUS(REPUBLIC OF MAURITIUS)
COUNTRY PRIME MINISTER IS :- MR. NAVINCHANDRA RAMGOOLAM
****************************************************************
REQUESTING SECOND TIME TO RETRIEVE THE BEAN CLASS PROPERTY VALUE
COUNTRY NAME IS :- MAURITIUS(REPUBLIC OF MAURITIUS)
COUNTRY PRIME MINISTER IS :- MR. NAVINCHANDRA RAMGOOLAM
Prototype Scope attribute example:-
Steps for creating
Eclipse java project for implementing constructor dependency injection:-
- Create a java project in eclipse.
- Create a package in the src folder with the name as com.spring.gaurav.beanscope.test.prototype.example.
- Create the below files in this package and place the corresponding code in those files.
- Create an XML file and name it as beanscope-test-prototype-beans.xml and place this file in the classpath outside the srcfolder.
- Execute the BeanScopePrototypeTestClient.java by selecting the option Run as Java Application.
Note: - In this example also I am using the same country bean class which is available above.
beanscope-test-prototype-beans.xml
<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="countryBean" class="com.spring.gaurav.beanscope.test.prototype.example.Country"
scope="prototype"/>
</beans>
BeanScopePrototypeTestClient.java
package
com.spring.gaurav.beanscope.test.prototype.example;
import
org.springframework.context.ApplicationContext;
import
org.springframework.context.support.ClassPathXmlApplicationContext;
public class BeanScopePrototypeTestClient {
public
static void main(String args[]) {
ApplicationContext
context = new ClassPathXmlApplicationContext(
"beanscope-test-prototype-beans.xml");
Country
country1 = (Country) context.getBean("countryBean");
country1.setCountryName("KINGDOM
OF BHUTAN");
country1.setPrimeMinisterName("MR.
JIGME YOSER THINLEY");
//
Requesting first time to retrieve the bean class property value
System.out.println("COUNTRY
NAME IS :- " + country1.getCountryName()
+
" \nCOUNTRY PRIME MINISTER IS :- "
+
country1.getPrimeMinisterName());
System.out
.println("****************************************************************");
System.out
.println("REQUESTING
SECOND TIME TO RETRIEVE THE BEAN CLASS PROPERTY VALUE");
Country
country2 = (Country) context.getBean("countryBean");
//
Requesting second time to retrieve the bean class property value
System.out.println("COUNTRY
NAME IS :- " + country2.getCountryName()
+
" \nCOUNTRY PRIME MINISTER IS :- "
+
country2.getPrimeMinisterName());
}
}
/**
* Note:- As I have declared scope attribute as
prototype in
*
"beanscope-test-prototype-beans.xml" XML configuration file, and I
requested
* two time and got different property values
for the bean class. So we can
* conclude that it returns a new bean instance
each time when requested or
* referenced.
*/
Result:-
log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext).
log4j:WARN Please initialize the log4j system properly.
COUNTRY NAME IS :- KINGDOM OF BHUTAN
COUNTRY PRIME MINISTER IS :- MR. JIGME YOSER THINLEY
****************************************************************
REQUESTING SECOND TIME TO RETRIEVE THE BEAN CLASS PROPERTY VALUE
COUNTRY NAME IS :- null
COUNTRY PRIME MINISTER IS :- null
Back to Interview Questions
No comments:
Post a Comment