构造函数注入阻止自定义资源处理

Constructor injection preventing custom resource processing

在我的(非平凡的)Spring Boot 1.5.4 应用程序中,Spring Data REST 和 HATEOAS 利用 Spring websockets,我有一些自定义资源处理器,一些自定义控制器,以及一些自定义存储库。可悲的是,当我在一个特定的 Spring @Service class 中为 MessageSendingOperations 依赖项使用构造函数注入时,我的自定义资源处理器不再被调用。恢复构造函数注入恢复我的自定义资源处理器的执行,即恢复自:

private final MessageSendingOperations<String> messageTemplate;

@Autowired
public ChannelHandler(MessageSendingOperations<String> messageTemplate) {
    this.messageTemplate = messageTemplate;
}

至:

@Autowired
private MessageSendingOperations<String> messageTemplate;

"re-enables" 我的自定义资源处理器,结果是 null messageTemplate。所以,某处有问题……但是在哪里???任何想法如何追踪这个?

您是否尝试过 messageTemplate 延迟注入代理?例如:

public ChannelHandler(@Lazy MessageSendingOperations<String> messageTemplate) {
    this.messageTemplate = requireNonNull(messageTemplate, "messageTemplate");
}

来自Javadoc

In addition to its role for component initialization, this annotation may also be placed on injection points marked with Autowired or Inject: In that context, it leads to the creation of a lazy-resolution proxy for all affected dependencies, as an alternative to using ObjectFactory or Provider.

这通常会影响 bean 的初始化顺序,在本例中允许 ChannelHandlerMessageSendingOperations 之前初始化。如果没有@LazyMessageSendingOperations会先初始化。

此外:从 Spring 4.3 开始,@Autowired 对于单参数构造函数是 no longer required

+1 用于使用构造函数注入和 final 字段。