Spring如果在定义上实例化,则不会注入bean

时间:2011-08-11 12:19:12

标签: java spring dependency-injection

我有一个像这样定义的会话范围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中的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。有没有办法看到代理代理的类?

3 个答案:

答案 0 :(得分:3)

您的配置中似乎缺少serviceImpl bean的定义。像

这样的东西
<bean id="serviceImpl" class="com.company.ServiceImpl" />

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

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

然后用简单的调试消息实现TestServiceImpl,表明构造和服务调用实际上正在工作。这个可以工作。如果是,您的原始服务定义有问题。如果没有,你的Bean有问题。

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

祝你好运!