Конфигурация коллекций

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