Я не уверен, как я могу внедрить абстрактный класс и его расширения в шаблон проектирования моста в 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, нет ни одного.