Могу ли я автоматически подключить только один из нескольких аргументов для внедрения в конструктор? - PullRequest
1 голос
/ 15 декабря 2011

У меня есть бин, в который я хотел внедрить массив ресурсов .

org.springframework.core.io.Resource[]

На самом деле, массив InputStreamSource был достаточно хорош. Я хотел, чтобы мое определение бина выглядело примерно так:

<bean id="..." class="com.usta.SomeClass">
    <constructor-arg value="classpath:somedir/*.xml"/>
</bean>

где был мой конструктор:

public SomeClass(InputStreamSource[] sources);

Так как это не сработает, я неохотно выбрал

public SomeClass(InputStreamSource[] sources, ResourcePatternResolver resolver);

Но как теперь я могу внедрить ApplicationContext (который является ResourcePatternResolver ) в этот бин с помощью инжектора конструктора? Или я могу сказать только auto-wire этот аргумент конструктора?

Я знаю, что Setter Injection (с ResourceLoaderAware ) решит эту проблему, но я придерживаюсь Consructor Injection, насколько это возможно.

SomeClass использует Resources некоторая инициализация заранее; с внедрением сеттера мне придется отложить инициализацию и не сможет объявить ряд полей SomeClass final .

1 Ответ

1 голос
/ 15 декабря 2011

Это должно работать для вас ...

Конструктор:

public SomeClass(final Resource[] resources) { ... }

Конфигурация:

<bean id="patternResolver" class="org.springframework.core.io.support.PathMatchingResourcePatternResolver" />

<bean id="..." class="com.usta.SomeClass">
    <constructor-arg value="#{patternResolver.getResources('somedir/*.xml')}" />
</bean>
...