barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

пятница, 18 апреля 2014 г.

Spring Beans: свой bean вместо String

Проблема

В xml-конфиге спринговых бинов есть некий бин, принимающий аргументом конструктора строку:
<constructor-arg index="0">
<value>xxx</value>
</constructor-arg>
 Хочется эту строку формировать своим бином вместо хардкода ее в xml.

Решение

Первая идея - унаследоваться от String и заменить <value> на <bean class="my.super.Bean">. Но нет - java.lang.String объявлен как final. Следующая мысль - использовать конструктор класса String, принимающий StringBuilder, и опять таки переопределить SpringBuilder своим классом. Но снова неудача - java.lang.StringBuilder также является final. Но StringBuilder уже лучше String'а тем, что имеет конструктор, принимающий CharSequence. А это - уже интерфейс, и его можно свободно имплементировать, реализовав ту логику, которую нужно. В итоге получаем нечто подобное:
<constructor-arg index="0">
<bean class="java.lang.String">
<constructor-arg>
<bean class="java.lang.StringBuilder">
<constructor-arg>
<bean class="my.super.CharSequenceImpl">
<!-- ... -->
</bean>
</constructor-arg>
</bean>
</constructor-arg>
</bean>
</constructor-arg>

Комментариев нет:

Отправить комментарий