🚀 Enjoying Java & Spring Tutorials?
Subscribe to Ram N Java for beginner-friendly, hands-on programming guides!
🔔 Subscribe NowWhat 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 anddestroy()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>
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 + "]";
}
}
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>
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();
}
}
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.
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:
No comments:
Post a Comment