spring学习之bean生命周期的管理

39次阅读

共计 1607 个字符,预计需要花费 5 分钟才能阅读完成。

三种方式

init 和 destroy

XML 配置中,bean标签,init-method用来指定 bean 初始化后调用的方法,destroy-method用来指定 bean 销毁前调用的方法。如果想统一设置,可以在 beans 中设置 default-init-method 属性。
注解中,@Bean注解,initMethod 用来指定 bean 初始化后调用的方法,destroyMethod用来指定 bean 销毁前调用的方法。

InitializingBean 和 DisposableBean

org.springframework.beans.factory.InitializingBean 接口,在其他初始化工作完成后,才开始调用他的 afterPropertiesSet() 方法.
org.springframework.beans.factory.DisposableBean 接口,在容器销毁时,会调用 destroy() 这个方法。

@PostConstruct 和 @PreDestroy

@PostConstruct 和 @PreDestroy 不属于 spring,而是属于 JSR-250 规则,日常用的较多的,还是这两个注解。

三种方式执行顺序

当这三种生命周期机制同时作用于同一个 bean 时,执行顺序如下:
初始化:@PostConstruct > InitializingBean 的 afterPropertiesSet()方法 > init()方法。
销毁:@PreDestroy > DisposableBean 的 destroy()方法 > destroy()方法。

示例

MyBean

public class MyBean implements InitializingBean, DisposableBean {
    private String name;

    public MyBean(String name) {System.out.println("name:" + name);
        this.name = name;
    }

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

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

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

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

    @Override
    public void destroy() throws Exception {System.out.println("destroy");
    }

    @Override
    public void afterPropertiesSet() throws Exception {System.out.println("afterPropertiesSet");
    }
}

MyConfig

@Configuration
public class MyConfig {@Bean(initMethod = "initMethod", destroyMethod = "destroyMethod")
    public MyBean myBean() {return new MyBean("张三");
    }
}

测试代码

@Test
public void test() {ApplicationContext app = new AnnotationConfigApplicationContext(MyConfig.class);
    System.out.println("开始销毁");
    ((AnnotationConfigApplicationContext) app).close();}

运行结果如下

XML 的配置同 @bean 注解,这边不做演示。

正文完
 0