diff --git a/guice-intro/pom.xml b/guice-intro/pom.xml
new file mode 100644
index 0000000000..1f0d7679b7
--- /dev/null
+++ b/guice-intro/pom.xml
@@ -0,0 +1,34 @@
+
+
+ 4.0.0
+ com.baeldung.examples.guice
+ guice-intro
+ 1.0-SNAPSHOT
+ jar
+
+
+ com.google.inject
+ guice
+ ${guice.version}
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 1.8
+ 1.8
+
+
+
+
+
+ UTF-8
+ 1.8
+ 1.8
+ 4.1.0
+
+ guice-intro
+
diff --git a/guice-intro/src/main/java/com/baeldung/examples/RunGuice.java b/guice-intro/src/main/java/com/baeldung/examples/RunGuice.java
new file mode 100644
index 0000000000..b4b3e8571e
--- /dev/null
+++ b/guice-intro/src/main/java/com/baeldung/examples/RunGuice.java
@@ -0,0 +1,36 @@
+
+package com.baeldung.examples;
+
+import com.baeldung.examples.guice.Communication;
+import com.baeldung.examples.guice.binding.AOPModule;
+import com.baeldung.examples.guice.modules.BasicModule;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import java.util.Scanner;
+
+/**
+ *
+ * @author Baeldung
+ */
+public class RunGuice {
+
+ public static void main(String[] args) {
+ Injector injector = Guice.createInjector(new BasicModule(), new AOPModule());
+ Communication comms = injector.getInstance(Communication.class);
+ Scanner scanner = new Scanner(System.in);
+ System.out.println("Enter your message to be sent; press Q to quit and P to print the message log");
+ while (true) {
+ String input = scanner.nextLine();
+ if (input.equalsIgnoreCase("q")) {
+ System.exit(0);
+ }
+ if (input.equalsIgnoreCase("p")) {
+ comms.print();
+ } else {
+ comms.sendMessage(input);
+ }
+
+ }
+
+ }
+}
diff --git a/guice-intro/src/main/java/com/baeldung/examples/guice/Communication.java b/guice-intro/src/main/java/com/baeldung/examples/guice/Communication.java
new file mode 100644
index 0000000000..c4b17b57d2
--- /dev/null
+++ b/guice-intro/src/main/java/com/baeldung/examples/guice/Communication.java
@@ -0,0 +1,57 @@
+
+package com.baeldung.examples.guice;
+
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.logging.Logger;
+
+/**
+ *
+ * @author Baeldung
+ */
+public class Communication {
+
+ final Date start = new Date();
+
+ @Inject
+ private Logger logger;
+
+ private Queue messageLog;
+
+ @Named("CommsUUID")
+ private String commsID;
+
+ @Inject
+ private DefaultCommunicator communicator;
+
+ public Communication(Boolean keepRecords) {
+ if (keepRecords) {
+ messageLog = new LinkedList();
+ }
+ }
+
+ public boolean sendMessage(String message) {
+ if (!message.isEmpty() && messageLog != null) {
+ messageLog.add(message);
+ }
+ return communicator.sendMessage(message);
+ }
+
+ public void print() {
+ if (messageLog != null) {
+ for (String message : messageLog) {
+ logger.info(message);
+ }
+ } else {
+ logger.info("Message logging wasn't enabled");
+ }
+ }
+
+ public DefaultCommunicator getCommunicator() {
+ return this.communicator;
+ }
+
+}
diff --git a/guice-intro/src/main/java/com/baeldung/examples/guice/CommunicationMode.java b/guice-intro/src/main/java/com/baeldung/examples/guice/CommunicationMode.java
new file mode 100644
index 0000000000..444b775478
--- /dev/null
+++ b/guice-intro/src/main/java/com/baeldung/examples/guice/CommunicationMode.java
@@ -0,0 +1,12 @@
+
+package com.baeldung.examples.guice;
+
+import com.baeldung.examples.guice.constant.CommunicationModel;
+
+public interface CommunicationMode {
+
+ public CommunicationModel getMode();
+
+ public boolean sendMessage(String message);
+
+}
diff --git a/guice-intro/src/main/java/com/baeldung/examples/guice/DefaultCommunicator.java b/guice-intro/src/main/java/com/baeldung/examples/guice/DefaultCommunicator.java
new file mode 100644
index 0000000000..423c24f789
--- /dev/null
+++ b/guice-intro/src/main/java/com/baeldung/examples/guice/DefaultCommunicator.java
@@ -0,0 +1,48 @@
+
+package com.baeldung.examples.guice;
+
+import com.baeldung.examples.guice.marker.Communicator;
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+
+
+public class DefaultCommunicator implements Communicator {
+
+ private CommunicationMode defaultCommsMode;
+ @Inject
+ @Named("SMSComms")
+ CommunicationMode smsCommsMode;
+ @Inject
+ @Named("EmailComms")
+ CommunicationMode emailCommsMode;
+ @Inject
+ @Named("IMComms")
+ CommunicationMode imCommsMode;
+
+ protected DefaultCommunicator(CommunicationMode defaultComms) {
+ this.defaultCommsMode = defaultComms;
+ }
+
+ public DefaultCommunicator() {
+
+ }
+
+ public boolean sendMessage(String message) {
+ boolean sent = false;
+ if (defaultCommsMode != null) {
+ sent = sendMessageByDefault(message);
+ } else {
+ sent = smsCommsMode.sendMessage(message);
+ }
+ return sent;
+ }
+
+ private boolean sendMessageByDefault(String message) {
+ boolean sent = false;
+ if (message != null && !message.trim().equals("")) {
+ return defaultCommsMode.sendMessage(message);
+ }
+ return sent;
+ }
+
+}
diff --git a/guice-intro/src/main/java/com/baeldung/examples/guice/EmailCommunicationMode.java b/guice-intro/src/main/java/com/baeldung/examples/guice/EmailCommunicationMode.java
new file mode 100644
index 0000000000..642ee7ace0
--- /dev/null
+++ b/guice-intro/src/main/java/com/baeldung/examples/guice/EmailCommunicationMode.java
@@ -0,0 +1,23 @@
+package com.baeldung.examples.guice;
+
+import com.baeldung.examples.guice.aop.MessageSentLoggable;
+import com.baeldung.examples.guice.constant.CommunicationModel;
+
+/**
+ *
+ * @author Baekdung
+ */
+public class EmailCommunicationMode implements CommunicationMode {
+
+ @Override
+ public CommunicationModel getMode() {
+ return CommunicationModel.EMAIL;
+ }
+
+ @Override
+ @MessageSentLoggable
+ public boolean sendMessage(String Message) {
+ throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ }
+
+}
diff --git a/guice-intro/src/main/java/com/baeldung/examples/guice/IMCommunicationMode.java b/guice-intro/src/main/java/com/baeldung/examples/guice/IMCommunicationMode.java
new file mode 100644
index 0000000000..9f34e9a241
--- /dev/null
+++ b/guice-intro/src/main/java/com/baeldung/examples/guice/IMCommunicationMode.java
@@ -0,0 +1,30 @@
+
+package com.baeldung.examples.guice;
+
+import com.baeldung.examples.guice.aop.MessageSentLoggable;
+import com.baeldung.examples.guice.constant.CommunicationModel;
+import com.google.inject.Inject;
+import java.util.logging.Logger;
+
+/**
+ *
+ * @author Baeldung
+ */
+public class IMCommunicationMode implements CommunicationMode {
+
+ @Inject
+ private Logger logger;
+
+ @Override
+ public CommunicationModel getMode() {
+ return CommunicationModel.IM;
+ }
+
+ @Override
+ @MessageSentLoggable
+ public boolean sendMessage(String message) {
+ logger.info("IM Message Sent");
+ return true;
+ }
+
+}
diff --git a/guice-intro/src/main/java/com/baeldung/examples/guice/SMSCommunicationMode.java b/guice-intro/src/main/java/com/baeldung/examples/guice/SMSCommunicationMode.java
new file mode 100644
index 0000000000..251e249971
--- /dev/null
+++ b/guice-intro/src/main/java/com/baeldung/examples/guice/SMSCommunicationMode.java
@@ -0,0 +1,29 @@
+package com.baeldung.examples.guice;
+
+import com.baeldung.examples.guice.aop.MessageSentLoggable;
+import com.baeldung.examples.guice.constant.CommunicationModel;
+import com.google.inject.Inject;
+import java.util.logging.Logger;
+
+/**
+ *
+ * @author Baeldung
+ */
+public class SMSCommunicationMode implements CommunicationMode {
+
+ @Inject
+ private Logger logger;
+
+ @Override
+ public CommunicationModel getMode() {
+ return CommunicationModel.SMS;
+ }
+
+ @Override
+ @MessageSentLoggable
+ public boolean sendMessage(String message) {
+ logger.info("SMS message sent");
+ return true;
+ }
+
+}
diff --git a/guice-intro/src/main/java/com/baeldung/examples/guice/aop/MessageLogger.java b/guice-intro/src/main/java/com/baeldung/examples/guice/aop/MessageLogger.java
new file mode 100644
index 0000000000..8926dfa714
--- /dev/null
+++ b/guice-intro/src/main/java/com/baeldung/examples/guice/aop/MessageLogger.java
@@ -0,0 +1,22 @@
+package com.baeldung.examples.guice.aop;
+
+import java.util.logging.Logger;
+import org.aopalliance.intercept.MethodInterceptor;
+import org.aopalliance.intercept.MethodInvocation;
+
+/**
+ *
+ * @author Baeldung
+ */
+public class MessageLogger implements MethodInterceptor {
+
+ @Override
+ public Object invoke(MethodInvocation invocation) throws Throwable {
+ Object[] objectArray = invocation.getArguments();
+ int i = 0;
+ for (Object object : objectArray) {
+ Logger.getAnonymousLogger().info("Sending message: " + object.toString());
+ }
+ return invocation.proceed();
+ }
+}
diff --git a/guice-intro/src/main/java/com/baeldung/examples/guice/aop/MessageSentLoggable.java b/guice-intro/src/main/java/com/baeldung/examples/guice/aop/MessageSentLoggable.java
new file mode 100644
index 0000000000..cacf3bde7c
--- /dev/null
+++ b/guice-intro/src/main/java/com/baeldung/examples/guice/aop/MessageSentLoggable.java
@@ -0,0 +1,16 @@
+package com.baeldung.examples.guice.aop;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ *
+ * @author Baeldung
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface MessageSentLoggable {
+
+}
diff --git a/guice-intro/src/main/java/com/baeldung/examples/guice/binding/AOPModule.java b/guice-intro/src/main/java/com/baeldung/examples/guice/binding/AOPModule.java
new file mode 100644
index 0000000000..dc9d258efa
--- /dev/null
+++ b/guice-intro/src/main/java/com/baeldung/examples/guice/binding/AOPModule.java
@@ -0,0 +1,22 @@
+package com.baeldung.examples.guice.binding;
+
+import com.baeldung.examples.guice.aop.MessageLogger;
+import com.baeldung.examples.guice.aop.MessageSentLoggable;
+import com.google.inject.AbstractModule;
+import com.google.inject.matcher.Matchers;
+
+/**
+ *
+ * @author Baeldung
+ */
+public class AOPModule extends AbstractModule {
+
+ @Override
+ protected void configure() {
+ bindInterceptor(Matchers.any(),
+ Matchers.annotatedWith(MessageSentLoggable.class),
+ new MessageLogger()
+ );
+ }
+
+}
diff --git a/guice-intro/src/main/java/com/baeldung/examples/guice/binding/BasicModule.java b/guice-intro/src/main/java/com/baeldung/examples/guice/binding/BasicModule.java
new file mode 100644
index 0000000000..9168195130
--- /dev/null
+++ b/guice-intro/src/main/java/com/baeldung/examples/guice/binding/BasicModule.java
@@ -0,0 +1,36 @@
+package com.baeldung.examples.guice.binding;
+
+import com.baeldung.examples.guice.Communication;
+import com.baeldung.examples.guice.CommunicationMode;
+import com.baeldung.examples.guice.DefaultCommunicator;
+import com.baeldung.examples.guice.EmailCommunicationMode;
+import com.baeldung.examples.guice.IMCommunicationMode;
+import com.baeldung.examples.guice.SMSCommunicationMode;
+import com.google.inject.AbstractModule;
+import com.google.inject.name.Names;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ *
+ * @author Baeldung
+ */
+public class BasicModule extends AbstractModule {
+
+ @Override
+ protected void configure() {
+ try {
+ bind(Communication.class).toConstructor(Communication.class.getConstructor(Boolean.TYPE));
+ } catch (NoSuchMethodException ex) {
+ Logger.getLogger(BasicModule.class.getName()).log(Level.SEVERE, null, ex);
+ } catch (SecurityException ex) {
+ Logger.getLogger(BasicModule.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ bind(DefaultCommunicator.class).annotatedWith(Names.named("AnotherCommunicator")).to(DefaultCommunicator.class).asEagerSingleton();
+
+ bind(CommunicationMode.class).annotatedWith(Names.named("IMComms")).to(IMCommunicationMode.class);
+ bind(CommunicationMode.class).annotatedWith(Names.named("EmailComms")).to(EmailCommunicationMode.class);
+ bind(CommunicationMode.class).annotatedWith(Names.named("SMSComms")).to(SMSCommunicationMode.class);
+ }
+
+}
diff --git a/guice-intro/src/main/java/com/baeldung/examples/guice/constant/CommunicationModel.java b/guice-intro/src/main/java/com/baeldung/examples/guice/constant/CommunicationModel.java
new file mode 100644
index 0000000000..b9fa604a32
--- /dev/null
+++ b/guice-intro/src/main/java/com/baeldung/examples/guice/constant/CommunicationModel.java
@@ -0,0 +1,16 @@
+package com.baeldung.examples.guice.constant;
+
+/**
+ *
+ * @author Baeldung
+ */
+public enum CommunicationModel {
+
+ EMAIL("Email"), SMS("SMS"), IM("IM"), PHONE("Phone");
+
+ final String name;
+
+ CommunicationModel(String name) {
+ this.name = name;
+ }
+}
diff --git a/guice-intro/src/main/java/com/baeldung/examples/guice/marker/Communicator.java b/guice-intro/src/main/java/com/baeldung/examples/guice/marker/Communicator.java
new file mode 100644
index 0000000000..239666b6ab
--- /dev/null
+++ b/guice-intro/src/main/java/com/baeldung/examples/guice/marker/Communicator.java
@@ -0,0 +1,11 @@
+package com.baeldung.examples.guice.marker;
+
+/**
+ *
+ * @author Baeldung
+ */
+public interface Communicator {
+
+ public boolean sendMessage(String message);
+
+}
diff --git a/guice-intro/src/main/java/com/baeldung/examples/guice/modules/BasicModule.java b/guice-intro/src/main/java/com/baeldung/examples/guice/modules/BasicModule.java
new file mode 100644
index 0000000000..47b3e2e573
--- /dev/null
+++ b/guice-intro/src/main/java/com/baeldung/examples/guice/modules/BasicModule.java
@@ -0,0 +1,37 @@
+package com.baeldung.examples.guice.modules;
+
+import com.baeldung.examples.guice.Communication;
+import com.baeldung.examples.guice.CommunicationMode;
+import com.baeldung.examples.guice.DefaultCommunicator;
+import com.baeldung.examples.guice.EmailCommunicationMode;
+import com.baeldung.examples.guice.IMCommunicationMode;
+import com.baeldung.examples.guice.SMSCommunicationMode;
+import com.google.inject.AbstractModule;
+import com.google.inject.name.Names;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ *
+ * @author Baeldung
+ */
+public class BasicModule extends AbstractModule {
+
+ @Override
+ protected void configure() {
+ try {
+ bind(Communication.class).toConstructor(Communication.class.getConstructor(Boolean.class));
+ bind(Boolean.class).toInstance(true);
+ } catch (NoSuchMethodException ex) {
+ Logger.getLogger(com.baeldung.examples.guice.binding.BasicModule.class.getName()).log(Level.SEVERE, null, ex);
+ } catch (SecurityException ex) {
+ Logger.getLogger(com.baeldung.examples.guice.binding.BasicModule.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ bind(DefaultCommunicator.class).annotatedWith(Names.named("AnotherCommunicator")).to(DefaultCommunicator.class).asEagerSingleton();
+
+ bind(CommunicationMode.class).annotatedWith(Names.named("IMComms")).to(IMCommunicationMode.class);
+ bind(CommunicationMode.class).annotatedWith(Names.named("EmailComms")).to(EmailCommunicationMode.class);
+ bind(CommunicationMode.class).annotatedWith(Names.named("SMSComms")).to(SMSCommunicationMode.class);
+ }
+
+}