构造函数注入阻止自定义资源处理
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 的初始化顺序,在本例中允许 ChannelHandler
在 MessageSendingOperations
之前初始化。如果没有@Lazy
,MessageSendingOperations
会先初始化。
此外:从 Spring 4.3 开始,@Autowired
对于单参数构造函数是 no longer required。
+1 用于使用构造函数注入和 final
字段。
在我的(非平凡的)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 的初始化顺序,在本例中允许 ChannelHandler
在 MessageSendingOperations
之前初始化。如果没有@Lazy
,MessageSendingOperations
会先初始化。
此外:从 Spring 4.3 开始,@Autowired
对于单参数构造函数是 no longer required。
+1 用于使用构造函数注入和 final
字段。