pak*_*man 4 spring dependency-injection proxy-classes cglib
任何人都知道如何将依赖项注入@ControllerAdvice?
我的@ControllerAdvice扩展了Spring的ResponseEntityExceptionHandler并且没有实现任何接口。
@ControllerAdvice 被正确调用,但 @Autowired 依赖项从未被注入。没有启动注入错误,依赖项只是空的。
我想这与 Spring 如何使用 cglib 代理 @ControllerAdvice 以使 @Autowired 注释丢失有关。
我通过实现一个接口进行测试,这样Spring可以创建一个JDK代理,但它也不起作用。实际上,对于一个接口,它甚至根本没有被调用......即使我也用 @ControllerAdvice 注释该接口。
有没有办法指定 Spring 在特定情况下应使用 JDK 代理?
编辑:顺便说一句,我正在使用 Spring 3.2.4.RELEASE。
示例类:
@ControllerAdvice
public class RestExceptionHandler extends ResponseEntityExceptionHandler {
@Autowired(required = true)
public AuditService auditService;
@ExceptionHandler(value = { RuntimeException.class })
public final ResponseEntity<Object> handleRuntimeException(Exception ex, WebRequest request) {
// auditService is null here!
}
}
Run Code Online (Sandbox Code Playgroud)
在您的情况下,您的 bean 位于 CGLIB 代理后面。它创建了 bean 的子类,并且由于该方法具有final
修饰符,因此它无法更改原始ResponseEntityExceptionHandler
类的行为以在后面插入对 bean 的调用 - 请检查我关于 CGLIB 的其他答案。
CGLIB 代理是一个不同的对象,它将方法调用委托给原始 bean。
请注意,仅通过子类化(即没有这种对象分离)来实现 Spring 的大部分功能是不可能的。singleton-scoped
当bean 引用一个bean时它会如何工作session-scoped
- 显然有很多session-scope
bean 而只有一个singleton-scoped
bean。
归档时间: |
|
查看次数: |
5941 次 |
最近记录: |