Как создать простой шаблон проектирования Factory в Spring-boot? - PullRequest
0 голосов
/ 16 мая 2019

Наличие этого класса StorageFactory.java, который должен вызываться из Singleton:

@Component
@Configuration
@PropertySource("classpath:application.properties")
public class StorageFactory {

    @Value("${storage.type}")
    private static String storageTypeString;

    @Autowired
    private IApplicationProperties applicationProperties;

    @Autowired
    private Environment env;

    private static StorageType storageType;

    public static IEntityStorage create() {
        IEntityStorage storage = null;

        storageType = applicationProperties.getStorageType();

        switch (storageType){
            case File:
                storage = new FileStorageImpl();
                break;

            default:
                throw new IllegalArgumentException("storage.type in application.properties is invalid.");
        }

        return storage;
    }

    public static StorageType getStorageType() {
        return storageType;
    }
}

Звонок из Синглтона:

public final class DataManager {

    private static StorageType storageType;

    private static IEntityStorage storage;

    private static DataManager instance = null;

    protected DataManager() {
        storage = StorageFactory.create(); <<<< Calling from here to create the factory
        storage.init();
        loadAll();
        storageType = StorageFactory.getStorageType();
    }

    public static DataManager getInstance() {
        if (instance == null){
            synchronized (DataManager.class){
                if (instance == null){
                    instance = new DataManager();
                }
            }
        }
        return instance;
    }
}

Я пытаюсь использовать Autowired ApplicationProperites.java (внутри StorageFactory .java) для получения моего свойства (storageType).

Я попытался решить проблему с автопроводкой несколькими подходами, но она не сработала.

Что я могу сделать, чтобы получить значение из файла свойств на этом этапе?

Ответы [ 2 ]

1 голос
/ 16 мая 2019

Вы можете использовать @Autowired с аннотациями @Qualifier.Давайте возьмем пример, есть один интерфейс, но есть несколько реализаций.Вы хотите, чтобы разные реализации в другом месте.Чтобы узнать больше об этом, перейдите по этой ссылке.https://www.mkyong.com/spring/spring-autowiring-qualifier-example/.

Я даю очень простой для вашего понимания.

@Component(value="bmw") 
public BMW implements Vehicle {}

@Component(value="mercedes") 
public Mercedes implements Vehicle {}

public class MyActualClass {

@Autowired @Qualifier("bmw")
private Vehicle vehicle;
 ... other code goes here
}
0 голосов
/ 16 мая 2019

Попробуйте это.

@Component
public class StorageFactory {
    private static IApplicationProperties applicationProperties;

    @Autowired
    private StorageFactory(IApplicationProperties applicationProperties) {
        StorageFactory.applicationProperties = applicationProperties;
    }
}
...