Конфигурация коллекций
Factory Method
FactoryBean
Конфигурация
Одним из способов кастомизированного создания новых экземпляров объектов является реализация интерфейса org.springframework.beans.factory.FactoryBean.
Этот интерфейс задаёт следующие методы:
- Object getObject(): возвращает экземпляр объекта созданного FactoryBean’ом.
- boolean isSingleton(): возвращает свойство является ли область видимости бина singleton или prototype.
- Class getObjectType(): возвращает тип создаваемого объекта, или null, если этот тип заранее определить нельзя.
Существует способ использования шаблона Factory не прибегая к созданию дополнительных утилитных классов.
Для этого можно воспользоваться XML конструкцией в файле конфигурации следующего вида:
<bean id="clientService" class="examples.ClientService" factory-method="createInstance"/> |
При этом, исходный код соответвующего factory bean’а выглядит следующим образом:
public class ClientService { private static ClientService clientService = new ClientService(); private ClientService() {} public static ClientService createInstance() { return clientService; }} |
Это приведёт к фактическому использованию статического factory метода, каждый раз, когда необходимо получить бин из контектса.
Альтернативным подходом является вызов определённого factory метода на определённом бине из контекста:
<!-- the factory bean, which contains a method called createInstance() --><bean id="serviceLocator" class="examples.DefaultServiceLocator"> <!-- inject any dependencies required by this locator bean --></bean> <!-- the bean to be created via the factory bean --><bean id="clientService" factory-bean="serviceLocator" factory-method="createClientServiceInstance"/> |
При этом исходный код имеет вид:
public class DefaultServiceLocator { private static ClientService clientService = new ClientServiceImpl(); private DefaultServiceLocator() {} public ClientService createClientServiceInstance() { return clientService; }} |
Данный подход позволяет использовать уже более гибкий шаблон Abstract Factory, так как работает с экземплярами объекта factory, а не со статическим методом.
Конфигурационный XML файл Spring позволяет в качестве зависимых объектов колабораторов вставлять экземпляры коллекции и конфигурировать их.
<bean id="moreComplexObject" class="example.ComplexObject"><!-- results in a setAdminEmails(java.util.Properties) call --><property name="adminEmails"> <props> <prop key="administrator">administrator@example.org</prop> <prop key="support">support@example.org</prop> <prop key="development">development@example.org</prop> </props></property><!-- results in a setSomeList(java.util.List) call --><property name="someList"> <list> <value>a list element followed by a reference</value> <ref bean="myDataSource" /> </list></property><!-- results in a setSomeMap(java.util.Map) call --><property name="someMap"> <map> <entry key="an entry" value="just some string"/> <entry key ="a ref" value-ref="myDataSource"/> </map></property><!-- results in a setSomeSet(java.util.Set) call --><property name="someSet"> <set> <value>just some string</value> <ref bean="myDataSource" /> </set></property></bean> |
В качестве значения для set или map могут быть использованы следующие элементы:
bean | ref | idref | list | set | map | props | value | null |