检查scoped bean是否为null

时间:2016-01-22 22:27:39

标签: java spring

在我的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?

2 个答案:

答案 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