我有一个像这样定义的会话范围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
。有没有办法看到代理代理的类?
答案 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有问题。
尝试将问题缩小到更简单。然后解决更简单的问题。
祝你好运!