我正在学习一个教程,他们@Service一个类,在我看来应该可以在整个应用程序中使用。为什么@ Autowire-ing应用程序中的类?
应用程序:
@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
}
}
}
@Service
是@Component
的特殊化。它是一个注释,告诉Spring将此类作为Bean包含在Spring上下文中。您可以认为这是在告诉Spring在组件扫描期间要拾取什么并将其放入上下文中。
@Autowired
是Spring的注释,用于从上下文中注入某些内容。在声明要退出Spring的内容时,您可以想到这一点。通常,您需要在要Spring调用的任何字段,构造函数或setter上使用此批注,以为您提供其为给定类型管理的对象。
要回答您的问题,是的,您既需要声明要放入上下文中的内容,也要声明何时需要上下文中的内容。
此外,您的前三个注释可以替换为@SpringBootApplication
。该注释是一个元注释,这意味着它是包含一系列其他注释的简写。据记录,其中包括所有三个注释。