Spring Factory Bean для реализаций с различными зависимостями - PullRequest
0 голосов
/ 11 октября 2018

Представьте, что у меня есть компонент хранения, который инкапсулирует логику, связанную с хранением моих сущностей.

public interface Storage {
   Object get(String id);
   String save(Object obj);
}

И у меня есть 3 реализации:

public FileStorage implements Storage { ... } // needs FileService
public RedisStorage implements Storage { ... } // needs JedisPool, RedisService and RedisSerializer
public MixedStorage implements Storage { ... } // combines other Storages

У меня также есть 2 свойства:

redis.enabled
file.enabled

В зависимости от этих свойств мне нужно либо создать один из компонентов, либо оба из них, используя MixedStorage (или ни одного, но это не входит в сферу применения).

Я создал фабричный компонент StorageFactory:

public class StorageFactory {
   // decide which impl to create basing on properties
}

Теперь я передаю все зависимые ресурсы, необходимые для всех реализаций (RedisSerializer, JedisPool, RedisService, FileService),Количество этих ресурсов может расти очень быстро при добавлении новых реализаций.

Есть ли способ не пропускать все зависимости, а инициализировать их позже?

Я использую XML

1 Ответ

0 голосов
/ 11 октября 2018

Я не знаю, будет ли это полезно для вас, но с помощью аннотаций это выглядит так:

Для бобов:

@Component("FileStorage")
public FileStorage implements Storage { ... }

Для обслуживания:

@Service
public class StorageFactory {
   @Autowired
   private Map<String,Storage> storageMap;//where key - bean name, value - class instance
}

И да, карта будет содержать все компоненты, но вы сможете реализовать некоторую логику, основанную на вашем файле свойств.

...