diff --git a/spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/AsyncListener.java b/spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/AsyncListener.java new file mode 100644 index 0000000..84564d7 --- /dev/null +++ b/spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/AsyncListener.java @@ -0,0 +1,16 @@ +package io.reflectoring.eventsdemo; + +import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +@Component +public class AsyncListener { + + @Async + @EventListener + public void handleAsyncEvent(String event) { + System.out.println(String.format("Async event recevied: %s", event)); + } + +} diff --git a/spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/EventsDemoApplication.java b/spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/EventsDemoApplication.java index ad23db3..4a29cb9 100644 --- a/spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/EventsDemoApplication.java +++ b/spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/EventsDemoApplication.java @@ -2,15 +2,16 @@ package io.reflectoring.eventsdemo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; - -import io.reflectoring.eventsdemo.listeners.SpringBuiltInEventsListener; +import org.springframework.scheduling.annotation.EnableAsync; @SpringBootApplication +@EnableAsync public class EventsDemoApplication { public static void main(String[] args) { SpringApplication springApplication = new SpringApplication(EventsDemoApplication.class); - springApplication.addListeners(new SpringBuiltInEventsListener()); + // uncomment below line if you are not using spring.factories + // springApplication.addListeners(new SpringBuiltInEventsListener()); springApplication.run(args); } diff --git a/spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/Publisher.java b/spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/Publisher.java new file mode 100644 index 0000000..1afb88c --- /dev/null +++ b/spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/Publisher.java @@ -0,0 +1,27 @@ +package io.reflectoring.eventsdemo; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.stereotype.Component; + +@Component +class Publisher { + + @Autowired + private ApplicationEventPublisher publisher; + + void publishEvent() { + // Async Event + publisher.publishEvent("I'm Async"); + + + // @EventListener Annotated and ApplicationListener + publisher.publishEvent(new UserCreatedEvent(this, "Lucario")); + publisher.publishEvent(new UserRemovedEvent("Lucario")); + + // Conditional Listener + publisher.publishEvent(new UserCreatedEvent(this, "reflectoring")); + publisher.publishEvent(new UserRemovedEvent("reflectoring")); + + } +} diff --git a/spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/ReturnedEvent.java b/spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/ReturnedEvent.java new file mode 100644 index 0000000..ad80775 --- /dev/null +++ b/spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/ReturnedEvent.java @@ -0,0 +1,5 @@ +package io.reflectoring.eventsdemo; + +public class ReturnedEvent { + +} diff --git a/spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/listeners/SpringBuiltInEventsListener.java b/spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/SpringBuiltInEventsListener.java similarity index 80% rename from spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/listeners/SpringBuiltInEventsListener.java rename to spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/SpringBuiltInEventsListener.java index 979ebcf..d36fd13 100644 --- a/spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/listeners/SpringBuiltInEventsListener.java +++ b/spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/SpringBuiltInEventsListener.java @@ -1,4 +1,4 @@ -package io.reflectoring.eventsdemo.listeners; +package io.reflectoring.eventsdemo; import org.springframework.beans.BeansException; import org.springframework.boot.context.event.ApplicationReadyEvent; @@ -7,9 +7,7 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationListener; -import io.reflectoring.eventsdemo.publisher.Publisher; - -public class SpringBuiltInEventsListener implements ApplicationListener, ApplicationContextAware{ +class SpringBuiltInEventsListener implements ApplicationListener, ApplicationContextAware{ ApplicationContext applicationContext; @@ -28,7 +26,7 @@ public class SpringBuiltInEventsListener implements ApplicationListener { + + @Override + public void onApplicationEvent(UserCreatedEvent event) { + System.out.println(String.format("User created: %s", event.getName())); + } +} diff --git a/spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/UserRemovedEvent.java b/spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/UserRemovedEvent.java new file mode 100644 index 0000000..f8d7bfa --- /dev/null +++ b/spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/UserRemovedEvent.java @@ -0,0 +1,15 @@ +package io.reflectoring.eventsdemo; + +class UserRemovedEvent { + + public String name; + + UserRemovedEvent(String name) { + this.name = name; + } + + String getName() { + return this.name; + } + +} diff --git a/spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/UserRemovedListener.java b/spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/UserRemovedListener.java new file mode 100644 index 0000000..624c0ea --- /dev/null +++ b/spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/UserRemovedListener.java @@ -0,0 +1,34 @@ +package io.reflectoring.eventsdemo; + +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; +import org.springframework.transaction.event.TransactionPhase; +import org.springframework.transaction.event.TransactionalEventListener; + +@Component +public class UserRemovedListener { + + @EventListener + public ReturnedEvent handleUserRemovedEvent(UserRemovedEvent event) { + System.out.println(String.format("User removed (@EventListerner): %s", event.getName())); + // Spring will send ReturnedEvent as a new event + return new ReturnedEvent(); + } + + // Listener to receive the event returned by Spring + @EventListener + public void handleReturnedEvent(ReturnedEvent event) { + System.out.println("ReturnedEvent received."); + } + + @EventListener(condition = "#event.name eq 'reflectoring'") + public void handleConditionalListener(UserRemovedEvent event) { + System.out.println(String.format("User removed (Conditional): %s", event.getName())); + } + + @TransactionalEventListener(condition = "#event.name eq 'reflectoring'", phase=TransactionPhase.AFTER_COMPLETION) + public void handleAfterUserRemoved(UserRemovedEvent event) { + System.out.println(String.format("User removed (@TransactionalEventListener): %s", event.getName())); + } + +} diff --git a/spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/events/UserCreatedEvent.java b/spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/events/UserCreatedEvent.java deleted file mode 100644 index 6ab425d..0000000 --- a/spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/events/UserCreatedEvent.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.reflectoring.eventsdemo.events; - -import org.springframework.context.ApplicationEvent; - -public class UserCreatedEvent extends ApplicationEvent { - - private static final long serialVersionUID = 1L; - private String name; - - public UserCreatedEvent(String name) { - super(name); - this.name = name; - } - - public String getName() { - return this.name; - } - -} diff --git a/spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/listeners/UserCreatedListener.java b/spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/listeners/UserCreatedListener.java deleted file mode 100644 index cfa7383..0000000 --- a/spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/listeners/UserCreatedListener.java +++ /dev/null @@ -1,27 +0,0 @@ -package io.reflectoring.eventsdemo.listeners; - -import org.springframework.context.ApplicationListener; -import org.springframework.context.event.EventListener; -import org.springframework.stereotype.Component; - -import io.reflectoring.eventsdemo.events.UserCreatedEvent; - -@Component -public class UserCreatedListener implements ApplicationListener { - - @EventListener - public void handleUserCreatedEvent(UserCreatedEvent event) { - System.out.println("User created event triggered with annotated listener. Created user: " + event.getName()); - } - - @EventListener - public void handleUserCreatedEvent2(UserCreatedEvent event) { - System.out.println("Another listener listening to user created event: " + event.getName()); - } - - - @Override - public void onApplicationEvent(UserCreatedEvent event) { - System.out.println("User created event triggered with ApplicationListener implemented listener. Created user: " + event.getName()); - } -} diff --git a/spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/publisher/Publisher.java b/spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/publisher/Publisher.java deleted file mode 100644 index 333df35..0000000 --- a/spring-boot/spring-events/src/main/java/io/reflectoring/eventsdemo/publisher/Publisher.java +++ /dev/null @@ -1,18 +0,0 @@ -package io.reflectoring.eventsdemo.publisher; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.stereotype.Component; - -import io.reflectoring.eventsdemo.events.UserCreatedEvent; - -@Component -public class Publisher { - - @Autowired - private ApplicationEventPublisher publisher; - - public void publishEvent(final String name) { - publisher.publishEvent(new UserCreatedEvent(name)); - } -} diff --git a/spring-boot/spring-events/src/main/resources/META-INF/spring.factories b/spring-boot/spring-events/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..5aa1294 --- /dev/null +++ b/spring-boot/spring-events/src/main/resources/META-INF/spring.factories @@ -0,0 +1 @@ +org.springframework.context.ApplicationListener=io.reflectoring.eventsdemo.SpringBuiltInEventsListener \ No newline at end of file diff --git a/spring-boot/spring-events/src/test/java/com/lucario/eventsdemo/EventsDemoApplicationTests.java b/spring-boot/spring-events/src/test/java/com/lucario/eventsdemo/EventsDemoApplicationTests.java index 9768a27..64d9585 100644 --- a/spring-boot/spring-events/src/test/java/com/lucario/eventsdemo/EventsDemoApplicationTests.java +++ b/spring-boot/spring-events/src/test/java/com/lucario/eventsdemo/EventsDemoApplicationTests.java @@ -17,8 +17,8 @@ import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.context.ApplicationEventPublisher; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import io.reflectoring.eventsdemo.events.UserCreatedEvent; -import io.reflectoring.eventsdemo.listeners.UserCreatedListener; +import io.reflectoring.eventsdemo.UserCreatedEvent; +import io.reflectoring.eventsdemo.UserListener; import junit.framework.Assert; @RunWith(SpringJUnit4ClassRunner.class) @@ -29,7 +29,7 @@ class EventsDemoApplicationTests { private ApplicationEventPublisher applicationEventPublisher; @SpyBean - UserCreatedListener userCreatedListener; + UserListener userCreatedListener; @Captor protected ArgumentCaptor publishEventCaptor;