Spring has events that can help facility functionalities of your application such as sending emails, calling a third party API, or processing an event asynchronously. The design pattern publisher and subscribers is exactly what spring boot events are.
First, create a spring event
To create a spring event, your event class has to extend the spring ApplicationEvent class. Here is an example of UserCreateEvent.
public class UserCreateEvent extends ApplicationEvent { private Logger log = LoggerFactory.getLogger(this.getClass()); public UserCreateEvent(User user) { super(user); log.info("UserCreateEvent, user={}", ObjectUtils.toJson(user)); } }
Second, create a publisher
A publisher has to be a spring bean. A publisher has to have a ApplicationEventPublisher field. You can create a method to call the publishEvent method on the ApplicationEventPublish class. Here is an example of a publisher.
@Component public class UserEventPublisher { private Logger log = LoggerFactory.getLogger(this.getClass()); @Autowired private ApplicationEventPublisher applicationEventPublisher; public void processUserCreate(User user) { UserCreateEvent userEvent = new UserCreateEvent(user); log.info("processUserCreate, userEvent={}",ObjectUtils.toJson(userEvent)); applicationEventPublisher.publishEvent(userEvent); } }
Lastly, create a listener
A spring event listener must be a spring bean. Anotate the event listener with @EventListener. There can be multiple listeners for an event. Listeners are by default synchronous. You can make listeners asychronous by adding @Async the method. Here is an example of a spring event listener.
@Component public class UserEventListener{ private Logger log = LoggerFactory.getLogger(this.getClass()); @Async @EventListener public void handleUserCreateEvent(UserCreateEvent createEvent) { log.info("handleUserCreateEvent, event={}",ObjectUtils.toJson(createEvent)); } }