Spring是否确保以正确的顺序关闭可关闭的bean?

时间:2016-03-25 11:27:42

标签: java spring

让我们假设我们有两个Closeable bean:

@Component
public class CloseableBean1 implements Closeable {

    private BufferedOutputStream outputStream;

    @Override
    public void close() throws IOException {
        try {
            outputStream.close();
        } catch (Exception e) {
            // ignore e
        }
    }
}


@Component
public class CloseableBean2 implements Closeable {    

    @Autowired
    private CloseableBean1 bean1;


    @Override
    public void close() throws IOException {
        try {
            bean1.close();
        } catch (Exception e) {
            // ignore e
        }
    }
}

Spring是否确保首先关闭CloseableBean2,然后关闭CloseableBean1

1 个答案:

答案 0 :(得分:2)

关于处理顺序的文件中没有具体内容,但...... 我们可以看到depends-on的{​​{3}},只有当bean没有明确依赖另一个时才应该使用depends-on。并且需要注意的是,依赖bean将始终首先被销毁。

在您的情况下,bean CloseableBean2 将首先销毁,因为它明确包含CloseableBean的依赖关系。

我更愿意提供额外的保护。类似的东西:

@Component
public class CloseableBean1 implements Closeable {

    private boolean closed = false;

    @Override
    public void close() throws IOException {
        if(closed) return;   
        outputStream.close();
        closed=true;
    }
}

官方文件description我们:

  

...并在抛出IOException之前在内部将Closeable标记为已关闭。

此方法有助于避免在已关闭的流上意外重复调用close()。但是如果在close()的第一次调用期间发生异常,我们将能够处理它。