【问题标题】:Spring not injecting bean if it is instantiated on definition如果在定义上实例化,Spring 不会注入 bean
【发布时间】:2011-08-11 12:19:11
【问题描述】:

我有一个像这样定义的会话范围 bean:

<!-- this is where the serviceImpl bean is defined -->
<import resource="classpath:META-INF/*-core-context.xml"/>

<bean id="myBean" class="com.company.Bean">
    <property name="service" ref="serviceImpl"/>
</bean>

现在在 bean 中,我为注入的服务定义了一个默认值,如下所示:

public class Bean {

    private Service service = new NullService();

    public void setService(Service service) {
        this.service = service;
    }
}

我想要做的是提供选择性注入服务的能力,如果你选择不注入服务,Bean 将使用 NullService 实现,它什么都不做,不会以任何方式影响 bean 逻辑。

问题在于,由于某种原因,serviceImpl 从未被注入,而我总是以 NullService 实现结束。

那么是否有一些弹簧设置或功能阻止它注入它?或者您对为什么会发生这种情况有任何其他想法?


更多信息

这是spring用来注入服务的setter:

public void setPermissionsService(PermissionService permissionsService) {
    this.permissionsService = permissionsService;

    System.out.println("setting permissions service to: " + permissionsService.getClass().getName());
    if (this.permissionsService instanceof NoopPermissionsServiceImpl) {
        System.out.println("NULL IMPLEMENTATION");
    }
    else if (this.permissionsService instanceof PermissionServiceImpl) {
        System.out.println("CORRECT IMPLEMENTATION");
    }
    else {
        System.out.println("WHAT ?!?!");
    }
}

它打印"WHAT ?!?!"

原来 spring 将其设置为动态代理 $Proxy859。有没有办法查看代理正在代理的类?

【问题讨论】:

  • 请提供缺失的相关实现细节。我的问题:你如何实例化 Bean?如果不是通过 Spring,这可以解释。另一件事可能是您的 serviceImpl 是 NullService,但我只能猜测
  • 你说Bean 是会话范围的(不在声明中,但没关系)。你如何获得它?它是由 Spring 创建的吗?如果您不确定,请添加 c-tor 并在此处放置断点以查看是否是 Spring 实例化并填充它。顺便说一句,Null Object 模式的使用很好,考虑将NullService 设为单例。
  • 我想不出其他相关的东西,你到底需要什么?更多Bean 详细信息或有关服务的信息?
  • @Tomasz 它由spring创建,当它实例化上下文时它实际上调用setService(Service service),我看不到哪个实现但是因为它用$Proxy859调用它,我正在调试现在就可以了,但我想我可以问一下它是否简单。
  • @pvblivs 一些细节:我最喜欢的颜色是蓝色 :),你需要什么细节?谢谢。

标签: java spring dependency-injection


【解决方案1】:

您的配置中似乎缺少serviceImpl bean 的定义。类似的东西

<bean id="serviceImpl" class="com.company.ServiceImpl" />

【讨论】:

  • 不在那里,我只是没有发布它。如果它不在那里,我会看到异常。鉴于我提供的信息,这是一个有效的答案,非常感谢。
  • 我看到这被投票赞成,但这不是问题,因为如果未定义服务,我会在 spring 尝试实例化 Bean 时看到异常。
【解决方案2】:

我看到你的问题的唯一解决方案是对此进行逆向工程。在同一个 spring.xml 中做类似的事情:

<bean id="myBean" class="com.company.Bean">
  <property name="service" ref="testServiceImpl"/>
</bean>

<bean id="testServiceImpl" class="com.company.TestServiceImpl" />

然后使用简单的调试消息实现TestServiceImpl,指示构造和您的服务调用实际上正在工作。这必须起作用。如果是,您的原始服务定义有问题。如果不是,你的 Bean 有问题。

尝试将问题缩小到更简单的范围。然后解决更简单的问题。

祝你好运!

【讨论】:

  • 在我真正发现问题后,我看到了你的答案,但是如果我尝试一下,这会奏效。问题是我在另一个上下文中定义了另一个bean,比如&lt;bean id="bean" class="com.company.Bean"&gt;,并且没有注入服务。所以实际上使用bean 的bean 总是收到带有空服务的实例。感谢您的帮助。
  • Dang,我遇到了同样的问题,但奇怪的是,子应用程序上下文确实有一个同名的 bean,但还没有加载。就好像 Spring 内省了子上下文,即使它没有被加载。这是 Spring 3.0.5.RELEASE。
【解决方案3】:

不要使用instanceof,而是使用Class.isAssignableFrom(Class)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2012-11-30
    相关资源
    最近更新 更多