美文网首页
Spring_05_Bean的生命周期

Spring_05_Bean的生命周期

作者: 有_味 | 来源:发表于2018-07-16 21:50 被阅读5次

Bean的生命周期

 理解Spring bean的生命周期很容易. 当一个bean被实例化时,它可能需要执行一些初始化它转换成可用状态.同样,刚bean不再需要,并且从容器中移除时,可能需要做一些清除工作.

 为了定义安装和拆卸一个bean,我们只需要声明有init-method 和或/destroy-method属性.init-method属性指定一个方法,在实例化bean时,立即调用该方法,同样.destroy-method指定一个方法,只有从容器中移除bean之后,才能调用该方法.

初始化方法

org.springframework.beans.factory.initializingBean 接口指定一个单一的方法:

void afterPropertiesSet() throws Exception;

因此你可以简单地实现上述接口和初始化工作可以在afterPropertiesSet() 方法中执行;

public class ExampleBean implements InitializingBean{
    public void afterPropertiesSet(){
        // do some initalization work
    }
}

在基于XML的配置元数据的情况下,你可以使用init-method 属性来指定带有void无参数方法的名称.例如:

<bean id="exampleBean" class="examples.ExampleBean" init-method="init" />

定义类

public class ExampleBean{
    public void init(){
        // do some initialization work
    }   
}

总结:先执行afterPropertiesSet()方法,再执行init()方法.我们可以在其中进行初始化工作.

销毁的方法

org.springframework.beans.factory.DisposableBean接口指定一个单一方法:

void destroy() throws Exception;

因此,你可以简单地实现上述接口并且结束工作可以在destroy()方法中执行

public class ExampleBean implements DisposableBean {
    public void destroy() {
    // do some destruction work
    }
}

在基于XML配置元数据的情况下,你可以使用destroy-method属性来指定带有void无参数的方法的名称.例如:

<bean id="exampleBean" class="examples.ExampleBean" destroy-method="destroy"/>

如果你一定要在非web应用程序环境中使用Spring IOC的容器;例如在丰富的客户端桌面环境中,那么在jvm中你要注册关闭hook,这样做可以确保正常关闭,为了让所有的资源都被释放,可以在单个bean上调用destroy方法.

建议不要去使用initalizingBean或者DisposableBean 的回调方法,因为XML配置在命名方法上提供了极大的灵活性.

例子

步骤 描述
1 创建一个名称为 SpringExample 的项目,并且在创建项目的 c src 文件夹中创建一个包 com.tutorialspoint.
2 使用 Add External JARs 选项,添加所需的 Spring 库,解释见 Spring Hello World Example 章节。
3 在 com.tutorialspoint 包中创建 Java 类 HelloWorld 和 MainApp.
4 在 c src 文件夹中创建 Beans 配置文件 Beans.xml 。
5 最后一步是创建的所有 Java 文件和 Bean 配置文件的内容,并运行应用程序,解释如下所示。

HelloWorld.java

package com.tutorialspoint;

public class HelloWorld {
    private String message;

    public void setMessage(String message) {
        this.message = message;
    }

    public void getMessage() {
        System.out.println("yout message : " + message);
    }

    public void init() {
        System.out.println("Bean is going through init()......");
    }

    private void destroy() {
        System.out.println("Bean will  destroy now  ......");
    }
}

Beans.xml

init() 方法和 destroy() 方法必须的配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    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-3.0.xsd">

    <bean id="helloWorld" class="com.tutorialspoint.HelloWorld" init-method="init" destroy-method="destroy">
        <property name="message" value="hello ........."></property>
    </bean>
</beans>

MainApp.xml

下面是MainApp.java的文件内容,在这里,你需要注册一个在AbstractApplicationContext类中声明的关闭hook的registerShutdownHook()方法.它将确保正常关闭,并且调用相关的destroy()方法.

package com.tutorialspoint;

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

public class MainApp {
    public static void main(String[] args) {
        AbstractApplicationContext context  = new ClassPathXmlApplicationContext("Beans.xml");
        HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
        obj.getMessage();
        context.registerShutdownHook(); 
    }
}

运行后的输出结果

Bean is going through init()......
yout message : hello .........
Bean will  destroy now  ......

默认的初始化和销毁的方法

如果你 有太多具有相同名称的初始化或者销毁方法Bean,那么你不需要再每个bean上声明初始化的方法和销毁方法,框架使用元素的的default-init-method 和 default-destroy-method 属性提供了灵活地配置这种情况.

<beans xmlns="http://www.springframework.org/schema/beans"
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-3.0.xsd"
 <!--  这里定义的是所有的初始化和结束的方法-->
default-init-method="init"
default-destroy-method="destroy">

相关文章

  • Spring_05_Bean的生命周期

    Bean的生命周期  理解Spring bean的生命周期很容易. 当一个bean被实例化时,它可能需要执行一些初...

  • Vue生命周期

    什么是生命周期方法?生命周期钩子=生命周期函数=生命周期事件 Vue生命周期方法分类  创建期间的生命周期方法: ...

  • 10,vue生命周期

    生命周期钩子=生命周期函数=生命周期事件 根据生命周期的不同分为三类: 创建阶段的生命周期 运行阶段的生命周期 销...

  • 微信小程序生命周期的记录

    小程序中生命周期分为3类: 应⽤的生命周期 页面的生命周期 组件的生命周期 一、生命周期 1. 应⽤的生命周期[h...

  • Lifecycle 生命周期源码解析

    目录: 什么生命周期 什么是生命周期感知型组件 Activity是如何把生命周期传给生命周期感知组件的 生命周期 ...

  • uni-app微信小程序开发 - 生命周期

    uni-app的生命周期分为应用生命周期和页面生命周期还有组件生命周期。 应用生命周期[https://uniap...

  • Activity,Fragment,Service生命周期图

    Activity生命周期 Fragment生命周期 Service生命周期

  • iOS 生命周期问题

    引言: 生命周期包括:a.程序的生命周期b.控制器的生命周期c.试图的生命周期 程序生命周期 a. 首次启动, 会...

  • Flutter 的生命周期

    Flutter 的生命周期Flutter 的生命周期分为两个部分: Widget 的生命周期App 的生命周期Fl...

  • 详细的分析 Vue生命周期

    Vue 的生命周期 生命周期执行的函数叫法有三种: 生命周期钩子 生命周期函数 钩子函数 生命周期钩子概念: 在v...

网友评论

      本文标题:Spring_05_Bean的生命周期

      本文链接:https://www.haomeiwen.com/subject/eedipftx.html