SpringIOC容器初始化之后,和销毁之前几种方法的执行顺序

1.搭建一个简单的Spring环境

2.定义一个接口及其实现类

package com.roger.service;

public interface SpringLifeCycleService {

    void springLifeCycle();
}
package com.roger.service.impl;

import com.roger.service.SpringLifeCycleService;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.util.concurrent.atomic.AtomicInteger;

public class SpringLifeCycleServiceImpl implements SpringLifeCycleService, InitializingBean, DisposableBean {

    private AtomicInteger sortNum = new AtomicInteger(1);

    private SpringLifeCycleServiceImpl() {
        System.out.println(sortNum.getAndIncrement() + "-构造器方法开始执行....");
    }

    public void initMethod() {
        System.out.println(sortNum.getAndIncrement() + "-Spring XML配置文件中添加init-method属性的,在IOC容器初始化之后开始执行");
    }

    @PostConstruct
    public void postConstruct() {
        System.out.println(sortNum.getAndIncrement() + "-直接在接口实现类中定义一个方法,无需实现InitializingBean接口,添加注解@PostConstruct,在IOC容器初始化之后,执行的postConstruct()");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println(sortNum.getAndIncrement() + "-实现InitializingBean接口,IOC容器初始化之后执行的afterPropertiesSet()");
    }

    public void destroyMethod() {
        System.out.println(sortNum.getAndIncrement() + "-Spring XML配置文件中添加destroy-method属性的,在IOC容器销毁之前开始执行");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println(sortNum.getAndIncrement() + "-实现DisposableBean接口,IOC容器销毁之前执行的destroy()");
    }

    @PreDestroy
    public void preDestroy() {
        System.out.println(sortNum.getAndIncrement() + "-直接在接口实现类中定义一个方法,无需实现DisposableBean接口,添加注解@PreDestroy,在IOC容器销毁之前,执行的preDestroy()");
    }

    @Override
    public void springLifeCycle() {
        System.out.println(sortNum.getAndIncrement() +"-自定义接口的接口方法实现...");
    }
}

 3.定义spring的xml文件

<?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.xsd">

    <bean id="springLifeCycleService" class="com.roger.service.impl.SpringLifeCycleServiceImpl"
        init-method="initMethod"
        destroy-method="destroyMethod"></bean>

</beans>

4.定义junit测试类

package com.roger.service.impl;

import com.roger.service.SpringLifeCycleService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.annotation.Resource;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring.xml"})
public class SpringLifeCycleServiceImplTest {

    @Resource(name = "springLifeCycleService")
    private SpringLifeCycleService springLifeCycleService;

    @Test
    public void testSpringLifeCycle(){
        springLifeCycleService.springLifeCycle();
    }
}

5.测试结果

1-构造器方法开始执行....
2-直接在接口实现类中定义一个方法,无需实现InitializingBean接口,添加注解@PostConstruct,在IOC容器初始化之后,执行的postConstruct()
3-实现InitializingBean接口,IOC容器初始化之后执行的afterPropertiesSet()
4-Spring XML配置文件中添加init-method属性的,无需实现InitializingBean接口,在IOC容器初始化之后开始执行
5-自定义接口的接口方法实现...
6-直接在接口实现类中定义一个方法,无需实现DisposableBean接口,添加注解@PreDestroy,在IOC容器销毁之前,执行的preDestroy()
7-实现DisposableBean接口,IOC容器销毁之前执行的destroy()
8-Spring XML配置文件中添加destroy-method属性的,无需实现DisposableBean接口,在IOC容器销毁之前开始执行

猜你喜欢

转载自blog.csdn.net/lihongtai/article/details/84836382
今日推荐