From 255f6073c859348ffc095729081e7df673b1b48d Mon Sep 17 00:00:00 2001 From: Manoj Shukla Date: Wed, 22 Jul 2020 12:09:50 +0530 Subject: [PATCH] Order annotation in Spring --- spring-core-order-annotation/pom.xml | 68 +++++++++++++++++++ .../com/jsbd/order/ApplicationConfig.java | 43 ++++++++++++ .../jsbd/order/model/NotificationChannel.java | 14 ++++ .../jsbd/order/service/EmailNotification.java | 19 ++++++ .../order/service/NotificationHandler.java | 5 ++ .../jsbd/order/service/SlackNotification.java | 19 ++++++ .../jsbd/order/service/SmsNotification.java | 19 ++++++ .../order/service/TwitterNotification.java | 18 +++++ .../order/TestOrderOnCollectionInjection.java | 31 +++++++++ 9 files changed, 236 insertions(+) create mode 100644 spring-core-order-annotation/pom.xml create mode 100644 spring-core-order-annotation/src/main/java/com/jsbd/order/ApplicationConfig.java create mode 100644 spring-core-order-annotation/src/main/java/com/jsbd/order/model/NotificationChannel.java create mode 100644 spring-core-order-annotation/src/main/java/com/jsbd/order/service/EmailNotification.java create mode 100644 spring-core-order-annotation/src/main/java/com/jsbd/order/service/NotificationHandler.java create mode 100644 spring-core-order-annotation/src/main/java/com/jsbd/order/service/SlackNotification.java create mode 100644 spring-core-order-annotation/src/main/java/com/jsbd/order/service/SmsNotification.java create mode 100644 spring-core-order-annotation/src/main/java/com/jsbd/order/service/TwitterNotification.java create mode 100644 spring-core-order-annotation/src/test/java/com/jsbd/order/TestOrderOnCollectionInjection.java diff --git a/spring-core-order-annotation/pom.xml b/spring-core-order-annotation/pom.xml new file mode 100644 index 0000000..7d5703e --- /dev/null +++ b/spring-core-order-annotation/pom.xml @@ -0,0 +1,68 @@ + + + + spring-framework-tutorial-parent + com.jstobigdata + 1.0-SNAPSHOT + + 4.0.0 + spring-core-order-annotation + Use of Spring's @Order annotation + + + + + org.springframework + spring-core + + + + org.springframework + spring-context + + + + + org.junit.jupiter + junit-jupiter-api + test + + + + org.junit.jupiter + junit-jupiter-engine + test + + + + org.springframework + spring-test + test + + + + + + + com.jstobigdata + spring-tutorial-boms + pom + import + 1.0-SNAPSHOT + + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0-M3 + + + + \ No newline at end of file diff --git a/spring-core-order-annotation/src/main/java/com/jsbd/order/ApplicationConfig.java b/spring-core-order-annotation/src/main/java/com/jsbd/order/ApplicationConfig.java new file mode 100644 index 0000000..8b0b03b --- /dev/null +++ b/spring-core-order-annotation/src/main/java/com/jsbd/order/ApplicationConfig.java @@ -0,0 +1,43 @@ +package com.jsbd.order; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; + +import com.jsbd.order.model.NotificationChannel; + +@Configuration +@ComponentScan("com.jsbd.order") +public class ApplicationConfig { + + + @Bean + @Order(2) + public NotificationChannel email(){ + // System.out.println("Notification Channel - Email"); + return new NotificationChannel("Email"); + } + + @Bean + @Order(4) + public NotificationChannel twitter(){ + // System.out.println("Notification Channel - Twitter"); + return new NotificationChannel("Twitter"); + } + + @Bean + @Order(3) + public NotificationChannel slack(){ + // System.out.println("Notification Channel - Slack"); + return new NotificationChannel("Slack"); + } + + @Bean + @Order(1) + public NotificationChannel sms(){ + // System.out.println("Notification Channel - Sms"); + return new NotificationChannel("Sms"); + } + +} diff --git a/spring-core-order-annotation/src/main/java/com/jsbd/order/model/NotificationChannel.java b/spring-core-order-annotation/src/main/java/com/jsbd/order/model/NotificationChannel.java new file mode 100644 index 0000000..0f434b6 --- /dev/null +++ b/spring-core-order-annotation/src/main/java/com/jsbd/order/model/NotificationChannel.java @@ -0,0 +1,14 @@ +package com.jsbd.order.model; + +public class NotificationChannel { + + private String name; + + public NotificationChannel(String channelName) { + this.name = channelName; + } + + public String getName() { + return name; + } +} diff --git a/spring-core-order-annotation/src/main/java/com/jsbd/order/service/EmailNotification.java b/spring-core-order-annotation/src/main/java/com/jsbd/order/service/EmailNotification.java new file mode 100644 index 0000000..6db6e40 --- /dev/null +++ b/spring-core-order-annotation/src/main/java/com/jsbd/order/service/EmailNotification.java @@ -0,0 +1,19 @@ +package com.jsbd.order.service; + +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Service; + +@Service +@Order(3) +public class EmailNotification implements NotificationHandler { + + public EmailNotification() { + System.out.println("EmailNotification Service Created."); + } + + @Override + public void send() { + System.out.println("Email Notification Handler"); + } + +} \ No newline at end of file diff --git a/spring-core-order-annotation/src/main/java/com/jsbd/order/service/NotificationHandler.java b/spring-core-order-annotation/src/main/java/com/jsbd/order/service/NotificationHandler.java new file mode 100644 index 0000000..abfb29e --- /dev/null +++ b/spring-core-order-annotation/src/main/java/com/jsbd/order/service/NotificationHandler.java @@ -0,0 +1,5 @@ +package com.jsbd.order.service; + +public interface NotificationHandler { + void send(); +} \ No newline at end of file diff --git a/spring-core-order-annotation/src/main/java/com/jsbd/order/service/SlackNotification.java b/spring-core-order-annotation/src/main/java/com/jsbd/order/service/SlackNotification.java new file mode 100644 index 0000000..444669d --- /dev/null +++ b/spring-core-order-annotation/src/main/java/com/jsbd/order/service/SlackNotification.java @@ -0,0 +1,19 @@ +package com.jsbd.order.service; + +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Service; + +@Service +@Order(2) +class SlackNotification implements NotificationHandler { + + public SlackNotification() { + System.out.println("SlackNotification Service created."); + } + + @Override + public void send() { + System.out.println("Slack Notification Handler"); + } + +} \ No newline at end of file diff --git a/spring-core-order-annotation/src/main/java/com/jsbd/order/service/SmsNotification.java b/spring-core-order-annotation/src/main/java/com/jsbd/order/service/SmsNotification.java new file mode 100644 index 0000000..57a5bfd --- /dev/null +++ b/spring-core-order-annotation/src/main/java/com/jsbd/order/service/SmsNotification.java @@ -0,0 +1,19 @@ +package com.jsbd.order.service; + +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Service; + +@Service +@Order(1) +class SmsNotification implements NotificationHandler { + + public SmsNotification() { + System.out.println("SmsNotification Service created."); + } + + @Override + public void send() { + System.out.println("SMS Notification Handler"); + } + +} \ No newline at end of file diff --git a/spring-core-order-annotation/src/main/java/com/jsbd/order/service/TwitterNotification.java b/spring-core-order-annotation/src/main/java/com/jsbd/order/service/TwitterNotification.java new file mode 100644 index 0000000..980f7cb --- /dev/null +++ b/spring-core-order-annotation/src/main/java/com/jsbd/order/service/TwitterNotification.java @@ -0,0 +1,18 @@ +package com.jsbd.order.service; + +import org.springframework.stereotype.Service; + +@Service +// Not an Ordered Service, will be the last in sequence +class TwitterNotification implements NotificationHandler { + + public TwitterNotification() { + System.out.println("TwitterNotification Service created."); + } + + @Override + public void send() { + System.out.println("Twitter Direct Message Notification Handler"); + } + +} \ No newline at end of file diff --git a/spring-core-order-annotation/src/test/java/com/jsbd/order/TestOrderOnCollectionInjection.java b/spring-core-order-annotation/src/test/java/com/jsbd/order/TestOrderOnCollectionInjection.java new file mode 100644 index 0000000..c4fe573 --- /dev/null +++ b/spring-core-order-annotation/src/test/java/com/jsbd/order/TestOrderOnCollectionInjection.java @@ -0,0 +1,31 @@ +package com.jsbd.order; + +import java.util.List; + +import com.jsbd.order.model.NotificationChannel; +import com.jsbd.order.service.NotificationHandler; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; + +@SpringJUnitConfig(ApplicationConfig.class) +public class TestOrderOnCollectionInjection { + + @Autowired + private List notificationHandlers; + + @Autowired + private List notificationChannels; + + @Test + public void testAllChannelSendingOrder() { + notificationHandlers.forEach(NotificationHandler::send); + } + + @Test + public void testNotificationChannelBeanOrder(){ + notificationChannels.forEach(channel -> System.out.println(channel.getName())); + } + +}