`

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中配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
                    http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
                    http://www.springframework.org/schema/context
                    http://www.springframework.org/schema/context/spring-context-4.1.xsd
                    http://www.springframework.org/schema/mvc
                    http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
                    ">

    <bean id="testService" class="com.bijian.study.service.impl.TestService" init-method="afterPropertiesSet" destroy-method="destroy">  
          <property name="message" value="123"></property>  
	</bean>
	
    <mvc:annotation-driven></mvc:annotation-driven>
    
    <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">   
        <property name="viewClass"  
            value="org.springframework.web.servlet.view.JstlView" />   
        <property name="prefix" value="/WEB-INF/views" />
        <property name="suffix" value=".jsp" />   
    </bean>
</beans>

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中配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
                    http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
                    http://www.springframework.org/schema/context
                    http://www.springframework.org/schema/context/spring-context-4.1.xsd
                    http://www.springframework.org/schema/mvc
                    http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
                    ">

    <bean id="testService" class="com.bijian.study.service.impl.TestService">  
          <property name="message" value="123"></property>  
	</bean>
	
    <mvc:annotation-driven></mvc:annotation-driven>
    
    <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">   
        <property name="viewClass"  
            value="org.springframework.web.servlet.view.JstlView" />   
        <property name="prefix" value="/WEB-INF/views" />
        <property name="suffix" value=".jsp" />   
    </bean>
</beans>

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中配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
                    http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
                    http://www.springframework.org/schema/context
                    http://www.springframework.org/schema/context/spring-context-4.1.xsd
                    http://www.springframework.org/schema/mvc
                    http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
                    ">
    
	<context:component-scan base-package="com.bijian.study"></context:component-scan>   

    <bean id="testService" class="com.bijian.study.service.impl.TestService">  
          <property name="message" value="123"></property>  
	</bean>
	
	<context:annotation-config />
	
    <mvc:annotation-driven></mvc:annotation-driven>
    
    <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">   
        <property name="viewClass"  
            value="org.springframework.web.servlet.view.JstlView" />   
        <property name="prefix" value="/WEB-INF/views" />
        <property name="suffix" value=".jsp" />   
    </bean>
</beans>

    其中<context:annotation-config />告诉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容器采用的 常用解配置的方式,只需要修改配置文件为:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
                    http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
                    http://www.springframework.org/schema/context
                    http://www.springframework.org/schema/context/spring-context-4.1.xsd
                    http://www.springframework.org/schema/mvc
                    http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
                    ">
	
    <mvc:annotation-driven></mvc:annotation-driven>
    
    <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">   
        <property name="viewClass"  
            value="org.springframework.web.servlet.view.JstlView" />   
        <property name="prefix" value="/WEB-INF/views" />
        <property name="suffix" value=".jsp" />   
    </bean>
     
	<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />
	<bean id="testService" class="com.bijian.study.service.impl.TestService">  
		<property name="message" value="123"></property>
	</bean>
</beans>

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

1.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
                    http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
                    http://www.springframework.org/schema/context
                    http://www.springframework.org/schema/context/spring-context-4.1.xsd
                    http://www.springframework.org/schema/mvc
                    http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
                    ">
    
	<context:component-scan base-package="com.bijian.study"></context:component-scan>   

    <bean id="testService" class="com.bijian.study.service.impl.TestService">  
          <property name="message" value="123"></property>  
	</bean>
	
	<context:annotation-config />

    <mvc:annotation-driven></mvc:annotation-driven>
    
    <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">   
        <property name="viewClass"  
            value="org.springframework.web.servlet.view.JstlView" />   
        <property name="prefix" value="/WEB-INF/views" />
        <property name="suffix" value=".jsp" />   
    </bean>
</beans>

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

分享到:
评论

相关推荐

    Spring Bean的初始化和销毁实例详解

    在Spring框架中,我们可以使用多种方式来初始化Bean,下面我们将介绍两种常见的方式: 1、使用@Bean的initMethod 在使用@Bean注解时,我们可以使用initMethod属性来指定Bean的初始化方法。例如: ```java @Bean...

    Spring Bean创建初始化流程.docx

    在Spring框架中,Bean的创建和初始化是IoC(Inversion of Control)容器的核心功能,这一过程涉及到多个步骤。以下是对Spring Bean创建初始化流程的详细解释: 1. **初始化ApplicationContext**: 开始时,通过`...

    Spring bean初始化及销毁你必须要掌握的回调方法.docx

    当Spring容器创建并初始化Bean时,会寻找带有@PostConstruct注解的方法并执行。 2. **InitializingBean接口** 如果一个Bean实现了Spring的InitializingBean接口,那么它必须重写`afterPropertiesSet()`方法。此...

    Spring实例化Bean顺序

    但是,这并不总是可靠的,因为Spring通常会延迟初始化Bean,除非显式要求或存在依赖关系。 2. **依赖注入**:Spring容器会根据Bean之间的依赖关系来决定实例化顺序。如果一个Bean依赖于另一个Bean,那么被依赖的...

    Spring之核心容器bean

    Spring容器对bean的生命周期进行管理,包括初始化、活跃期和销毁。你可以为bean定义初始化方法和销毁方法,容器会在适当的时候调用。此外,还可以通过实现InitializingBean和DisposableBean接口,或者使用`@...

    深度解析spring容器管理bean

    Spring容器还提供了多种管理Bean生命周期的方法,包括初始化回调、销毁回调、以及作用域(singleton、prototype等)。初始化回调是指在Bean实例化后、开始使用前执行的方法,可以通过`init-method`属性指定。销毁回...

    spring bean XML配置入门

    我们还可以在XML配置中定义Bean的初始化方法(`init-method`)和销毁方法(`destroy-method`),Spring容器会在适当的时间调用这些方法。 9. **Spring容器的启动与Bean的生命周期**: 一旦XML配置加载到Spring...

    Spring Bean生命周期.pdf

    之后,如果Bean实现了InitializingBean接口,则调用afterPropertiesSet方法进行初始化。最后,在Spring容器关闭时,会调用实现DisposableBean接口的destroy方法来销毁Bean。 Spring Bean生命周期的管理让开发者能够...

    spring bean的生命周期

    Spring Bean的生命周期是Spring框架...在实际开发中,可以利用生命周期回调方法进行一些初始化和清理工作,提高代码的健壮性和可维护性。同时,结合日志记录,可以跟踪和分析Bean的整个生命周期,进一步优化系统性能。

    spring bean life cycle

    通过实现`postProcessBeforeInitialization()`和`postProcessAfterInitialization()`方法,可以在Bean初始化前后进行额外的操作。 在Spring容器中,Bean的生命周期管理也支持通过`BeanDefinition`进行定制。例如,...

    spring的bean加载顺序样例项目

    在Spring框架中,Bean的加载顺序是一个重要的概念,它涉及到Spring容器如何管理和初始化Bean的过程。在"spring的bean加载顺序样例项目"中,我们可以通过分析和实验来深入理解这一主题。下面将详细阐述Spring Bean的...

    Spring Bean重复执行两次(实例被构造两次)问题分析

    这个问题可能是由多种原因引起的,涉及到Spring的初始化过程和容器的行为。以下是对该问题的详细分析: 首先,我们需要理解Spring Bean的生命周期。在Spring容器初始化时,它会根据配置加载Bean的定义,并根据需要...

    Spring 源码分析(Bean的初始化)

    本篇文章主要分析了Spring如何通过`ClassPathXmlApplicationContext`来启动和初始化Bean的过程。 首先,`ClassPathXmlApplicationContext`是Spring的一种ApplicationContext实现,用于从类路径下的XML配置文件加载...

    spring IOC反射装载bean

    比如,当配置了初始化方法或销毁方法,Spring会在适当的时候调用这些方法。例如: ```xml &lt;bean id="myBean" class="com.example.MyClass" init-method="initMethod"&gt; ... &lt;/bean&gt; ``` 这里,`init-method`指定的...

    Spring初始化和销毁的实现方法

    "Spring初始化和销毁的实现方法" Spring框架中,Bean的初始化和销毁是非常重要的两个生命周期过程。今天我们将讨论Spring中 Bean 的初始化和销毁的实现方法。 1. 通过@Bean指定init-method和destroy-method 在 ...

    Spring part 2 :Bean的生命周期

    管理状态则是Spring对Bean进行初始化和销毁操作。 Spring提供两种方式来管理Bean的生命周期:编程式和声明式。编程式通过实现接口如InitializingBean和DisposableBean,然后重写其特定方法(afterPropertiesSet()和...

    Spring bean生命周期demo

    在Spring容器初始化时,它会读取配置文件(如XML或Java配置),解析Bean定义,包括其依赖关系、初始化方法、作用域等属性。这个阶段不涉及Bean的实际实例化,而是构建Bean的元数据。 2. **Bean实例化** 实例化是...

    08-IoC配置-bean的生命周期控制

    Spring IOC容器可以管理Bean的生命周期,允许在Bean生命周期的特定点执行定制的任务。 Spring IOC容器对Bean的生命周期...在 Bean 的声明里设置 init-method 和 destroy-method 属性, 为 Bean 指定初始化和销毁方法。

Global site tag (gtag.js) - Google Analytics