Spring default behavior for lazy-init

SpringSpring Ioc

Spring Problem Overview


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?

Spring Solutions


Solution 1 - Spring

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

Solution 2 - Spring

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;

    .......
 }

Solution 3 - Spring

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.

Solution 4 - Spring

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.

Solution 5 - Spring

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".

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionsrkView Question on Stackoverflow
Solution 1 - SpringVjeetjeView Answer on Stackoverflow
Solution 2 - SpringDavidRView Answer on Stackoverflow
Solution 3 - SpringzagyiView Answer on Stackoverflow
Solution 4 - SpringCarl MassaadView Answer on Stackoverflow
Solution 5 - SpringPrashant_MView Answer on Stackoverflow