1. 程式人生 > 程式設計 >通過工廠模式返回Spring Bean方法解析

通過工廠模式返回Spring Bean方法解析

工廠返回的可以是一個具體的物件,比如造一輛車,可以返回一個自行車物件,或者汽車物件。

但是在Spring 中需要工廠返回一個具體的Service,這就是一個抽象工廠了

一種方法是反射,個人覺得這種方式不好;

還有一種方法是巧妙的使用Map物件,工廠的一個優點就是可擴充套件,對於這種方式可以說是體現的淋漓盡致了,可以定義多個map,map裡也可以擴充

假設現在有一個介面類:BingService

以及實現了這個介面的兩個實現類: OneBingServiceImpl,TwoBingServiceImpl

1、在工廠類裡定義Map

import java.util.Map;
public class BingServiceFactory {
  //Map中的Value是 ServiceBean
  private Map<String,BingService> serviceMap;
  //返回對應的 Service
  public BingService getBingService(String platform) {
    return serviceMap.get(platform);
  }
  public Map<String,BingService> getServiceMap() {
    return serviceMap;
  }
  public void setServiceMap(Map<String,BingService> serviceMap) {
    this.serviceMap = serviceMap;
  }
}

2、是用註解方式,配置工廠,同時使用set 注入的方法,給用到工廠的bean來set一下

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;

@Configuration
public class BingConfiguration {
  @Resource
  private OneServiceImpl oneService;

  @Resource
  private TwoServiceImpl twoService;

  @Resource
  private TestServiceImpl testService;

  @Bean
  public BingServiceFactory createFactory() {
    BingServiceFactory factory = new BingServiceFactory();

    Map<String,BingService> serviceMap = new HashMap<>();
    serviceMap.put("One",oneService);
    serviceMap.put("Two",twoService);
    factory.setServiceMap(serviceMap);
    testService.setFactory(factory);
    return factory;
  }
}

@Bean 註解如果無效的話,可能得 @Bean("xxxxServiceFactory") 這樣的

3、使用set 注入的方方式來獲取工廠(當然也可以使用Autowired 註解注入)

import org.springframework.stereotype.Component;
@Component
public class TestServiceImpl {
  private BingServiceFactory factory;
  public void test() {
    BingService service = factory.getBingService("One");
  }
  public BingServiceFactory getFactory() {
    return factory;
  }
  public void setFactory(BingServiceFactory factory) {
    this.factory = factory;
  }
}

這個工廠可以優化的,不要Factory 這個類,直接使用Map 就行

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。