Если класс уже @Service, то должен ли он быть @Autowired в классе Spring Application? - PullRequest
1 голос
/ 17 октября 2019

Я следую учебному пособию, и они @Service класс, который, по моему мнению, должен сделать его доступным для всего приложения. Почему класс @ Autowire-in в приложении?

Приложение:

@Configuration
@EnableAutoConfiguration    // todo why not @SpringBootApplication
@ComponentScan
public class QuoteAppWsApplication implements CommandLineRunner {


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


    @Autowired
    private EventBus eventBus;  //

    @Autowired // todo This is @Service...why is it be Autowired
    private NotificationConsumer notificationConsumer;

NotificationConsumer:

@Service
public class NotificationConsumer implements Consumer<Event<NotificationData>> {

    @Autowired
    private NotificationService notificationService;

    @Override
    public void accept(Event<NotificationData> notificationDataEvent) {  // .getData() belongs to Event<>
        NotificationData notificationData = notificationDataEvent.getData(); //TODO Gets data from Event

        try {
            notificationService.initiateNotification(notificationData);
        } catch (InterruptedException e) {
            // ignore
        }
    }
}

1 Ответ

1 голос
/ 17 октября 2019

@Service является специализацией @Component. Это аннотация, которая сообщает Spring, чтобы включить этот класс в виде Bean-компонента в контекст Spring. Вы можете думать об этом как о том, что Spring говорит, что взять и вставить в контекст во время сканирования компонента.

@Autowired - это аннотация Spring для вставки чего-либо из контекста. Вы можете думать об этом как о том, что вы хотите получить от Spring. В общем, вам нужно использовать эту аннотацию для любого поля, конструктора или установщика, которые вы хотите, чтобы Spring вызывал для предоставления вам объекта, которым он управляет для данного типа.

Чтобы ответить на ваш вопрос, да,вам нужно и объявить, что вы хотите поместить в контекст, и когда вы хотите что-то из контекста.

Кроме того, ваши первые три аннотации можно заменить на @SpringBootApplication. Эта аннотация является метааннотацией, то есть это аннотация, которая сокращенно включает серию других аннотаций. Документально, среди прочего, включены все три ваши аннотации.

...