diff --git a/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml b/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml
new file mode 100644
index 0000000000..62c3676ae4
--- /dev/null
+++ b/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml
@@ -0,0 +1,59 @@
+
+ 4.0.0
+
+ com.baeldung
+ greeter-spring-boot-autoconfigure
+ 0.0.1-SNAPSHOT
+
+
+ UTF-8
+ 1.5.2.RELEASE
+ 0.0.1-SNAPSHOT
+
+
+
+
+
+ org.springframework.boot
+ spring-boot
+ ${spring-boot.version}
+
+
+
+ org.springframework.boot
+ spring-boot-autoconfigure
+ ${spring-boot.version}
+
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ ${spring-boot.version}
+ true
+
+
+
+ com.baeldung
+ greeter
+ ${greeter.version}
+ true
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.8
+ 1.8
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/main/java/com/baeldung/greeter/autoconfigure/GreeterAutoConfiguration.java b/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/main/java/com/baeldung/greeter/autoconfigure/GreeterAutoConfiguration.java
new file mode 100644
index 0000000000..4cf078aa00
--- /dev/null
+++ b/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/main/java/com/baeldung/greeter/autoconfigure/GreeterAutoConfiguration.java
@@ -0,0 +1,48 @@
+package com.baeldung.greeter.autoconfigure;
+
+import static com.baeldung.greeter.GreeterConfigParams.*;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import com.baeldung.greeter.Greeter;
+import com.baeldung.greeter.GreetingConfig;
+
+@Configuration
+@ConditionalOnClass(Greeter.class)
+@EnableConfigurationProperties(GreeterProperties.class)
+public class GreeterAutoConfiguration {
+
+ @Autowired
+ private GreeterProperties greeterProperties;
+
+ @Bean
+ @ConditionalOnMissingBean
+ public GreetingConfig greeterConfig() {
+
+ String userName = greeterProperties.getUserName() == null ? System.getProperty("user.name") : greeterProperties.getUserName();
+ String morningMessage = greeterProperties.getMorningMessage() == null ? "Good Morning" : greeterProperties.getMorningMessage();
+ String afternoonMessage = greeterProperties.getAfternoonMessage() == null ? "Good Afternoon" : greeterProperties.getAfternoonMessage();
+ String eveningMessage = greeterProperties.getEveningMessage() == null ? "Good Evening" : greeterProperties.getEveningMessage();
+ String nightMessage = greeterProperties.getNightMessage() == null ? "Good Night" : greeterProperties.getNightMessage();
+
+ GreetingConfig greetingConfig = new GreetingConfig();
+ greetingConfig.put(USER_NAME, userName);
+ greetingConfig.put(MORNING_MESSAGE, morningMessage);
+ greetingConfig.put(AFTERNOON_MESSAGE, afternoonMessage);
+ greetingConfig.put(EVENING_MESSAGE, eveningMessage);
+ greetingConfig.put(NIGHT_MESSAGE, nightMessage);
+ return greetingConfig;
+ }
+
+ @Bean
+ @ConditionalOnMissingBean
+ public Greeter greeter(GreetingConfig greetingConfig) {
+ return new Greeter(greetingConfig);
+ }
+
+}
diff --git a/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/main/java/com/baeldung/greeter/autoconfigure/GreeterProperties.java b/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/main/java/com/baeldung/greeter/autoconfigure/GreeterProperties.java
new file mode 100644
index 0000000000..c60c45c8c6
--- /dev/null
+++ b/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/main/java/com/baeldung/greeter/autoconfigure/GreeterProperties.java
@@ -0,0 +1,54 @@
+package com.baeldung.greeter.autoconfigure;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@ConfigurationProperties(prefix = "baeldung.greeter")
+public class GreeterProperties {
+
+ private String userName;
+ private String morningMessage;
+ private String afternoonMessage;
+ private String eveningMessage;
+ private String nightMessage;
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public void setUserName(String userName) {
+ this.userName = userName;
+ }
+
+ public String getMorningMessage() {
+ return morningMessage;
+ }
+
+ public void setMorningMessage(String morningMessage) {
+ this.morningMessage = morningMessage;
+ }
+
+ public String getAfternoonMessage() {
+ return afternoonMessage;
+ }
+
+ public void setAfternoonMessage(String afternoonMessage) {
+ this.afternoonMessage = afternoonMessage;
+ }
+
+ public String getEveningMessage() {
+ return eveningMessage;
+ }
+
+ public void setEveningMessage(String eveningMessage) {
+ this.eveningMessage = eveningMessage;
+ }
+
+ public String getNightMessage() {
+ return nightMessage;
+ }
+
+ public void setNightMessage(String nightMessage) {
+ this.nightMessage = nightMessage;
+ }
+
+}
diff --git a/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories b/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories
new file mode 100644
index 0000000000..418201227b
--- /dev/null
+++ b/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories
@@ -0,0 +1,2 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+com.baeldung.greeter.autoconfigure.GreeterAutoConfiguration
\ No newline at end of file
diff --git a/spring-boot-custom-starter/greeter-spring-boot-sample-app/pom.xml b/spring-boot-custom-starter/greeter-spring-boot-sample-app/pom.xml
new file mode 100644
index 0000000000..bb1d35cfaa
--- /dev/null
+++ b/spring-boot-custom-starter/greeter-spring-boot-sample-app/pom.xml
@@ -0,0 +1,39 @@
+
+ 4.0.0
+
+ com.baeldung
+ greeter-spring-boot-sample-app
+ 0.0.1-SNAPSHOT
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 1.5.2.RELEASE
+
+
+
+
+ UTF-8
+ 1.8
+ 0.0.1-SNAPSHOT
+
+
+
+
+
+ com.baeldung
+ greeter-spring-boot-starter
+ ${greeter-starter.version}
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-boot-custom-starter/greeter-spring-boot-sample-app/src/main/java/com/baeldung/greeter/sample/GreeterSampleApplication.java b/spring-boot-custom-starter/greeter-spring-boot-sample-app/src/main/java/com/baeldung/greeter/sample/GreeterSampleApplication.java
new file mode 100644
index 0000000000..3c87524648
--- /dev/null
+++ b/spring-boot-custom-starter/greeter-spring-boot-sample-app/src/main/java/com/baeldung/greeter/sample/GreeterSampleApplication.java
@@ -0,0 +1,25 @@
+package com.baeldung.greeter.sample;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+import com.baeldung.greeter.Greeter;
+
+@SpringBootApplication
+public class GreeterSampleApplication implements CommandLineRunner {
+
+ @Autowired
+ private Greeter greeter;
+
+ public static void main(String[] args) {
+ SpringApplication.run(GreeterSampleApplication.class, args);
+ }
+
+ @Override
+ public void run(String... args) throws Exception {
+ String message = greeter.greet();
+ System.out.println(message);
+ }
+}
diff --git a/spring-boot-custom-starter/greeter-spring-boot-sample-app/src/main/resources/application.properties b/spring-boot-custom-starter/greeter-spring-boot-sample-app/src/main/resources/application.properties
new file mode 100644
index 0000000000..6136e602f7
--- /dev/null
+++ b/spring-boot-custom-starter/greeter-spring-boot-sample-app/src/main/resources/application.properties
@@ -0,0 +1,2 @@
+baeldung.greeter.userName=Baeldung
+baeldung.greeter.afternoonMessage=Woha\ Afternoon
diff --git a/spring-boot-custom-starter/greeter-spring-boot-sample-app/src/test/java/com/baeldung/greeter/sample/GreeterSampleApplicationTest.java b/spring-boot-custom-starter/greeter-spring-boot-sample-app/src/test/java/com/baeldung/greeter/sample/GreeterSampleApplicationTest.java
new file mode 100644
index 0000000000..bdb8fd0112
--- /dev/null
+++ b/spring-boot-custom-starter/greeter-spring-boot-sample-app/src/test/java/com/baeldung/greeter/sample/GreeterSampleApplicationTest.java
@@ -0,0 +1,50 @@
+package com.baeldung.greeter.sample;
+
+import static org.junit.Assert.assertEquals;
+
+import java.time.LocalDateTime;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+import com.baeldung.greeter.Greeter;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@SpringBootTest(classes = GreeterSampleApplication.class)
+public class GreeterSampleApplicationTest {
+
+ @Autowired
+ private Greeter greeter;
+
+ @Test
+ public void givenMorningTime_ifMorningMessage_thenSuccess() {
+ String expected = "Hello Baeldung, Good Morning";
+ String actual = greeter.greet(LocalDateTime.of(2017, 3, 1, 6, 0));
+ assertEquals(expected, actual);
+ }
+
+ @Test
+ public void givenAfternoonTime_ifAfternoonMessage_thenSuccess() {
+ String expected = "Hello Baeldung, Woha Afternoon";
+ String actual = greeter.greet(LocalDateTime.of(2017, 3, 1, 13, 0));
+ assertEquals(expected, actual);
+ }
+
+ @Test
+ public void givenEveningTime_ifEveningMessage_thenSuccess() {
+ String expected = "Hello Baeldung, Good Evening";
+ String actual = greeter.greet(LocalDateTime.of(2017, 3, 1, 19, 0));
+ assertEquals(expected, actual);
+ }
+
+ @Test
+ public void givenNightTime_ifNightMessage_thenSuccess() {
+ String expected = "Hello Baeldung, Good Night";
+ String actual = greeter.greet(LocalDateTime.of(2017, 3, 1, 21, 0));
+ assertEquals(expected, actual);
+ }
+
+}
diff --git a/spring-boot-custom-starter/greeter-spring-boot-starter/pom.xml b/spring-boot-custom-starter/greeter-spring-boot-starter/pom.xml
new file mode 100644
index 0000000000..7b38c53c09
--- /dev/null
+++ b/spring-boot-custom-starter/greeter-spring-boot-starter/pom.xml
@@ -0,0 +1,51 @@
+
+ 4.0.0
+
+ com.baeldung
+ greeter-spring-boot-starter
+ 0.0.1-SNAPSHOT
+
+
+ UTF-8
+ 0.0.1-SNAPSHOT
+ 1.5.2.RELEASE
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+ ${spring-boot.version}
+
+
+
+ com.baeldung
+ greeter-spring-boot-autoconfigure
+ ${project.version}
+
+
+
+ com.baeldung
+ greeter
+ ${greeter.version}
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.8
+ 1.8
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-boot-custom-starter/greeter/README.md b/spring-boot-custom-starter/greeter/README.md
new file mode 100644
index 0000000000..3b26cbddcb
--- /dev/null
+++ b/spring-boot-custom-starter/greeter/README.md
@@ -0,0 +1,19 @@
+# Greeter App
+
+This app takes in the user's name and messages for different times of day as configuration parameters and outptus the greeting messge. For example it will take the name **John** and the message for morning time as **Good Morning** and output the message **Hello John, Good Morning**.
+
+## Usage
+
+Create and populate the class `GreetingConfig`, instantiate a `Greeter` using the `GreetingConfig` and use it get greeting messages:
+
+```java
+GreetingConfig greetingConfig = new GreetingConfig();
+greetingConfig.put(USER_NAME, "World");
+greetingConfig.put(MORNING_MESSAGE, "Good Morning");
+greetingConfig.put(AFTERNOON_MESSAGE, "Good Afternoon");
+greetingConfig.put(EVENING_MESSAGE, "Good Evening");
+greetingConfig.put(NIGHT_MESSAGE, "Good Night");
+
+Greeter greeter = new Greeter(greetingConfig);
+greeter.greet();
+```
\ No newline at end of file
diff --git a/spring-boot-custom-starter/greeter/pom.xml b/spring-boot-custom-starter/greeter/pom.xml
new file mode 100644
index 0000000000..b0e37a9ed9
--- /dev/null
+++ b/spring-boot-custom-starter/greeter/pom.xml
@@ -0,0 +1,38 @@
+
+ 4.0.0
+
+ com.baeldung
+ greeter
+ 0.0.1-SNAPSHOT
+
+
+ UTF-8
+
+
+
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.8
+ 1.8
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-boot-custom-starter/greeter/src/main/java/com/baeldung/greeter/Greeter.java b/spring-boot-custom-starter/greeter/src/main/java/com/baeldung/greeter/Greeter.java
new file mode 100644
index 0000000000..970561d1fd
--- /dev/null
+++ b/spring-boot-custom-starter/greeter/src/main/java/com/baeldung/greeter/Greeter.java
@@ -0,0 +1,35 @@
+package com.baeldung.greeter;
+
+import static com.baeldung.greeter.GreeterConfigParams.*;
+
+import java.time.LocalDateTime;
+
+public class Greeter {
+
+ private GreetingConfig greetingConfig;
+
+ public Greeter(GreetingConfig greetingConfig) {
+ this.greetingConfig = greetingConfig;
+ }
+
+ public String greet(LocalDateTime localDateTime) {
+
+ String name = greetingConfig.getProperty(USER_NAME);
+ int hourOfDay = localDateTime.getHour();
+
+ if (hourOfDay >= 5 && hourOfDay < 12) {
+ return String.format("Hello %s, %s", name, greetingConfig.get(MORNING_MESSAGE));
+ } else if (hourOfDay >= 12 && hourOfDay < 17) {
+ return String.format("Hello %s, %s", name, greetingConfig.get(AFTERNOON_MESSAGE));
+ } else if (hourOfDay >= 17 && hourOfDay < 20) {
+ return String.format("Hello %s, %s", name, greetingConfig.get(EVENING_MESSAGE));
+ } else {
+ return String.format("Hello %s, %s", name, greetingConfig.get(NIGHT_MESSAGE));
+ }
+ }
+
+ public String greet() {
+ return greet(LocalDateTime.now());
+ }
+
+}
diff --git a/spring-boot-custom-starter/greeter/src/main/java/com/baeldung/greeter/GreeterConfigParams.java b/spring-boot-custom-starter/greeter/src/main/java/com/baeldung/greeter/GreeterConfigParams.java
new file mode 100644
index 0000000000..fa30b0f312
--- /dev/null
+++ b/spring-boot-custom-starter/greeter/src/main/java/com/baeldung/greeter/GreeterConfigParams.java
@@ -0,0 +1,11 @@
+package com.baeldung.greeter;
+
+public class GreeterConfigParams {
+
+ public static final String USER_NAME = "user.name";
+ public static final String MORNING_MESSAGE = "morning.message";
+ public static final String AFTERNOON_MESSAGE = "afternoon.message";
+ public static final String EVENING_MESSAGE = "evening.message";
+ public static final String NIGHT_MESSAGE = "night.message";
+
+}
diff --git a/spring-boot-custom-starter/greeter/src/main/java/com/baeldung/greeter/GreetingConfig.java b/spring-boot-custom-starter/greeter/src/main/java/com/baeldung/greeter/GreetingConfig.java
new file mode 100644
index 0000000000..fbbe11cf4f
--- /dev/null
+++ b/spring-boot-custom-starter/greeter/src/main/java/com/baeldung/greeter/GreetingConfig.java
@@ -0,0 +1,9 @@
+package com.baeldung.greeter;
+
+import java.util.Properties;
+
+public class GreetingConfig extends Properties{
+
+ private static final long serialVersionUID = 5662570853707247891L;
+
+}
diff --git a/spring-boot-custom-starter/greeter/src/test/java/com/baeldung/greeter/GreeterTest.java b/spring-boot-custom-starter/greeter/src/test/java/com/baeldung/greeter/GreeterTest.java
new file mode 100644
index 0000000000..834f1447bd
--- /dev/null
+++ b/spring-boot-custom-starter/greeter/src/test/java/com/baeldung/greeter/GreeterTest.java
@@ -0,0 +1,56 @@
+package com.baeldung.greeter;
+
+import static com.baeldung.greeter.GreeterConfigParams.*;
+import static org.junit.Assert.assertEquals;
+
+import java.time.LocalDateTime;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class GreeterTest {
+
+ private static GreetingConfig greetingConfig;
+
+ @BeforeClass
+ public static void initalizeGreetingConfig() {
+ greetingConfig = new GreetingConfig();
+ greetingConfig.put(USER_NAME, "World");
+ greetingConfig.put(MORNING_MESSAGE, "Good Morning");
+ greetingConfig.put(AFTERNOON_MESSAGE, "Good Afternoon");
+ greetingConfig.put(EVENING_MESSAGE, "Good Evening");
+ greetingConfig.put(NIGHT_MESSAGE, "Good Night");
+ }
+
+ @Test
+ public void givenMorningTime_ifMorningMessage_thenSuccess() {
+ String expected = "Hello World, Good Morning";
+ Greeter greeter = new Greeter(greetingConfig);
+ String actual = greeter.greet(LocalDateTime.of(2017, 3, 1, 6, 0));
+ assertEquals(expected, actual);
+ }
+
+ @Test
+ public void givenAfternoonTime_ifAfternoonMessage_thenSuccess() {
+ String expected = "Hello World, Good Afternoon";
+ Greeter greeter = new Greeter(greetingConfig);
+ String actual = greeter.greet(LocalDateTime.of(2017, 3, 1, 13, 0));
+ assertEquals(expected, actual);
+ }
+
+ @Test
+ public void givenEveningTime_ifEveningMessage_thenSuccess() {
+ String expected = "Hello World, Good Evening";
+ Greeter greeter = new Greeter(greetingConfig);
+ String actual = greeter.greet(LocalDateTime.of(2017, 3, 1, 19, 0));
+ assertEquals(expected, actual);
+ }
+
+ @Test
+ public void givenNightTime_ifNightMessage_thenSuccess() {
+ String expected = "Hello World, Good Night";
+ Greeter greeter = new Greeter(greetingConfig);
+ String actual = greeter.greet(LocalDateTime.of(2017, 3, 1, 21, 0));
+ assertEquals(expected, actual);
+ }
+}
diff --git a/spring-boot-custom-starter/pom.xml b/spring-boot-custom-starter/pom.xml
new file mode 100644
index 0000000000..e24ff071d4
--- /dev/null
+++ b/spring-boot-custom-starter/pom.xml
@@ -0,0 +1,34 @@
+
+ 4.0.0
+ com.baeldung
+ spring-boot-custom-starter
+ 0.0.1-SNAPSHOT
+ pom
+
+
+ UTF-8
+
+
+
+ greeter
+ greeter-spring-boot-autoconfigure
+ greeter-spring-boot-starter
+ greeter-spring-boot-sample-app
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.5.1
+
+ 1.8
+ 1.8
+
+
+
+
+
+
\ No newline at end of file