Thursday, 4 June 2015

Spring PostConstruct and PreDestroy

In Spring, you can either implements InitializingBean and DisposableBean interface or specify the init-method and destroy-method in bean configuration file for the initialization and destruction callback function. javax.annotation package provides two annotations PostConstruct and PreDestroy to perform same thing.

@PostConstruct
The PostConstruct annotation is used on a method that needs to be executed after dependency injection is done to perform any initialization.

@PreDestroy
The PreDestroy annotation is used on methods as a callback notification to signal that the instance is in the process of being removed by the container.

Step 1 : Create new maven project “spring_tuorial”. Project structure looks like below.

Step 2 : Update “pom.xml” file for maven dependencies.

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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
 <modelVersion>4.0.0</modelVersion> 
 <groupId>spring_tutorial</groupId> 
 <artifactId>spring_tutorial</artifactId> 
 <version>0.0.1-SNAPSHOT</version> 
 <packaging>war</packaging> 
 <name>spring_tutorial</name> 
 <description>spring_tutorial</description> 
 <properties> 
  <org.springframework-version>4.1.5.RELEASE</org.springframework-version> 
 </properties> 

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

 </dependencies> 
</project>
Step 3: Create new package “com.springtutorial.model” under “src/main/java”.

Step 4: Create “Employee” class under the package “com.springtutorial.model”.
package com.springtutorial.model; 

import javax.annotation.PostConstruct; 
import javax.annotation.PreDestroy; 
 
public class Employee { 
  private String firstName; 
  private String lastName; 
  private int id; 

  public String getFirstName() { 
    return firstName; 
  } 

  public void setFirstName(String firstName) { 
    this.firstName = firstName; 
  } 

  public String getLastName() { 
    return lastName; 
  } 

  public void setLastName(String lastName) { 
    this.lastName = lastName; 
  } 

  public int getId() { 
    return id; 
  } 

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

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

  @PostConstruct 
  public void runAfterInitialization(){ 
    System.out.println("After initialization"); 
  } 

  @PreDestroy 
  public void runBeforeDestroy(){ 
    System.out.println("Before destroying"); 
  } 
} 

Step 5: Create “spring.xml” file in “src/main/resources”.

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

 <context:annotation-config /> 

 <bean id="employee" class="com.springtutorial.model.Employee"> 
  <property name="firstName" value="Hari Krishna" /> 
  <property name="lastName" value="Gurram" /> 
  <property name="id" value="553" /> 
 </bean> 

</beans>

"spring.xml" is used to assign unique IDs to different beans, to control the creation of objects with different values. You have to make sure that “spring.xml” file is available in CLASSPATH and use the same name in main application while creating application context as shown in Main.java file.

Step 6 : Create package “com.springtutorial.main” under “src/main/java”.

Step 7 : Create Main class under package “com.springtutorial.main”.
package com.springtutorial.main; 

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

import com.springtutorial.model.Employee; 

public class Main { 
  public static void main(String args[]) { 
    ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml"); 

    Employee emp = (Employee) context.getBean("employee"); 
    System.out.println(emp); 

    ((ClassPathXmlApplicationContext) context).close(); 
  } 
} 


Step 8: Run Main.java,you will get error like below.
Apr 03, 2015 2:07:47 PM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh 
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1509f8b: startup date [Fri Apr 03 14:07:47 IST 2015]; root of context hierarchy 
Apr 03, 2015 2:07:47 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 
INFO: Loading XML bean definitions from class path resource [spring.xml] 
After initialization 
Employee [firstName=Hari Krishna, lastName=Gurram, id=553] 
Apr 03, 2015 2:07:48 PM org.springframework.context.support.ClassPathXmlApplicationContext doClose 
INFO: Closing org.springframework.context.support.ClassPathXmlApplicationContext@1509f8b: startup date [Fri Apr 03 14:07:47 IST 2015]; root of context hierarchy 
Before destroying









Prevoius                                                 Next                                                 Home

No comments:

Post a Comment