Механизм события часто используется в некоторых крупных проектах, поэтому весна специально обеспечивает набор интерфейсов механизма событий для использования. В этой статье говорится об использовании aphareEventpublisher.
В режиме разработки режим наблюдателя можно рассчитать как очень классический шаблон проектирования поведения: позвали кошку, хозяин проснулся, мышь побежала, этот классический пример — модель, управляемая событиями, на уровне дизайна.
Другой режим, режим публикации-подписки, часто приравнивается к режиму наблюдателя, но, насколько я понимаю, единственная разница между ними заключается в том, что для режима публикации-подписки требуется диспетчерский центр, а для режима наблюдателя — нет. Список наблюдателей может вестись непосредственно наблюдаемым. Однако, даже если они смешаны и используются друг вместо друга, обычно это не влияет на выражение.
И java, и spring имеют абстракцию Event, которая соответственно представляет поддержку событий на уровне языка и на уровне трехсторонней структуры.
Документация Spring для поддержки событий переводится следующим образом:
ApplicationContext обрабатывает события через класс ApplicationEvent и интерфейс ApplicationListener. Если bean-компонент, реализующий интерфейс ApplicationListener, внедряется в контекст, bean-компонент будет получать уведомление каждый раз, когда ApplicationEvent публикуется с использованием ApplicationContext. По сути, это стандартный шаблон проектирования Observer.
Давайте рассмотрим демонстрацию использования ApplicationEventPublisher в системе электронной коммерции.
Наша система требует, чтобы при регистрации пользователя отправлялось электронное письмо, информирующее его об успешной регистрации.
Затем инициализируйте очки для него, выпустите новый купон регистрации пользователя и т. Д.
Определите событие регистрации пользователя:
public class UserRegisterEvent extends ApplicationEvent{
public UserRegisterEvent(String name) { //name即source
super(name);
}
}
ApplicationEvent — это базовый класс всех классов событий, предоставляемых Spring.Для простоты зарегистрированное событие передает только имя (это может быть сложный объект, но обратите внимание на механизм сериализации).
Определите другую службу регистрации пользователей (издателя событий):
@Service
public class UserService implements ApplicationEventPublisherAware {
public void register(String name) {
System.out.println("用户:" + name + " 已注册!");
applicationEventPublisher.publishEvent(new UserRegisterEvent(name));
}
private ApplicationEventPublisher applicationEventPublisher;
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.applicationEventPublisher = applicationEventPublisher;
}
}
Следует отметить, что служба должна управляться контейнером Spring. ApplicationEventPublisherAware — это интерфейс, предоставляемый Spring для внедрения издателя событий ApplicationEventPublisher в Сервис. Используя этот интерфейс, наш собственный Сервис может публиковать события. После регистрации пользователя он больше не вызывает другие бизнес-службы, а публикует событие регистрации пользователя.
Создать почтовый сервис, сервис баллов, другие сервисы (подписчики событий) и т.д.:
@Service
public class EmailService implements ApplicationListener<UserRegisterEvent> {
@Override
public void onApplicationEvent(UserRegisterEvent userRegisterEvent) {
System.out.println("邮件服务接到通知,给 " + userRegisterEvent.getSource() + " 发送邮件...");
}
}
Служба подписчика событий также должна быть размещена в контейнере Spring. Интерфейс ApplicationListener — это интерфейс, предоставляемый Spring, который должен реализовать подписчик событий. Обычно мы передаем тип события, о котором заботится Служба, как общий тип. Чтобы обработать событие, вы можете получить конкретное содержимое события через event.getSource(), в данном случае имя пользователя. Две другие услуги также написаны таким же образом.Фактическая бизнес-операция заключается только в печати предложения.Ограничение по размеру здесь опущено.
Наконец, мы используем SpringBoot, чтобы написать класс запуска.
@SpringBootApplication
@RestController
public class EventDemoApp {
public static void main(String[] args) {
SpringApplication.run(EventDemoApp.class, args);
}
@Autowired
UserService userService;
@RequestMapping("/register")
public String register(){
userService.register("xttblog.com");
return "success";
}
}
На этом простая публикация и подписка на события в системе электронной коммерции завершена, как бы она не расширялась потом, нам нужно только добавить соответствующих подписчиков на события.