Spring container initialize all the beans registered in the bean configuration file at the time of context start up. When application starts first time all beans are initiated. This helps container to search dependencies are exist or not at the time of application starts-up. Spring also provides lazy-initialized beans feature.
Following are some drawbacks of the lazy initialization :
- Application takes long time to start-up because BeanFactory needs to initialize all beans.
- Takes more memory to hold the bean objects.
So Spring Framework provides the feature to explicitly on or off the lazy initialization. Spring has attribute called lazy-init which inform the SpringIOC container that need to create a bean at the time of start up or not. There are two scenarios :
- lazy-init = true (When request is received bean will initialized)
- lazy-init = false (At the time of spring container initialization Bean will initialized )
Example of lazy-init in Spring:
Person.java
package com.evon.example.lazyInitializeBean;
public class Person {
private int id;
private String Name;
private Address address;
Person(){
System.out.println("Person class is initialized.");
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
Address.java
package com.evon.example.lazyInitializeBean;
public class Address {
private String city;
private String country;
Address(){
System.out.println("Address class initialization.");
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
}
bean.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"
xmlns:c="http://www.springframework.org/schema/c"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="personBean" class="com.evon.example.lazyInitializeBean.Person" lazy-init="true"/>
<bean id="addressBean" class="com.evon.example.lazyInitializeBean.Address"/>
</beans>
Main.java
package com.evon.example.lazyInitializeBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class Main {
public static void main(String[] args) {
System.out.println("Container Starting...");
ApplicationContext context = new FileSystemXmlApplicationContext("/src/main/java/com/evon/example/lazyInitializeBean/bean.xml");
System.out.println("Container Started...");
Person person = (Person) context.getBean("personBean");
}
}
Output:
Container Starting...
Jan 20, 2015 12:01:08 PM [/home/sumit/findnerd/blogs/CoreExamples/src/main/java/com/evon/example/lazyInitializeBean/bean.xml]
Jan 20, 2015 12:01:08 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@d92bd2: defining beans [personBean,addressBean]; root of factory hierarchy
This is Address initialization.
Container Started...
This is Person initialization.
We can see in above example, the Person bean is configured as lazy-init=true. So when program runs, the Address bean is initialized at the time of container start up, but Person bean is initialized at the time of user requested for the bean using getBean() method.
0 Comment(s)