2014-01-22 45 views
0

如果我有一类设置使用@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并且没有更好的方法?

回答

1

因为_myService是MyService类型,所以不能指向MyService2类型的实例,因为这不可能不触及java类。您必须更改java类,以便_myService具有通用的超类类型。

+0

但如果他们都来自同一个类扩展则它们是同一类型的,不是吗? – Stevanicus

+0

它们都扩展超类的类型但不是相同的类型,但问题是变量_myService被声明为MyService,因此它只能引用MyService类型的对象(表示MyService类型的对象或扩展类型的对象MyService),而MyService2类型的对象不是MyService类型。 } public class Animal {}' – AlAdler

+0

'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