Spring внедрение зависимостей с наследованиемJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Spring внедрение зависимостей с наследованием

Сообщение Anonymous »

Я принял решение обновить свои сервисы с Spring внедрения установщика на внедрение конструктора, чтобы шаг за шагом избавиться от циклических зависимостей. Проблема в том, что сервисы используют наследование, а родительские и дочерние сервисы имеют свои собственные поля. Итак, вопрос в том, как лучше всего реализовать внедрение конструктора с помощью Lombok.
Вот пример исходного кода:

Код: Выделить всё

@Setter(onMethod_ = @Autowired)
public abstract class BaseService {

protected FooService fooService;
}

@Service
@Setter(onMethod_ = @Autowired)
public class ConcreteService extends BaseService {

private BarService barService;
}

Код: Выделить всё

FooService
используется как в BaseService, так и в ConcreteService.
Вот возможные решения:
1. Реализовать конструктор-инъекция только в ConcreteService.

Код: Выделить всё

@Setter(onMethod_ = @Autowired)
public abstract class BaseService {

protected FooService fooService;
}

@Service
@RequiredArgsConstructor
public class ConcreteService extends BaseService {

private final barService BarService;
}
Мы хорошо используем аннотацию @RequiredArgsConstructor, поскольку нет необходимости вызывать super(вызов super не поддерживается в Lombok< /код>). Код выглядит компактным, даже если в обоих классах больше полей. Но у нас по-прежнему нет внедрения конструктора в BaseService.
2. Добавьте защищенный конструктор в BaseService и вызовите super в конструкторе ConcreteService.

Код: Выделить всё

@RequiredArgsConstructor(AccessLevel.PROTECTED)
public abstract class BaseService {

protected final FooService fooService;
}

@Service
public class ConcreteService extends BaseService {

private final BarService barService;

public ConcreteService(FooService fooService, BarService barService) {
super(fooService);
this.barService = barService;
}
}
Основная цель достигнута - внедрение конструктора реализовано, BaseService выглядит хорошо, но у ConcreteService уродливый конструктор, в котором все параметры для обоих сервисов должны быть прошло (а их могло быть большое количество). Давайте попробуем еще раз.
3. Переместите все поля в ConcreteService, реализуйте защищенный метод получения в BaseService для доступа к FooService. .

Код: Выделить всё

public abstract class BaseService {

protected abstract FooService getFooService();
}

@Service
@RequiredArgsConstructor
public class ConcreteService extends BaseService {

private final FooService fooService;
private final BarService barService;

}
Основная цель тоже достигнута — у нас есть конструктор-инъекция, конструкторы выглядят чистыми, но теперь у нас должен быть FooService во всех BaseService наследники (конечно, полей может быть несколько).
Все решения имеют свои плюсы и минусы, но, может быть, есть лучшее?

Подробнее здесь: https://stackoverflow.com/questions/691 ... nheritance
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»