2016-10-14 3 views
2

Моего curent проект имеет две услуги:Как использовать @Autowired bean в суперклассе?

@Service 
public class OtherService{ 
} 

interface IService{ 
    void methodA(); 
    void methodB(); 
    void methodC(); 
} 

@Service 
public class DefaultService implement IService{ 

    @Autowried 
    private OtherService otherService; 

    public void methodA(){...}; 
    public void methodB(){...}; 
    public void methodC(){...}; 
} 

При реализации другой функции, я добавил новый бизнес-поток:

  • хочет повторно использовать Methoda, methodB
  • добавить новое правило при запуске methodC в новом потоке

Таким образом, мое решение создает new ChildService extends DefaultService и перезаписывает methodC ,

@Service 
public class ChildService extends DefaultService{ 

    @override    
    public void methodC(){ 
     //want to use some method of otherService 
    } 
} 

Проблема заключается в том methodC хотите использовать otherService боб в родительском классе. У меня есть два решения:

  1. изменение private OtherService otherService до protected OtherService otherService. Но мышление protected с @Autowired bean is not good practice?
  2. добавить @Autowried private OtherService otherService; в ChildService

Что лучше или любое предложение в этом случае?

+0

обе похоже прекрасный. Я бы пошел с 2, но это всего лишь вопрос. –

+0

добавить публичный/защищенный геттер для 'OtherService' – Leon

+0

Я очень обескураживаю душевное состояние 1. Поскольку скрытие атрибута затрудняет чтение кода. Фактически, я бы написал getter для атрибута и ввел атрибут в конструктор, а не сам вставлял сам атрибут (каждый раз, когда вы autowire атрибут, тест Unit умирает ...). – Turing85

ответ

1

Отредактировано.

Измените спецификатор доступа OtherService на защищенный или предоставите защищенный метод getOtherService() в DefaultService.

Смежные вопросы