Sunday, 24 May 2015

Spring bean scopes

In Spring there are 5 types of scopes exist.

    1. singleton – Only one instance per spring conainer. This is the default behavior. This kind of     beans initialized, when the context being initialized.

    2. prototype – Return a new bean instance each time when requested.

    3. request – New bean per each servlet request.

    4. session – Return a single bean instance per HTTP session.

   5. globalSession – Return a single bean instance per global HTTP session.

In this post i am going to explain about both singleton and prototype scope beans.

Singleton Scope
Step 1 : Create new maven project “spring_tuorial”. Project structure looks like below.

Step 2 : Update “pom.xml” file for maven dependencies.

pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
 <modelVersion>4.0.0</modelVersion> 
 <groupId>spring_tutorial</groupId> 
 <artifactId>spring_tutorial</artifactId> 
 <version>0.0.1-SNAPSHOT</version> 
 <packaging>war</packaging> 
 <name>spring_tutorial</name> 
 <description>spring_tutorial</description> 
 <properties> 
  <org.springframework-version>4.1.5.RELEASE</org.springframework-version> 
 </properties> 

 <dependencies> 
  <dependency> 
   <groupId>org.springframework</groupId> 
   <artifactId>spring-context</artifactId> 
   <version>${org.springframework-version}</version> 
  </dependency> 

 </dependencies> 
</project>

Step 3: Create new package “com.springtutorial.model” under “src/main/java”.

Step 4: Create “Address” class under the package “com.springtutorial.model”.
package com.springtutorial.model; 

public class Address { 
  private String street; 
  private String city; 
  private String state; 
  private String country; 
  private String pin; 

  public String getStreet() { 
    return street; 
  } 

  public void setStreet(String street) { 
    this.street = street; 
  } 

  public String getCity() { 
    return city; 
  } 

  public void setCity(String city) { 
    this.city = city; 
  } 

  public String getState() { 
    return state; 
  } 

  public void setState(String state) { 
    this.state = state; 
  } 

  public String getCountry() { 
    return country; 
  } 

  public void setCountry(String country) { 
    this.country = country; 
  } 

  public String getPin() { 
    return pin; 
  } 

  public void setPin(String pin) { 
    this.pin = pin; 
  } 

  @Override 
  public String toString() { 
    StringBuilder builder = new StringBuilder(); 
    builder.append("Address [street=").append(street).append(", city=").append(city) 
        .append(", state=").append(state).append(", country=").append(country).append(", pin=") 
        .append(pin).append("]"); 
    return builder.toString(); 
  } 

} 


Step 5: Create “Employee” class under the package “com.springtutorial.model”.
package com.springtutorial.model; 

public class Employee { 
  private String firstName; 
  private String lastName; 
  private int id; 
  private Address address; 

  public String getFirstName() { 
    return firstName; 
  } 

  public void setFirstName(String firstName) { 
    this.firstName = firstName; 
  } 

  public String getLastName() { 
    return lastName; 
  } 

  public void setLastName(String lastName) { 
    this.lastName = lastName; 
  } 

  public int getId() { 
    return id; 
  } 

  public void setId(int id) { 
    this.id = id; 
  } 

  public Address getAddress() { 
    return address; 
  } 

  public void setAddress(Address address) { 
    this.address = address; 
  } 

  @Override 
  public String toString() { 
    StringBuilder builder = new StringBuilder(); 
    builder.append("Employee [firstName=").append(firstName).append(", lastName=").append(lastName) 
        .append(", id=").append(id).append(", address=").append(address).append("]"); 
    return builder.toString(); 
  } 

} 

Step 6: Create “spring.xml” file in “src/main/resources”.

spring.xml
<?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="employee1" class="com.springtutorial.model.Employee"> 
  <property name="firstName" value="Hari Krishna" /> 
  <property name="lastName" value="Gurram" /> 
  <property name="id" value="553" /> 
  <property name="address" ref="address" /> 
   
 </bean> 

 <bean id="address" class="com.springtutorial.model.Address"> 
  <property name="street" value="Chowdeswari temple" /> 
  <property name="city" value="Bangalore" /> 
  <property name="state" value="Karnataka" /> 
  <property name="country" value="India" /> 
  <property name="pin" value="560037" /> 
 </bean> 

</beans>

"spring.xml" is used to assign unique IDs to different beans, to control the creation of objects with different values. You have to make sure that “spring.xml” file is available in CLASSPATH and use the same name in main application while creating application context as shown in Main.java file.

Step 7 : Create package “com.springtutorial.main” under “src/main/java”.

Step 8 : Create Main class under package “com.springtutorial.main”.
package com.springtutorial.main; 

import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 

import com.springtutorial.model.Employee; 

public class Main { 
  public static void main(String args[]) { 
    ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); 
 
    Employee emp1 = (Employee) context.getBean("employee1"); 

    System.out.println(emp1); 
    
    emp1.setFirstName("Kiran Kumar"); 
    emp1.setLastName("Darsi"); 
    
    Employee emp2 = (Employee) context.getBean("employee1"); 
    
    System.out.println(emp2); 
  } 
} 


Step 9 : Run Main.java,you will get output like below.
Mar 23, 2015 10:33:25 PM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh 
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@6fa22b: startup date [Mon Mar 23 22:33:25 IST 2015]; root of context hierarchy 
Mar 23, 2015 10:33:25 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 
INFO: Loading XML bean definitions from class path resource [spring.xml] 
Employee [firstName=Hari Krishna, lastName=Gurram, id=553, address=Address [street=Chowdeswari temple, city=Bangalore, state=Karnataka, country=India, pin=560037]] 
Employee [firstName=Kiran Kumar, lastName=Darsi, id=553, address=Address [street=Chowdeswari temple, city=Bangalore, state=Karnataka, country=India, pin=560037]] 
Mar 23, 2015 10:33:25 PM org.springframework.context.support.ClassPathXmlApplicationContext doClose 
INFO: Closing org.springframework.context.support.ClassPathXmlApplicationContext@6fa22b: startup date [Mon Mar 23 22:33:25 IST 2015]; root of context hierarchy 

As you observe output, “emp2” reflects the changes that are updated by emp1. It is because, by default, the bean returned by spring is singleton.

Final project structure looks like below.

Prototype scope
By using “scope” attribue we can create prototype beans.

         <bean id="employee1" class="com.springtutorial.model.Employee" scope="prototype">
                  <property name="firstName" value="Hari Krishna" />
                  <property name="lastName" value="Gurram" />
                  <property name="id" value="553" />
         </bean>

Above snippet makes Employee bean as prototype. New Employee instance is returned, for every get bean request.


Update spring.xml like below and rerun Main.java.
<?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="employee1" class="com.springtutorial.model.Employee" scope="prototype"> 
  <property name="firstName" value="Hari Krishna" /> 
  <property name="lastName" value="Gurram" /> 
  <property name="id" value="553" /> 
  <property name="address" ref="address" /> 
   
 </bean> 

 <bean id="address" class="com.springtutorial.model.Address"> 
  <property name="street" value="Chowdeswari temple" /> 
  <property name="city" value="Bangalore" /> 
  <property name="state" value="Karnataka" /> 
  <property name="country" value="India" /> 
  <property name="pin" value="560037" /> 
 </bean> 

</beans>

Output looks like below.
Mar 23, 2015 10:32:00 PM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh 
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@6fa22b: startup date [Mon Mar 23 22:32:00 IST 2015]; root of context hierarchy 
Mar 23, 2015 10:32:00 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 
INFO: Loading XML bean definitions from class path resource [spring.xml] 
Employee [firstName=Hari Krishna, lastName=Gurram, id=553, address=Address [street=Chowdeswari temple, city=Bangalore, state=Karnataka, country=India, pin=560037]] 
Employee [firstName=Hari Krishna, lastName=Gurram, id=553, address=Address [street=Chowdeswari temple, city=Bangalore, state=Karnataka, country=India, pin=560037]] 
Mar 23, 2015 10:32:00 PM org.springframework.context.support.ClassPathXmlApplicationContext doClose 
INFO: Closing org.springframework.context.support.ClassPathXmlApplicationContext@6fa22b: startup date [Mon Mar 23 22:32:00 IST 2015]; root of context hierarchy 


Prevoius                                                 Next                                                 Home

No comments:

Post a Comment