让我们假设我们有两个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
?
答案 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()
的第一次调用期间发生异常,我们将能够处理它。