在我的Spring-Java配置中,我有一个bean,注释如下:
@Bean
@Scope(value = "request", proxyMode = ScopedProxyMode.INTERFACES)
public Object foo() { ... }
此方法有时会返回null(如果没有任何实例)。在我的代码中,我想检查这种情况,如:
@Inject
Object foo
if (foo != null)
foo.be_wise();
但这不起作用,因为foo是代理的,因此永远不会为空!因此,检查我可以找到的null的唯一方法是触发NullPointerException,如下所示:
try
{
foo.dont_be_wise();
}
catch (NullPointerException e)
{
be_wise();
}
我不喜欢这样,因为抛出异常代价很高!
是否有其他方法可以检查代理bean是否为null?
答案 0 :(得分:0)
这可能适用于检索代理实例。在Spring 4.2.4中,这适用于@Autowired
- 注入的bean,我认为这基本上是相同的。
((org.springframework.aop.framework.Advised) foo).getTargetSource().getTarget()
答案 1 :(得分:0)
spring-test模块(Spring 4.2.4)中添加了对解包代理的支持。请参阅相关提交https://github.com/spring-projects/spring-framework/commit/efe3a35da871a7ef34148dfb65d6a96cac1fccb9
略有修改的例子(另见AopUtils):
if (AopUtils.isAopProxy(myBean) && (myBean instanceof Advised)) {
MyFoo target ((Advised) myBean).getTargetSource().getTarget();
if (target != null) {
// ...
}
}
虽然这是一种可行的方法,但仍有其他方法(可能更优雅的方法)来解决问题:
空对象
介绍接口的NoOp实现将null-ckecks从客户端代码中抽象出来。见Null Object Design Pattern。
在这种情况下,您的@Bean
方法永远不会返回null
。
有条件Bean注册
因为可以在@Conditional基础上实例化Spring 4.0 bean。 根据您的使用情况,这可能是一个选项。 请参阅Conditionally include @Bean methods。