【发布时间】: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