让我们假设我们有两个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 是否确保CloseableBean2先CloseableBean1关闭再关闭?
文档中没有关于处置顺序的具体内容,但是......我们可以看到depends-on,depends-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(),我们将能够处理它。
| 归档时间: |
|
| 查看次数: |
7408 次 |
| 最近记录: |