在Spring Framework中实现工厂的正确方法

时间:2016-05-24 19:26:46

标签: java spring spring-boot spring-rest

我有不同类型的Provider(界面)类,例如ProviderAProviderB等等。在正常的世界中,我会创建一个名为ProviderFactory的类,以便

public class ProviderFactory{
    public Provider getProviderByName(String providerName){
        for (Provider provider : availableProviders){
            if (provider.getName.equalIgnoreCase(providerName)){
                 return provider;
            }
        }
        return null;
    }
}

现在,我想知道有没有提供annotations来帮助我以单身方式使用这个工厂类?这些工厂本质上是静态的,可以在应用程序运行时配置它们。所以我在这里寻找单身实现。

3 个答案:

答案 0 :(得分:1)

默认情况下,

@Component / @Service / @Repository / @Controller / @RestController正在使用单一作用域。

答案 1 :(得分:0)

您可以在Spring中实现工厂模式,如下所示:

   @Component
    public class ProviderFactory {

        @Autowired
        private ProviderA providerA;

        @Autowired
        private ProviderB providerB;


        public static Provider getProviderByName(String providerName) {
            if (providerName.equalsIgnoreCase("providerA")) {
                return providerA;
            } else if (providerName.equalsIgnoreCase("providerB")) {
                return providerB;
            }
        }
    }

答案 2 :(得分:0)

如果您使用其中一个刻板印码注释(Provider@Component@Service@Repository@Controller对每个@RestController类进行注释,然后你可以@Autowire进入你的工厂:

@Component
public class ProviderFactory {

    @Autowired
    private List<Provider> availableProviders;

    public Provider getProviderByName(String providerName) {
        for (Provider provider : availableProviders) {
            if (provider.getName.equalIgnoreCase(providerName)){
                return provider;
            }
        }
        return null;
    }
}

但是,如果您打算在其他Spring bean中使用Provider实例,我建议将@Qualifier@Autowire结合使用,让Spring解决使用哪个实例,例如

@Component
public class ClassThatDependsOnSpecificProvider {

    @Autowired
    @Qualifier("providerA")
    private Provider providerA;

}

有关@Qualifier的更多信息,请参阅Spring参考文档的Fine-tuning annotation-based autowiring with qualifiers章节。