Рубрики
Без рубрики

Создание Весенних Бобов С Помощью Заводских Методов

Узнайте, как создавать компоненты Spring с использованием методов экземпляра и статической фабрики

Автор оригинала: Justin Albano.

1. введение

Фабричные методы могут быть полезным методом для сокрытия сложной логики создания в одном вызове метода.

В то время как мы обычно создаем бобы весной с помощью конструктора или инъекции поля , мы также можем создавать Весенние бобы с помощью заводских методов .

В этом уроке мы рассмотрим создание Spring beans с использованием методов экземпляра и статической фабрики.

2. Метод фабрики экземпляров

Стандартная реализация шаблона фабричного метода заключается в создании метода экземпляра, который возвращает нужный компонент.

Кроме того, мы можем настроить Spring для создания желаемого компонента с аргументами или без аргументов .

2.1. Без Аргументов

Мы можем создать класс Foo , который представляет создаваемый нами боб:

public class Foo {}

Затем мы создаем класс Instance Foo Factory , который включает в себя фабричный метод CreateInstance , который создает наш Food bean:

public class InstanceFooFactory {

    public Foo createInstance() {
        return new Foo();
    }
}

После этого мы настраиваем Spring:

  1. Создайте боб для нашего фабричного класса ( Экземпляр Foo Factory )
  2. Используйте атрибут factory-bean для ссылки на наш заводской боб
  3. Используйте атрибут factory-method для ссылки на наш заводской метод ( CreateInstance )

Применяя это к конфигурации Spring XML, мы получаем:



    

    

Наконец, мы автоматически подключаем желаемый Foo bean. Затем Spring создаст наш боб, используя наш метод CreateInstance factory:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/factorymethod/instance-config.xml")
public class InstanceFooFactoryIntegrationTest {

    @Autowired
    private Foo foo;
    
    @Test
    public void givenValidInstanceFactoryConfig_whenCreateFooInstance_thenInstanceIsNotNull() {
        assertNotNull(foo);
    }
}

2.2. С Аргументами

Мы также можем предоставить аргументы нашему методу фабрики экземпляров, используя конструктор-arg элемент в нашей конфигурации Spring.

Во-первых, мы создаем класс Bar , который использует аргумент:

public class Bar {

    private String name;

    public Bar(String name) {
        this.name = name;
    }

    // ...getters & setters
}

Затем мы создаем класс фабрики экземпляра, Instance Var Factory , с фабричным методом , который принимает аргумент и возвращает Bar bean:

public class InstanceBarFactory {

    public Bar createInstance(String name) {
        return new Bar(name);
    }
}

Наконец, мы добавляем элемент constructor-arg в наше определение Bar bean:



    

    
        
    

Затем мы можем автоматически подключить наш Bar bean таким же образом, как мы это сделали для нашего Food bean:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/factorymethod/instance-bar-config.xml")
public class InstanceBarFactoryIntegrationTest {

    @Autowired
    private Bar instance;
    
    @Test
    public void givenValidInstanceFactoryConfig_whenCreateInstance_thenNameIsCorrect() {
        assertNotNull(instance);
        assertEquals("someName", instance.getName());
    }
}

3. Статический Заводской метод

Мы также можем настроить Spring на использование статического метода в качестве заводского метода.

Хотя методы фабрики экземпляров должны быть предпочтительными, этот метод может быть полезен, если у нас есть существующие устаревшие статические методы, которые производят нужные компоненты. Например, если заводской метод возвращает синглтон, мы можем настроить Spring для использования этого заводского метода синглтона.

Подобно методам фабрики экземпляров, мы можем настраивать статические методы с аргументами и без них.

3.1. Без Аргументов

Используя наш класс Foo в качестве желаемого компонента, мы можем создать класс Singleton Foo Factory , который включает в себя метод CreateInstance factory, возвращающий одноэлементный экземпляр Foo :

public class SingletonFooFactory {

    private static final Foo INSTANCE = new Foo();
    
    public static Foo createInstance() {
        return INSTANCE;
    }
}

На этот раз нам нужно создать только один боб. Для этого компонента требуется только два атрибута:

  1. класс – объявляет наш заводской класс ( SingletonFooFactory )
  2. factory-method – объявляет статический заводской метод ( CreateInstance )

Применяя это к нашей конфигурации Spring XML, мы получаем:



    

Наконец, мы автоматически подключаем наш Food bean, используя ту же структуру, что и раньше:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/factorymethod/static-foo-config.xml")
public class SingletonFooFactoryIntegrationTest {

    @Autowired
    private Foo singleton;
    
    @Test
    public void givenValidStaticFactoryConfig_whenCreateInstance_thenInstanceIsNotNull() {
        assertNotNull(singleton);
    }
}

3.2. С Аргументами

В то время как мы должны избегать изменения состояния статических объектов , таких как наш синглтон, когда это возможно , мы все еще можем передавать аргументы нашему статическому фабричному методу.

Для этого мы создаем новый фабричный метод, который принимает наши желаемые аргументы:

public class SingletonBarFactory {

    private static final Bar INSTANCE = new Bar("unnamed");
    
    public static Bar createInstance(String name) {
        INSTANCE.setName(name);
        return INSTANCE;
    }
}

После этого мы настраиваем Spring для передачи нужного аргумента с помощью элемента constructor-arg :



    
        
    

Наконец, мы автоматически подключаем наш Bar bean, используя ту же структуру, что и раньше:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/factorymethod/static-bar-config.xml")
public class SingletonBarFactoryIntegrationTest {

    @Autowired
    private Bar instance;
    
    @Test
    public void givenValidStaticFactoryConfig_whenCreateInstance_thenNameIsCorrect() {
        assertNotNull(instance);
        assertEquals("someName", instance.getName());
    }
}

4. Заключение

4. Заключение

В то время как создание компонентов с помощью конструктора и инъекции полей более распространено, заводские методы могут быть удобны для сложных этапов создания и устаревшего кода.

Код, используемый в этой статье, можно найти на GitHub .