2011-01-26 7 views
3

В соответствии с Spring documentation on PropertyOverrideConfigurer вы не можете переопределить ссылки bean с механизмом конфигурации переопределения свойств. То есть вы можете предоставлять только литеральные значения:Переопределение ссылки на bean с использованием PropertyOverrrideConfigurer

Указанные значения переопределения всегда литеральные значения; они не являются переведены на ссылки bean. Это соглашение также применяется, когда исходное значение в XML-компоненте определяет спецификацию компонента.

Каково обходное решение, если я все еще хотел переконфигурировать проводку, используя переопределяющие файлы свойств?

Я знаю, что могу вернуться обратно к инъекции, а не к указанному bean-компоненту, кроме его имени. Затем я мог бы переопределить имя проводного бина, используя механизм переопределения свойств. Но это решение подразумевает использование интерфейса Spring - ApplicationContextAware и его метода getBean(String). Что-нибудь лучше?

+0

https://jira.springsource.org/browse/SPR-4905 –

ответ

0

Я думаю, вы вводите в заблуждение PropertyOverrideConfigurer с PropertyPlaceholderConfigurer. Два связаны между собой и очень похожи, но имеют различное поведение, в том числе и последний имеет возможность делать такие вещи, как это:

<property name="myProp"> 
    <ref bean="${x.y.z}" /> 
</property> 

где x.y.z это свойство, содержащее имя компонента.

Так вы можете использовать , чтобы изменить проводку с помощью PropertyPlaceholderConfigurer.

Редактировать: Другой альтернативой является отказ от конфигурации XML в целом и использование @Bean-style config in Java. Это дает полную гибкость выразительной способности java, поэтому вы можете в значительной степени делать то, что вам нравится.

+0

Спасибо. Я не думал о заполнителях, потому что хотел иметь определение проводки по умолчанию (в XML) и разрешить переопределение для кого-то, не изменяющего мои XML-файлы. Разве это не означает, что если я использую заполнители, я не могу предоставить значение по умолчанию в XML? –

+0

@Grzegorz: Вы должны иметь возможность шуметь что-то полезное с помощью SpEL: http: //static.springsource.орг/весна/документы/3.0.x/весна-каркасного ссылка/html/expressions.html – skaffman

1

Как скаффман, упомянутый в комментарии к их ответу, spel - обходное решение, о котором вы просите.

Этот пример работает для меня:

Dog.java

public class Dog { 

    private String name; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @Override 
    public String toString() { 
     return ReflectionToStringBuilder.toString(this); 
    } 

} 

override.properties

#person.d=#{dog1} 
person.d=#{dog2} 

Person.java

@Component 
public class Person { 

    private Dog d = new Dog(); 

    { 
     d.setName("buster"); 
    } 

    public Dog getD() { 
     return d; 
    } 

    public void setD(Dog d) { 
     this.d = d; 
    } 

    @Override 
    public String toString() { 
     return ReflectionToStringBuilder.toString(this); 
    } 

} 

Main.java

public class Main { 

    public static void main(String[] args) { 
     ClassPathXmlApplicationContext c = new ClassPathXmlApplicationContext("sandbox/spring/dog/beans.xml"); 
     System.out.println(c.getBean("person")); 
    } 

} 

beans.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans 
    xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:c="http://www.springframework.org/schema/c" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans.xsd 
      http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context.xsd"> 

    <context:component-scan base-package="sandbox.spring.dog"/> 

    <bean 
     class="org.springframework.beans.factory.config.PropertyOverrideConfigurer" 
     p:locations="classpath:/sandbox/spring/dog/override.properties"/> 

    <bean 
     id="dog1" 
     class="sandbox.spring.dog.Dog" 
     p:name="rover"/> 

    <bean 
     id="dog2" 
     class="sandbox.spring.dog.Dog" 
     p:name="spot"/>   

</beans> 
Смежные вопросы