59

I am beginner to spring, ESP Inversion of control. I was puzzled understanding the difference between the following

 <bean id="demo" class="Demo" lazy-init="false"/>
 <bean id="demo" class="Demo" lazy-init="true"/>
 <bean id="demo" class="Demo" lazy-init="default"/>

To my understanding : lazy-init=false creates the bean at the startup and lazy-init=true doesn't create a bean at the startup rather creates the bean upon request for a particular bean. Correct me here, If my interpretation is wrong.

what exactly the default behavior of lazy-init is? How would it instantiate?

srk
  • 4,857
  • 12
  • 65
  • 109

5 Answers5

74

The default behaviour is false:

By default, ApplicationContext implementations eagerly create and configure all singleton beans as part of the initialization process. Generally, this pre-instantiation is desirable, because errors in the configuration or surrounding environment are discovered immediately, as opposed to hours or even days later. When this behavior is not desirable, you can prevent pre-instantiation of a singleton bean by marking the bean definition as lazy-initialized. A lazy-initialized bean tells the IoC container to create a bean instance when it is first requested, rather than at startup.

I suggest reading up

Tns
  • 390
  • 1
  • 7
Vjeetje
  • 5,314
  • 5
  • 35
  • 57
  • GWT4Ever: If the default behavior is false, why would one has to specify lazy-init="false" despite they can use lazy-init="default" right? Why two seperate values false, default if their behavior is same? – srk Feb 26 '13 at 15:36
  • 1
    This is answered by Zagyi, it's all in the link too. – Vjeetje Feb 26 '13 at 15:48
  • updated documentation is available [here](http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-dependency-resolution) – Irfan Bhindawala Aug 03 '17 at 13:42
  • I faced this issue due to self injection (needed for spring retry as the method being retried is not the one called by others). @ SpyBean obviously fails if self injection fields are not marked @ Lazy. – Pavan Kumar Oct 22 '19 at 11:54
26

For those coming here and are using Java config you can set the Bean to lazy-init using annotations like this:

In the configuration class:

@Configuration
// @Lazy - For all Beans to load lazily
public class AppConf {

    @Bean
    @Lazy
    public Demo demo() {
        return new Demo();
    }
}

For component scanning and auto-wiring:

@Component
@Lazy
public class Demo {
    ....
    ....
}

@Component
public class B {

    @Autowired
    @Lazy // If this is not here, Demo will still get eagerly instantiated to satisfy this request.
    private Demo demo;

    .......
 }
DavidR
  • 6,622
  • 13
  • 56
  • 70
22

The lazy-init="default" setting on a bean only refers to what is set by the default-lazy-init attribute of the enclosing beans element. The implicit default value of default-lazy-init is false.

If there is no lazy-init attribute specified on a bean, it's always eagerly instantiated.

zagyi
  • 17,223
  • 4
  • 51
  • 48
3

lazy-init is the attribute of bean. The values of lazy-init can be true and false. If lazy-init is true, then that bean will be initialized when a request is made to bean. This bean will not be initialized when the spring container is initialized and if lazy-init is false then the bean will be initialized with the spring container initialization.

2

When we use lazy-init="default" as an attribute in element, the container picks up the value specified by default-lazy-init="true|false" attribute of element and uses it as lazy-init="true|false".

If default-lazy-init attribute is not present in element than lazy-init="default" in element will behave as if lazy-init-"false".

Prashant_M
  • 2,868
  • 1
  • 31
  • 24