spring容器初始化bean和销毁bean之前进行一些操作的方法

阅读更多

关于在spring  容器初始化 bean 和销毁前所做的操作定义方式有三种:

        第一种,通过在xml中定义init-method和destory-method方法

        第二种,通过bean实现InitializingBean和 DisposableBean接口

        第三种,通过Spring @PostConstruct和@PreDestroy方法

一.通过在xml中定义init-method和destory-method方法

        在xml中配置init-method和 destory-method方法,只是定义spring容器在初始化bean和容器销毁之前的所做的操作。

1.xml中配置文件




      
            
	
	
    
    
       
           
        
           
    

2.定义TestService类

package com.bijian.study.service.impl;

public class TestService {

    private String  message;  
  
    public String getMessage() {  
        return message;  
    }  
  
    public void setMessage(String message) {  
        this.message = message;  
    }
    
    public void afterPropertiesSet() throws Exception {
        System.out.println("I'm  init  method  using  @PostConstrut...."+message);
    }  

    public void destroy() throws Exception {
        System.out.println("I'm  destory method  using  @PreDestroy....."+message);
    }
}  

3.相应的测试类

package com.bijian.study.test;

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

import com.bijian.study.service.impl.TestService;

public class MainTest {

    public static void main(String[] args) {
        
        try {
            AbstractApplicationContext context = new ClassPathXmlApplicationContext("file:D:/develop/eclipse/workspace/SpringMVC/WebContent/WEB-INF/springMVC-servlet.xml");  
            
            TestService testService  =  (TestService)context.getBean("testService");
            
            System.out.println(testService.getMessage());
            //testService.destroy();
            context.registerShutdownHook();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果:

I'm  init  method  using  @PostConstrut....123
123
I'm  destory method  using  @PreDestroy.....123

        可以看出init-method方法和destroy-method方法都已经执行了。

        context.registerShutdownHook(); 是一个钩子方法,当jvm关闭退出的时候会调用这个钩子方法,在设计模式之 模板模式中 通过在抽象类中定义这样的钩子方法由实现类进行实现,这里的实现类是AbstractApplicationContext,这是spring 容器优雅关闭的方法。

 

二.通过bean实现InitializingBean和 DisposableBean接口

1.xml中配置文件




      
            
	
	
    
    
       
           
        
           
    

2.定义TestService类

package com.bijian.study.service.impl;

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

public class TestService implements InitializingBean,DisposableBean{  
    
    private String  message;  
  
    public String getMessage() {  
        return message;  
    }  
  
    public void setMessage(String message) {  
        this.message = message;  
    }  

    public void afterPropertiesSet() throws Exception {
        System.out.println("I'm  init  method  using  @PostConstrut...."+message);
    }  

    public void destroy() throws Exception {
        System.out.println("I'm  destory method  using  @PreDestroy....."+message);
    }
}  

3.测试类同上,运行测试类。

运行结果:

I'm  init  method  using  @PostConstrut....123
123
I'm  destory method  using  @PreDestroy.....123

 

三.通过Spring @PostConstruct和@PreDestroy方法

1.xml中配置文件



    
	   

      
            
	
	
	
	
    
    
       
           
        
           
    

    其中告诉spring 容器采用注解配置,扫描注解配置。

2.定义TestService类

package com.bijian.study.service.impl;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

public class TestService {  
    
    private String  message;  
  
    public String getMessage() {  
        return message;  
    }  
  
    public void setMessage(String message) {  
        this.message = message;  
    }
    
    @PostConstruct
    public void afterPropertiesSet() throws Exception {
        System.out.println("I'm  init  method  using  @PostConstrut...."+message);
    }  
    
    @PreDestroy
    public void destroy() throws Exception {
        System.out.println("I'm  destory method  using  @PreDestroy....."+message);
    }
}  

3.测试类同上,运行测试类。

运行结果:

I'm  init  method  using  @PostConstrut....123
123
I'm  destory method  using  @PreDestroy.....123

        其中也可以通过申明加载org.springframework.context.annotation.CommonAnnotationBeanPostProcessor类来告诉Spring容器采用的 常用解配置的方式,只需要修改配置文件为:



	
    
    
       
           
        
           
    
     
	
	  
		
	

        最后,Srping的bean可以通过注解配置方法注入。如下所示:

1.xml配置



    
	   

      
            
	
	
	

    
    
       
           
        
           
    

2.定义TestService类

package com.bijian.study.service.impl;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

import org.springframework.stereotype.Service;

@Service("testService")
public class TestService { 
    
    private String  message;  
  
    public String getMessage() {  
        return message;  
    }
  
    public void setMessage(String message) {  
        this.message = message;  
    }
    
    @PostConstruct
    public void afterPropertiesSet() throws Exception {
        System.out.println("I'm  init  method  using  @PostConstrut...."+message);
    }  
    
    @PreDestroy
    public void destroy() throws Exception {
        System.out.println("I'm  destory method  using  @PreDestroy....."+message);
    }
}

 

参考文章:

http://blog.csdn.net/topwqp/article/details/8681467

http://blog.csdn.net/topwqp/article/details/8681497

  • SpringMVC.zip (9 MB)
  • 下载次数: 1

你可能感兴趣的:(Spring,@PostConstruct,@PreDestroy,init-method)