Вот пример исходного кода:
Код: Выделить всё
@Setter(onMethod_ = @Autowired)
public abstract class BaseService {
protected FooService fooService;
}
@Service
@Setter(onMethod_ = @Autowired)
public class ConcreteService extends BaseService {
private BarService barService;
}
Код: Выделить всё
FooServiceВот возможные решения:
1. Реализовать конструктор-инъекция только в ConcreteService.
Код: Выделить всё
@Setter(onMethod_ = @Autowired)
public abstract class BaseService {
protected FooService fooService;
}
@Service
@RequiredArgsConstructor
public class ConcreteService extends BaseService {
private final barService BarService;
}
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;
}
}
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;
}
Все решения имеют свои плюсы и минусы, но, может быть, есть лучшее?
Подробнее здесь: https://stackoverflow.com/questions/691 ... nheritance
Мобильная версия