Friday, 17 August 2018

Spring Bean Life Cycle - Spring InitializingBean and DisposableBean | Spring Tutorial

🚀 Enjoying Java & Spring Tutorials?

Subscribe to Ram N Java for beginner-friendly, hands-on programming guides!

🔔 Subscribe Now

What are InitializingBean and DisposableBean?

In the Spring Framework, managing the creation and destruction phases of your objects is essential for setup operations and clean resource management. Spring provides two core programmatic callback interfaces: InitializingBean and DisposableBean.

  • InitializingBean: Provides the afterPropertiesSet() method, which the Spring container invokes immediately after all bean properties are set and dependencies are injected.
  • DisposableBean: Provides the destroy() method, which is invoked when the Spring container shuts down and the bean instance is being destroyed.

How Does It Work?

By directly implementing these interfaces in your bean class, Spring automatically detects and invokes the lifecycle hooks without needing extra configuration:

  • Automatic Invocation: Spring executes afterPropertiesSet() after initialization and destroy() on container shutdown.
  • Programmatic Approach: Useful when you want explicit contract enforcement for initialization and cleanup logic directly inside your Java class.

Sample Implementation Code

Here is an example of implementing both interfaces in a Spring bean:

public class DatabaseService implements InitializingBean, DisposableBean { @Override public void afterPropertiesSet() throws Exception { System.out.println("Init: Database connection initialized."); } @Override public void destroy() throws Exception { System.out.println("Clean up: Database connection closed."); } }

Related Tutorials from Ram N Java


Click here to watch on Youtube:
https://www.youtube.com/watch?v=8JilnzXYHIA&list=UUhwKlOVR041tngjerWxVccw

Click the below Image to Enlarge:

Spring Bean Life Cycle - Spring InitializingBean and DisposableBean | Spring Tutorial

Spring Bean Life Cycle - Spring InitializingBean and DisposableBean | Spring Tutorial

Spring Bean Life Cycle - Spring InitializingBean and DisposableBean | Spring Tutorial

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%20http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.ram.core</groupId>
    <artifactId>SpringDemo</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>SpringDemo</name>
    <url>http://maven.apache.org</url>

    <properties>
        <spring.version>5.0.2.RELEASE</spring.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>

        <!-- Spring 5 dependencies -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>

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

Employee.java

package com.ram.model;

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

public class Employee implements InitializingBean, DisposableBean
{
    private int id;
    private String name;

    public int getId()
    {
        return id;
    }

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

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public void afterPropertiesSet() throws Exception
    {
        System.out.println("inside afterPropertiesSet().  ");
    }

    public void destroy() throws Exception
    {
        System.out.println("Inside destroy(), Performed clean up tasks.");
    }

    @Override
    public String toString()
    {
        return "Employee [id=" + id + ", name=" + name + "]";
    }

}

applicationContext.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-4.3.xsd">


    <bean id="employee" class="com.ram.model.Employee">
        <property name="id" value="100"></property>
        <property name="name" value="Peter"></property>
    </bean>

</beans>

App.java

package com.ram.core;

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

import com.ram.model.Employee;

public class App
{
    public static void main(String[] args)
    {
        ConfigurableApplicationContext  context = new ClassPathXmlApplicationContext(
                "applicationContext.xml");

        System.out.println("---------------------------------------");

        Employee employee = context.getBean("employee", Employee.class);
        System.out.println(
                "Got employee object from the ApplicationContext(Spring Container)");

        System.out.println(employee);

        context.close();
    }

}

Output

Aug 06, 2018 10:35:53 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@5b37e0d2: startup date [Mon Aug 06 10:35:53 IST 2018]; root of context hierarchy
Aug 06, 2018 10:35:53 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
inside afterPropertiesSet().
---------------------------------------
Got employee object from the ApplicationContext(Spring Container)
Employee [id=100, name=Peter]
Aug 06, 2018 10:35:54 AM org.springframework.context.support.AbstractApplicationContext doClose
INFO: Closing org.springframework.context.support.ClassPathXmlApplicationContext@5b37e0d2: startup date [Mon Aug 06 10:35:53 IST 2018]; root of context hierarchy
Inside destroy(), Performed clean up tasks.

Click the below link to download the code:
https://sites.google.com/site/ramj2eev2/java_basics/SpringDemo_InitializingBean_DisposableBean.zip?attredirects=0&d=1

Github Link:
https://github.com/ramram43210/javaee/tree/master/Spring_2018/SpringDemo_InitializingBean_DisposableBean

Bitbucket Link:
https://bitbucket.org/ramram43210/spring/src/476437cc0ec4e46c307e790b2c10c4099b1c066b/Spring_2018/SpringDemo_InitializingBean_DisposableBean/?at=master

See also:

  • All JavaEE Videos Playlist
  • All JavaEE Videos
  • All JAVA EE Links
  • Spring Tutorial
  • Servlets Tutorial
  • All Design Patterns Links
  • JDBC Tutorial
  • Java Collection Framework Tutorial
  • JAVA Tutorial
  • Kids Tutorial
  • Cooking Tutorial
  • No comments:

    Post a Comment

    Tutorials