设为首页 加入收藏

TOP

Spring IOC官方文档学习笔记(六)之自定义bean的特性(一)
2023-07-25 21:40:25 】 浏览:68
Tags:Spring IOC 方文档 习笔记 bean

1.生命周期回调

(1) 如果我们想要介入bean的生命周期,可通过实现spring中的InitializingBean和DisposableBean接口来达到这一目的,spring会调用InitializingBean中的afterPropertiesSet()以及DisposableBean中的destroy()方法来执行bean在初始化和销毁时所要执行的行为,此外JSR-250规范中的@PostConstruct和@PreDestroy注解也同样对spring bean适用,它们也可以指定bean的初始化或销毁方法,且不与spring框架强耦合,同时如果不想使用JSR-250注解,也可通过配置bean中的init-method和destroy-method属性来指定初始化或销毁回调。以上这些所有的回调都会由BeanPostProcessor来进行统一调用处理,因此如果我们有些需求无法通过这些生命周期回调实现,那么可以考虑自定义BeanPostProcessor。

(2) 除了初始化,销毁回调外,我们还可以实现Lifecycle接口,来让bean参与到容器级别的生命周期,比如容器的启动或关闭等

(3) 初始化回调(Initialization Callbacks):用于指定在容器设置了bean的所有所需属性后,应该执行的行为,它作用于原始bean上,即AOP代理对象不会被执行这些初始化回调,共有3种方式,分别为实现InitializingBean接口,使用@PostConstruct注解或在xml文件中指定init-method属性,如下所示

public class ExampleA implements InitializingBean {

    /**
     * InitializingBean接口提供的方法,不建议使用,因为它会与spring框架强耦合
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("afterPropertiesSet...");
    }

    @PostConstruct
    public void postConstruct() {
        System.out.println("postConstruct...");
    }

    //将该方法于xml配置文件中指定
    public void init() {
        System.out.println("init...");
    }
}

<!-- xml配置文件 -->
<beans ...>
    <!-- 注意:如果是基于xml的配置,则要使@PostConstruct注解生效,则要开启注解扫描 -->
    <context:annotation-config />

    <!-- 使用bean标签中的init-method属性来指定bean中的初始化回调 -->
    <bean id="exampleA" class="cn.example.spring.boke.ExampleA" init-method="init"></bean>
</beans>

//之后,启动容器,获取这个bean,日志打印如下:
postConstruct...
afterPropertiesSet...
init...

由上可见,初始化回调的执行顺序为:@PostConstruct注解所标注的方法 -> InitializingBean接口中的afterPropertiesSet()方法 -> init-method属性所指定的方法

(4) 销毁回调(Destruction Callbacks):用于容器在销毁bean之前,应该执行的行为,有3种方式,分别为实现DisposableBean接口,使用@PreDestroy注解或在xml文件中指定destroy-method属性,如下所示

public class ExampleA implements DisposableBean {

    /**
     * DisposableBean接口提供的方法,不建议使用,因为它会与spring框架强耦合
     */
    @Override
    public void destroy() throws Exception {
        System.out.println("DisposableBean...");
    }

    @PreDestroy
    public void preDestroy() {
        System.out.println("preDestroy...");
    }

    //将该方法于xml配置文件中指定
    public void cleanup() {
        System.out.println("cleanup...");
    }
}

<!-- xml配置文件 -->
<beans ...>
    <context:annotation-config />

    <!-- 使用bean标签中的destroy-method属性来指定bean中的销毁回调 -->
    <bean id="exampleA" class="cn.example.spring.boke.ExampleA" destroy-method="cleanup"></bean>
</beans>

//之后,启动并关闭容器,日志打印如下:
preDestroy...
DisposableBean...
cleanup...

由上可见,销毁回调的执行顺序为:@PreDestroy注解所标注的方法 -> DisposableBean接口中的destroy()方法 ->destroy-method属性所指定的方法,与初始化回调的执行顺序是相似的

(5) 自定义默认的初始化和销毁回调:我们可以使用一致的初始化方法名和销毁方法名,然后将其设置为beans标签中default-init-method和default-destroy-method的属性值,这样就不用给每个bean设置init-method和destroy-method属性了,方便统一和简化代码,如下

//统一规定每个bean的初始化方法名为init,销毁方法名为destroy
public class ExampleA {
    public void init() {
        System.out.println("init...");
    }

    public void destroy() {
        System.out.println("destroy...");
    }
}

<!-- xml配置文件 -->

<!-- 使用beans标签的default-init-method和default-destroy-method属性,来配置统一的默认初始化和销毁方法,相当于给该be
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇面试官:Docker 有几种网络模式?.. 下一篇面试官:为什么 wait/notify 必须..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目