Невозможно различить guish объектов для инъекций в шаблоне проектирования Bridge с помощью среды загрузки Spring - PullRequest
1 голос
/ 28 апреля 2020

Я не уверен, как я могу внедрить абстрактный класс и его расширения в шаблон проектирования моста в Spring. Давайте рассмотрим пример формы шаблона класса c для моста:

Цвет. java

public interface Color {

  String fill();
}

Синий. java

@Service("Blue")
public class Blue implements Color {
  @Override
  public String fill() {
    return "Color is Blue";
  }
}

Красный. java

@Service("Red")
public class Red implements Color {
  @Override
  public String fill() {
    return "Color is Red";
  }
}

Форма. java

public abstract class Shape {
  protected Color color;

  @Autowired
  private Something something;

  @Value(${foo.bar})
  private String fooBar;

  public Shape(Color color){
    this.color = color;
  }

  abstract public String draw();
}

Квадрат. java

public class Square extends Shape {

  public Square(Color color) {
    super(color);
  }

  @Override
  public String draw() {
    return "Square drawn. " + color.fill();
  }
}

Треугольник. java

public class Triangle extends Shape {

  public Triangle(Color color) {
    super(color);
  }

  @Override
  public String draw() {
    return "Triangle drawn. " + color.fill();
  }
}

BridgeApplication. java

@SpringBootApplication
public class BridgeApplication {
  public static void main(String[] args) {
    SpringApplication.run(BridgeApplication.class, args);
  }
}

Контроллер:

@RestController
public class BridgeController {

  @Autowired
  @Qualifier("Red")
  private Color red;

  @GetMapping("/red")
  @ResponseStatus(HttpStatus.OK)
  public String redSquare() {
    Shape square = new Square(red);
    return square.draw();
  }

}

Проблема возникает, когда мы хотим внедрить абстрактный класс Shape или его расширения, такие как Square или Triangle. Из-за того, что конструктор принимает объект Color, и мы не можем решить, является ли Color типом Red или Blue (в этом весь смысл использования шаблона проектирования Bridge), мы не можем определить Shape или его расширения должны быть Spring Bean, потому что будет доступно несколько компонентов типа Color. Простой обходной путь подобен тому, что я сделал, чтобы создать объект напрямую, а не вводить его. Однако теперь возникнут все проблемы, связанные с любым значением, которое я внедряю, или любым другим Бином, который я хотел бы внедрить в класс Shape или его расширения (например, fooBar или something), поскольку соответствующие классы создаются вручную.

Одним из решений является начало работы с ручным внедрением, которое создаст много ненужных сложностей с ценностью и внедрением бобов, и это совсем не чистое решение. Например, , или , вопрос . Поэтому мне было интересно, есть ли чистый способ иметь какую-либо форму шаблона проектирования Bridge в среде Spring или из-за ограничений Spring, нет ни одного.

1 Ответ

0 голосов
/ 28 апреля 2020

Вы можете взять боб из ApplicationContext ..... Но вам нужно передать цвет, чтобы взять бин ....

Вот один пример:

@RestController
public class BridgeController {

    private final Color red;
    private final Shape redSquareShape;

    public BridgeController(@Qualifier("Red") Color red,
                            ApplicationContext applicationContext) {
        this.red = red;
        this.redSquareShape = (Shape) applicationContext.getBean("square", red);
    }

    @GetMapping("/red")
    @ResponseStatus(HttpStatus.OK)
    public String redSquare() {
        Shape square = new Square(red);
        return square.draw();
    }

}
...