Spring Framework поддерживает три способа создания бинов:
- создание бинов как стандартных объектов через конструктор;
- создание бинов через статический метод того же класса, что и бин;
- создание бинов через отдельную фабрику.
Структура проекта:
Как обычно, добавляем spring-context
в зависимости:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>ru.mydesignstudio.spring.core</groupId> <artifactId>ioc</artifactId> <version>1.0</version> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>LATEST</version> </dependency> </dependencies> </project>
Создадим классы бинов. DefaultConstructedBean
будет создаваться как обычный бин через публичный конструктор по умолчанию:
package ru.mydesignstudio.spring.core.ioc.beans; public class DefaultConstructedBean { public DefaultConstructedBean() { System.out.println("Default constructor executed"); } }
Экземпляр класса StaticMethodConstructedBean
имеет приватный конструктор, поэтому не может быть создан через new
, а создается через фабричный метод builder
:
package ru.mydesignstudio.spring.core.ioc.beans; public class StaticMethodConstructedBean { public static StaticMethodConstructedBean builder() { return new StaticMethodConstructedBean(); } private StaticMethodConstructedBean() { System.out.println("Created from private constructor via static factory method"); } }
Для создания экземпляров класса CustomBean
будет использоваться отдельная фабрика BeanFactory
:
package ru.mydesignstudio.spring.core.ioc.beans; public class CustomBean { }
package ru.mydesignstudio.spring.core.ioc.beans; public class BeanFactory { public CustomBean createBean() { System.out.println("Create CustomBean with factory"); // return new CustomBean(); } }
Контекст приложения описан в 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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="defaultConstructed" class="ru.mydesignstudio.spring.core.ioc.beans.DefaultConstructedBean"> </bean> <bean id="staticMethodConstructedBean" class="ru.mydesignstudio.spring.core.ioc.beans.StaticMethodConstructedBean" factory-method="builder"> </bean> <bean id="beanFactory" class="ru.mydesignstudio.spring.core.ioc.beans.BeanFactory"> </bean> <bean id="factoryConstructedBean" factory-bean="beanFactory" factory-method="createBean"> </bean> </beans>
Подробно рассмотрим bean defenition-ы.
Создание бина через конструктор по умолчанию
<bean id="defaultConstructed" class="ru.mydesignstudio.spring.core.ioc.beans.DefaultConstructedBean"> </bean>
Здесь id
– идентификатор бина, class
указывает, к какому классу этот бин относится.
Создание бина через фабричный метод того же класса
<bean id="staticMethodConstructedBean" class="ru.mydesignstudio.spring.core.ioc.beans.StaticMethodConstructedBean" factory-method="builder"> </bean>
Здесь id
– идентификатор бина, class
указывает на тип, а factory-method
на метод, который будет создавать экземпляры.
Создание бина через фабрику
<bean id="beanFactory" class="ru.mydesignstudio.spring.core.ioc.beans.BeanFactory"> </bean> <bean id="factoryConstructedBean" factory-bean="beanFactory" factory-method="createBean"> </bean>
Для создания бинов через фабрику необходимо сначала объявить бин фабрики, в данном случае это beanFactory
, а затем указать, какой ее метод используется для генерации объектов. В свойстве factory-bean
указывается id фабрики, factory-method
указывает на метод, который экземпляры создает.
Приложение получает бины обычным образом:
package ru.mydesignstudio.spring.core.ioc; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import ru.mydesignstudio.spring.core.ioc.beans.CustomBean; import ru.mydesignstudio.spring.core.ioc.beans.DefaultConstructedBean; import ru.mydesignstudio.spring.core.ioc.beans.StaticMethodConstructedBean; public class Application { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("common.xml"); context.getBean(DefaultConstructedBean.class); context.getBean(StaticMethodConstructedBean.class); context.getBean(CustomBean.class); } }
В результате запуска получим следующий вывод:
Default constructor executed Created from private constructor via static factory method Create CustomBean with factory