Spring 使用弹簧的工厂模式

Spring 使用弹簧的工厂模式,spring,dependency-injection,factory-method,Spring,Dependency Injection,Factory Method,如何根据SpringBoot上的请求参数选择服务实现?我可以通过手动实例化服务来实现这一点,但这并没有利用Spring注入特性。 我也可以分别自动连接这两个服务,但我认为如果我有更多的实现,就会污染这个类 下面是一个粗略的例子: @RestController class RestControllerTest { @Autowired PizzaService pizzaService; public void bakePizza(@RequestParam("typ

如何根据SpringBoot上的请求参数选择服务实现?我可以通过手动实例化服务来实现这一点,但这并没有利用Spring注入特性。 我也可以分别自动连接这两个服务,但我认为如果我有更多的实现,就会污染这个类

下面是一个粗略的例子:

@RestController
class RestControllerTest {

    @Autowired
    PizzaService pizzaService;

    public void bakePizza(@RequestParam("type") String type,@RequestParam("extra") String extra) {

        if (type.equals("cheese")) {
            //set pizzaService Cheese Implementation
            pizzaService = new CheezePizza();
        } else {
            //set PizzaService vegetable Impleentation;
            pizzaService = new VegetablePizza();
        }
        pizzaService.prepareIngredients(extra);
        pizzaService.bakePizza();
    }

}

public abstract class PizzaService {

    String ingredients;

    public abstract void prepareIngredients(String exraIngredient);

    public void bakePizza() {
        System.out.println("baking pizza with " + ingredients);
    }
}

class CheezePizza extends PizzaService {

    @Override
    public void prepareIngredients(String exraIngredient) {
        ingredients = "Cheese " + exraIngredient;
    }
}

class VegetablePizza extends PizzaService {
    @Override
    public void prepareIngredients(String exraIngredient) {
        ingredients = "Vegetable " + exraIngredient;
    }
}

您可以自动关联相同类型的bean列表。假设您将
getType()
添加到您的
PizzaService
中,并将每个类型注册为Springbean

public abstract class PizzaService {
    abstract String getType();
}

@Component
class CheezePizza extends PizzaService {
    @Override
    public String getType() {
        return "cheese";
    }
}

@Component
class VegetablePizza extends PizzaService {
    @Override
    public String getType() {
        return "vegetable";
    }
}


@RestController
class RestControllerTest {

    private final Map<String, PizzaService> pizzaServices;

    public RestControllerTest(List<PizzaService> services) {
        pizzaServices = services.stream().collect(Collectors.toMap(PizzaService::getType, Function.identity()));
    }

    public void bakePizza(@RequestParam("type") String type, @RequestParam("extra") String extra) {
        PizzaService pizzaService = pizzaServices.get(type); // remember of handling missing type
        pizzaService.prepareIngredients(extra);
        pizzaService.bakePizza();
    }

}
公共抽象类披萨服务{
抽象字符串getType();
}
@组成部分
奶酪类比萨饼扩展比萨饼服务{
@凌驾
公共字符串getType(){
返回“奶酪”;
}
}
@组成部分
类蔬菜披萨扩展披萨服务{
@凌驾
公共字符串getType(){
返回“蔬菜”;
}
}
@RestController
类RestControllerTest{
私人最终地图披萨服务;
公共RestControllerTest(列表服务){
pizzaServices=services.stream().collect(Collectors.toMap(PizzaService::getType,Function.identity());
}
public void bakePizza(@RequestParam(“type”)字符串类型,@RequestParam(“extra”)字符串额外){
PizzaService PizzaService=pizzaServices.get(type);//记住处理缺少的类型
比萨饼服务。准备配料(额外);
pizzaService.bakePizza();
}
}

另一种方法是按照惯例给你的豆子命名,即
cheesePizza
vegetablePizza
,然后使用
ApplicationContext#getBean(type+“Pizza”)
,但我更喜欢第一种方法,因为它不那么神奇。

你可以自动生成相同类型豆子的列表。假设您将
getType()
添加到您的
PizzaService
中,并将每个类型注册为Springbean

public abstract class PizzaService {
    abstract String getType();
}

@Component
class CheezePizza extends PizzaService {
    @Override
    public String getType() {
        return "cheese";
    }
}

@Component
class VegetablePizza extends PizzaService {
    @Override
    public String getType() {
        return "vegetable";
    }
}


@RestController
class RestControllerTest {

    private final Map<String, PizzaService> pizzaServices;

    public RestControllerTest(List<PizzaService> services) {
        pizzaServices = services.stream().collect(Collectors.toMap(PizzaService::getType, Function.identity()));
    }

    public void bakePizza(@RequestParam("type") String type, @RequestParam("extra") String extra) {
        PizzaService pizzaService = pizzaServices.get(type); // remember of handling missing type
        pizzaService.prepareIngredients(extra);
        pizzaService.bakePizza();
    }

}
公共抽象类披萨服务{
抽象字符串getType();
}
@组成部分
奶酪类比萨饼扩展比萨饼服务{
@凌驾
公共字符串getType(){
返回“奶酪”;
}
}
@组成部分
类蔬菜披萨扩展披萨服务{
@凌驾
公共字符串getType(){
返回“蔬菜”;
}
}
@RestController
类RestControllerTest{
私人最终地图披萨服务;
公共RestControllerTest(列表服务){
pizzaServices=services.stream().collect(Collectors.toMap(PizzaService::getType,Function.identity());
}
public void bakePizza(@RequestParam(“type”)字符串类型,@RequestParam(“extra”)字符串额外){
PizzaService PizzaService=pizzaServices.get(type);//记住处理缺少的类型
比萨饼服务。准备配料(额外);
pizzaService.bakePizza();
}
}
另一种方法是按照惯例给你的豆子命名,即
cheesePizza
vegetablePizza
,然后使用
ApplicationContext#getBean(type+“Pizza”)
,但我更喜欢第一种方法,因为它没有那么神奇