diff --git a/java-spi/java-spi-api/pom.xml b/java-spi/java-spi-api/pom.xml
new file mode 100644
index 00000000..e7c1e87d
--- /dev/null
+++ b/java-spi/java-spi-api/pom.xml
@@ -0,0 +1,27 @@
+
+
+
+ 4.0.0
+
+ com.hmkcode.api
+ java-spi-api
+ 1.0-SNAPSHOT
+
+ java-spi-api
+
+ http://www.example.com
+
+
+ UTF-8
+ 1.7
+ 1.7
+
+
+
+
+
+
+
+
+
diff --git a/java-spi/java-spi-api/src/main/java/com/hmkcode/api/MyService.java b/java-spi/java-spi-api/src/main/java/com/hmkcode/api/MyService.java
new file mode 100644
index 00000000..4928f453
--- /dev/null
+++ b/java-spi/java-spi-api/src/main/java/com/hmkcode/api/MyService.java
@@ -0,0 +1,6 @@
+package com.hmkcode.api;
+
+public interface MyService {
+
+ void doSomething();
+}
diff --git a/java-spi/java-spi-api/src/main/java/com/hmkcode/api/MyServiceProviderInterface.java b/java-spi/java-spi-api/src/main/java/com/hmkcode/api/MyServiceProviderInterface.java
new file mode 100644
index 00000000..8e166424
--- /dev/null
+++ b/java-spi/java-spi-api/src/main/java/com/hmkcode/api/MyServiceProviderInterface.java
@@ -0,0 +1,6 @@
+package com.hmkcode.api;
+
+public interface MyServiceProviderInterface {
+
+ MyService getService();
+}
diff --git a/java-spi/java-spi-app/lib/java-spi-api-1.0-SNAPSHOT.jar b/java-spi/java-spi-app/lib/java-spi-api-1.0-SNAPSHOT.jar
new file mode 100644
index 00000000..23a1c6be
Binary files /dev/null and b/java-spi/java-spi-app/lib/java-spi-api-1.0-SNAPSHOT.jar differ
diff --git a/java-spi/java-spi-app/lib/java-spi-impl1-1.0-SNAPSHOT.jar b/java-spi/java-spi-app/lib/java-spi-impl1-1.0-SNAPSHOT.jar
new file mode 100644
index 00000000..c8007874
Binary files /dev/null and b/java-spi/java-spi-app/lib/java-spi-impl1-1.0-SNAPSHOT.jar differ
diff --git a/java-spi/java-spi-app/pom.xml b/java-spi/java-spi-app/pom.xml
new file mode 100644
index 00000000..74906a4f
--- /dev/null
+++ b/java-spi/java-spi-app/pom.xml
@@ -0,0 +1,40 @@
+
+
+
+ 4.0.0
+
+ com.hmkcode.app
+ java-spi-app
+ 1.0-SNAPSHOT
+
+ java-spi-app
+
+ http://www.example.com
+
+
+ UTF-8
+ 1.7
+ 1.7
+
+
+
+
+
+ com.hmkcode.api
+ java-spi-api
+ 1.0-SNAPSHOT
+ system
+ ${project.basedir}/lib/java-spi-api-1.0-SNAPSHOT.jar
+
+
+ com.hmkcode.impl
+ java-spi-impl1
+ 1.0-SNAPSHOT
+ system
+ ${project.basedir}/lib/java-spi-impl1-1.0-SNAPSHOT.jar
+
+
+
+
+
diff --git a/java-spi/java-spi-app/src/main/java/com/hmkcode/app/App.java b/java-spi/java-spi-app/src/main/java/com/hmkcode/app/App.java
new file mode 100644
index 00000000..8e46d684
--- /dev/null
+++ b/java-spi/java-spi-app/src/main/java/com/hmkcode/app/App.java
@@ -0,0 +1,9 @@
+package com.hmkcode.app;
+
+public class App
+{
+ public static void main( String[] args )
+ {
+ MyServiceLoader.defaultProvider().getService().doSomething();
+ }
+}
diff --git a/java-spi/java-spi-app/src/main/java/com/hmkcode/app/MyServiceLoader.java b/java-spi/java-spi-app/src/main/java/com/hmkcode/app/MyServiceLoader.java
new file mode 100644
index 00000000..2efc5d74
--- /dev/null
+++ b/java-spi/java-spi-app/src/main/java/com/hmkcode/app/MyServiceLoader.java
@@ -0,0 +1,31 @@
+package com.hmkcode.app;
+
+import java.nio.file.ProviderNotFoundException;
+import java.util.Iterator;
+import java.util.ServiceLoader;
+
+import com.hmkcode.api.MyServiceProviderInterface;
+
+
+public class MyServiceLoader {
+
+ private static final String DEFAULT_PROVIDER = "com.hmkcode.impl.MyServiceProviderImpl1";
+
+ public static MyServiceProviderInterface defaultProvider() {
+ return provider(DEFAULT_PROVIDER);
+ }
+
+ public static MyServiceProviderInterface provider(String providerName) {
+ ServiceLoader loader = ServiceLoader.load(MyServiceProviderInterface.class);
+
+ Iterator it = loader.iterator();
+ while (it.hasNext()) {
+ MyServiceProviderInterface provider = it.next();
+ if (providerName.equals(provider.getClass().getName())) {
+ return provider;
+ }
+ }
+ throw new ProviderNotFoundException("provider " + providerName + " not found");
+ }
+
+}
diff --git a/java-spi/java-spi-impl1/lib/java-spi-api-1.0-SNAPSHOT.jar b/java-spi/java-spi-impl1/lib/java-spi-api-1.0-SNAPSHOT.jar
new file mode 100644
index 00000000..23a1c6be
Binary files /dev/null and b/java-spi/java-spi-impl1/lib/java-spi-api-1.0-SNAPSHOT.jar differ
diff --git a/java-spi/java-spi-impl1/pom.xml b/java-spi/java-spi-impl1/pom.xml
new file mode 100644
index 00000000..2e234c96
--- /dev/null
+++ b/java-spi/java-spi-impl1/pom.xml
@@ -0,0 +1,31 @@
+
+
+
+ 4.0.0
+
+ com.hmkcode.impl
+ java-spi-impl1
+ 1.0-SNAPSHOT
+
+ java-spi-impl1
+
+ http://www.example.com
+
+
+ UTF-8
+ 1.7
+ 1.7
+
+
+
+
+ com.hmkcode.api
+ java-spi-api
+ 1.0-SNAPSHOT
+ system
+ ${project.basedir}/lib/java-spi-api-1.0-SNAPSHOT.jar
+
+
+
+
diff --git a/java-spi/java-spi-impl1/src/main/java/com/hmkcode/impl/MyServiceImpl1.java b/java-spi/java-spi-impl1/src/main/java/com/hmkcode/impl/MyServiceImpl1.java
new file mode 100644
index 00000000..24afcfa4
--- /dev/null
+++ b/java-spi/java-spi-impl1/src/main/java/com/hmkcode/impl/MyServiceImpl1.java
@@ -0,0 +1,12 @@
+package com.hmkcode.impl;
+
+import com.hmkcode.api.MyService;
+
+public class MyServiceImpl1 implements MyService{
+
+ @Override
+ public void doSomething() {
+ System.out.println("MyServiceImpl1");
+
+ }
+}
diff --git a/java-spi/java-spi-impl1/src/main/java/com/hmkcode/impl/MyServiceProviderImpl1.java b/java-spi/java-spi-impl1/src/main/java/com/hmkcode/impl/MyServiceProviderImpl1.java
new file mode 100644
index 00000000..252b7a3e
--- /dev/null
+++ b/java-spi/java-spi-impl1/src/main/java/com/hmkcode/impl/MyServiceProviderImpl1.java
@@ -0,0 +1,13 @@
+package com.hmkcode.impl;
+
+import com.hmkcode.api.MyService;
+import com.hmkcode.api.MyServiceProviderInterface;
+
+public class MyServiceProviderImpl1 implements MyServiceProviderInterface {
+
+ @Override
+ public MyService getService() {
+ return new MyServiceImpl1();
+ }
+
+}
diff --git a/java-spi/java-spi-impl1/src/main/resources/META-INF/services/com.hmkcode.api.MyServiceProviderInterface b/java-spi/java-spi-impl1/src/main/resources/META-INF/services/com.hmkcode.api.MyServiceProviderInterface
new file mode 100644
index 00000000..008c8c11
--- /dev/null
+++ b/java-spi/java-spi-impl1/src/main/resources/META-INF/services/com.hmkcode.api.MyServiceProviderInterface
@@ -0,0 +1 @@
+com.hmkcode.impl.MyServiceProviderImpl1
\ No newline at end of file