Spring destroy-method&半注射物体

时间:2009-09-21 13:04:44

标签: spring

在春天,我经常发现自己正在使用init-method& bean上的destroy-method属性。我很好奇这些方法的合同。 init-method属性似乎被称为post构造,并且在设置了所有属性之后。我的问题是,如果destroy-method有相同的合同。如果setter因任何原因抛出,并且该对象没有设置其所有属性,spring将不会调用init-method,但是在这种情况下我找不到有关spring调用destroy-method的任何文档。

如果显然确实需要检查null,我很好奇其他人在这种情况下做了什么。

2 个答案:

答案 0 :(得分:2)

我做了一个简单的测试,我发现如果setter抛出异常,则不会调用init和destroy方法。

我认为这是合乎逻辑的事情。不应该允许setter失败 - 如果确实如此,框架可以做任何事情来帮助你。对这种错误的唯一反应是纠正设定者。所以我认为你的问题无关紧要。不应允许半注入的物体。

如果您知道setter可能会抛出异常,您应该捕获它并设置null引用或执行其他任何适当的操作。

答案 1 :(得分:2)

这里感兴趣的Spring代码是AbstractAutowireCapableBeanFactory.doCreateBean()(我正在查看Spring 3 M4源代码,但它应该与Spring 2.5基本相同)。这个方法做的最后一件事是注册bean以便处理,只有当方法的其余部分(包括实例化和初始化)成功时才会这样做。因此,如果bean初始化的任何部分失败,则不会调用destroy-method回调。