Spring 使用弹簧的工厂模式
如何根据SpringBoot上的请求参数选择服务实现?我可以通过手动实例化服务来实现这一点,但这并没有利用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
@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”)
,但我更喜欢第一种方法,因为它没有那么神奇