初始化和销毁

Exisi 2022-06-28 07:39:54
Categories: Tags:
  • 要与容器对 bean 生命周期的 Management 进行交互,可以实现 Spring InitializingBean DisposableBean 接口。容器对前者调用 afterPropertiesSet(),对后者调用 destroy(),以使 Bean 在初始化和销毁 Bean 时执行某些操作。

 

  • Spring 框架使用 BeanPostProcessor 实现来处理它可以找到的任何回调接口并调用适当的方法。如果需要自定义功能或其他生命周期行为,可以自己实现 BeanPostProcessor

 

 

 

初始化(Initialization Callbacks

  • org.springframework.beans.factory.InitializingBean 接口允许容器在容器上设置了所有必需的属性后,bean 可以执行初始化工作。 InitializingBean 接口指定一个方法:

 

void afterPropertiesSet() throws Exception;

示例

  • application.xml

<bean id="exampleInitBean" class="examples.ExampleBean"/>

 

  • ExampleBean.java

public class ExampleBean implements InitializingBean {

 

    public void afterPropertiesSet() {

        // do some initialization work

    }

}

 

  • 不建议使用 InitializingBean 接口,因为它不必要地将代码耦合到 Spring。相对的,可以在<bean/> 上使用 init-method 属性指定具有无效无参数签名的方法的名称

示例

  • application.xml

<bean id="anotherExampleBean" class="AnotherExampleBean" init-method="init"/>

 

  • ExampleBean.java

public class AnotherExampleBean {

 

    public void init() {

        // do some initialization work

    }

}

 

 

 

销毁(Destruction Callbacks

  • 实现 org.springframework.beans.factory.DisposableBean 接口后,当包含 bean 的容器被销毁时,bean 可以获取回调。 DisposableBean 接口指定一个方法:

 

void destroy() throws Exception;

示例

  • application.xml

<bean id="exampleInitBean" class="examples.ExampleBean"/>

 

  • ExampleBean.java

public class ExampleBean implements DisposableBean {

 

    public void destroy() {

        // do some destruction work (like releasing pooled connections)

    }

}

 

  • 不建议使用 DisposableBean 回调接口 ,因为它不必要地将代码耦合到 Spring相对的,可以在<bean/> 上使用destroy-method 属性

示例

  • application.xml

<bean id="anotherExampleBean" class="AnotherExampleBean" destroy-method="cleanup"/>

 

  • ExampleBean.java

public class AnotherExampleBean {

    public void cleanup() {

        // do some destruction work (like releasing pooled connections)

    }

}

  • 如果不使用接口的 destroy() 方法销毁容器,还可以通过关闭 ApplicationContext,销毁所有的 bean 并释放所有的资源。 如果需要在关闭应用程序上下文之前进行一些清理工作,可以在实现 SmartLifecycle 接口的 bean 中执行这些操作

 

 

 

默认全局初始化和销毁方法

  • 顶层 <beans/> 元素属性上 default-init-method 属性的存在会导致 Spring IoC 容器将 Bean 类上称为 init 的方法识别为初始化方法回调。创建和组装 bean 时,如果 bean 类具有此类方法,则会在适当的时间调用它。同样的,也可以通过使用顶级 <beans/> 元素上的 default-destroy-method 属性类似地 ( XML ) 配置 destroy 方法回调。

 

  • 编写应用程序类并使用名为 init() 的初始化回调,而不必为每个 bean 定义配置 init-method  属性。 同样的,可以编写 destory() 的销毁回调,而不必为每个 bean 定义配置 destroy-method 属性。

示例

  • DefaultBlogService

public class DefaultBlogService implements BlogService {

private BlogDao blogDao;

    public void setBlogDao(BlogDao blogDao) {
        this.blogDao = blogDao;
    }

    // this is (unsurprisingly) the initialization callback method
    public void init() {
        if (this.blogDao == null) {
            throw new IllegalStateException("The [blogDao] property must be set.");
        }
    }

 

    public void destory() {
        if (this.blogDao
!= null) {
            throw new IllegalStateException("The [blogDao] property
destory.");
        }
    }

}

 

  • application.xml

<beans default-init-method="init" default-destroy-method="destory">

 

<bean id="blogService" class="com.something.DefaultBlogService">

<property name="blogDao" ref="blogDao" />

</bean>

 

</beans>

 

 

来自 <https://www.docs4dev.com/docs/zh/spring-framework/5.1.3.RELEASE/reference/core.html#beans>