更改Spring上下文
问题描述:
如果我有一类设置使用@Value标注值更改Spring上下文
class myClass{
@Value(${myservice})
public MyService _myService;
}
bean的配置看起来有点像这样:
<bean id="myservice" class="tomy.MyService"></bean> //in Spring context
<bean id="myClass" class="tomy.myClass"></bean>
说,有人走来,并希望myClass使用myService2(与'myservice'共享公共超类)而不触及java类 - 是否有可能改变$ {myservice}的输出/“值”
即。
<bean id="myClass" class="tomy.myClass">
<property name="myservice" ref="myOtherService" /> //this of course doesn't work as it looks for the setter method of myService
</bean>
使
class myClass{
@Value(${myservice})
public MyService _myService;
}
_myService现在应该存储myOtherService的实例,而不是为myService
编辑:
也许有更好的方式来形容这将是.. 。如果可以从xml覆盖Autowired而不触及java bean并且没有更好的方法?
答
因为_myService是MyService类型,所以不能指向MyService2类型的实例,因为这不可能不触及java类。您必须更改java类,以便_myService具有通用的超类类型。
答
有些地方你必须让你的容器明白你想在MyClass
bean中注入你的MyService2
bean。所以它必须在你的xml配置或MyClass
类中。
对于这些类型的东西,通常Service Locator Pattern是大量使用。
Here您可以通过Martin Fowler找到传说中的博客文章Inversion of Control,讨论服务定位器和各种依赖注入的优缺点。
另请参见:
但如果他们都来自同一个类扩展则它们是同一类型的,不是吗? – Stevanicus
它们都扩展超类的类型但不是相同的类型,但问题是变量_myService被声明为MyService,因此它只能引用MyService类型的对象(表示MyService类型的对象或扩展类型的对象MyService),而MyService2类型的对象不是MyService类型。 } public class Animal {}' – AlAdler
'class Animal {}''class Cat extends Animal {}''class Dog extends Animal {}''Animal c = new Cat(); // ok''Animal d = new Dog (); // ok''Cat c2 = new Dog(); // not ok' – AlAdler