Spring 是否确保 Closeable beans 以正确的顺序关闭?

Lam*_*bda 7 java spring

让我们假设我们有两个Closeablebean:

@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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Spring 是否确保CloseableBean2CloseableBean1关闭再关闭?

Ken*_*kov 6

文档中没有关于处置顺序的具体内容,但是......我们可以看到depends-ondepends-on只有当 bean 不明确依赖于另一个 bean 时才应该使用它。值得注意的是,依赖 bean 总是会首先被销毁。

在你的情况下,beanCloseableBean2 总是会首先被销毁,因为它包含CloseableBean.


我宁愿做额外的保护。就像是:

@Component
public class CloseableBean1 implements Closeable {

    private boolean closed = false;

    @Override
    public void close() throws IOException {
        if(closed) return;   
        outputStream.close();
        closed=true;
    }
}
Run Code Online (Sandbox Code Playgroud)

官方文档推荐我们:

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

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