【发布时间】:2011-08-12 02:15:46
【问题描述】:
我正在使用 Spring-AOP 支持通过 @Inject 将引用注入到不受 Spring beanfactory 管理的对象中。例如:
@Configurable(preConstruction=true)
class DefaultContent implements Content
{
@Inject @Nonnull
private Site site;
@Inject @Nonnull
private ModelFactory modelFactory;
public DefaultContent (final @Nonnull FileObject file)
{
resource = modelFactory.createResource(file); // <--here
}
我正在使用静态代码编织。
我想我对所有相关技术都很了解,而且这确实可以正常工作……在正常的开发周期中(使用 Maven)。昨天我准备了一个版本(使用 Maven 发布插件),并且该版本中的二进制文件似乎无法注入,因为我在标有“这里”的行处获得了 NPE。
为了更好地解释,直到昨天我的项目还处于 SNAPSHOT 模式 (1.0-ALPHA-2-SNAPSHOT)。快照工作的二进制文件。来自 1.0-ALPHA-2 的二进制文件,发布模式,不要。下一个快照 1.0-ALPHA-3-SNAPSHOT 中的二进制文件再次工作。唯一的黑洞是已发布的二进制文件。用 diff 看,SNAPSHOT 和 release 之间没有其他区别,只是模块的版本标签。
到目前为止,我已经排除了问题是由于 Maven 发布过程中的一些奇怪的事情造成的,因为即使我在“普通”构建中从标记的源重新创建 1.0-ALPHA-2 时,二进制文件也有问题(也就是说,只需 mvn clean install)。我还使用 Java 反编译器来查看错误类的有效源(挥动后),比较来自 1.0-ALPHA-2 和 1.0-ALPHA-3-SNAPSHOT 的代码。它们看起来相同。最后,我比较了二进制文件(一个在 Jetty 中运行的 .war 文件),它们包含相同的项目(也就是说,没有缺少依赖项,唯一的区别是我的 jar 文件具有不同的版本)。
我需要一些建议来更好地理解这个错误,因为目前我不知道还能尝试什么。
【问题讨论】:
-
你真的要求 Spring 进行注入吗? IIRC,默认情况下它不会(并且它只查看 beans,尽管您可以使用
@Configuration将对象引入 Spring 并将它们转换为 bean)。 -
正如我所说,当 Maven 模块被版本化为 SNAPSHOT 时,代码可以完美运行。在 beans.xml 中有打开注入所需的所有东西(否则它在 SNAPSHOT 中也不起作用)。