Создание экземпляров Java bean-ов

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