diff --git a/pom.xml b/pom.xml
index 02d1ab6cd2..44a94095b3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -652,6 +652,7 @@
spring-core
spring-core-2
spring-core-3
+ spring-core-4
spring-cucumber
spring-data-rest
@@ -1157,6 +1158,7 @@
spring-core
spring-core-2
spring-core-3
+ spring-core-4
spring-cucumber
spring-data-rest
diff --git a/spring-core-4/README.md b/spring-core-4/README.md
new file mode 100644
index 0000000000..f882c77179
--- /dev/null
+++ b/spring-core-4/README.md
@@ -0,0 +1,7 @@
+## Spring Core
+
+This module contains articles about core Spring functionality
+
+## Relevant Articles:
+
+- More articles: [[<-- prev]](/spring-core-3)
diff --git a/spring-core-4/pom.xml b/spring-core-4/pom.xml
new file mode 100644
index 0000000000..53f7ca6912
--- /dev/null
+++ b/spring-core-4/pom.xml
@@ -0,0 +1,63 @@
+
+
+ 4.0.0
+ spring-core-4
+ spring-core-4
+
+
+ com.baeldung
+ parent-spring-5
+ 0.0.1-SNAPSHOT
+ ../parent-spring-5
+
+
+
+
+ org.springframework
+ spring-context
+ ${spring.version}
+
+
+ org.springframework
+ spring-core
+ ${spring.version}
+
+
+ org.springframework
+ spring-test
+ ${spring.version}
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ ${junit-jupiter.version}
+ test
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ ${junit-jupiter.version}
+ test
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ ${maven.surefire.version}
+
+
+
+
+
+ 2.22.1
+ 1.3.2
+ 2.2.2.RELEASE
+
+
+
\ No newline at end of file
diff --git a/spring-core-4/src/main/java/com/baeldung/factorymethod/Bar.java b/spring-core-4/src/main/java/com/baeldung/factorymethod/Bar.java
new file mode 100644
index 0000000000..22ef5b3429
--- /dev/null
+++ b/spring-core-4/src/main/java/com/baeldung/factorymethod/Bar.java
@@ -0,0 +1,18 @@
+package com.baeldung.factorymethod;
+
+public class Bar {
+
+ private String name;
+
+ public Bar(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
diff --git a/spring-core-4/src/main/java/com/baeldung/factorymethod/Foo.java b/spring-core-4/src/main/java/com/baeldung/factorymethod/Foo.java
new file mode 100644
index 0000000000..54bd0c9ff4
--- /dev/null
+++ b/spring-core-4/src/main/java/com/baeldung/factorymethod/Foo.java
@@ -0,0 +1,5 @@
+package com.baeldung.factorymethod;
+
+public class Foo {
+
+}
diff --git a/spring-core-4/src/main/java/com/baeldung/factorymethod/InstanceBarFactory.java b/spring-core-4/src/main/java/com/baeldung/factorymethod/InstanceBarFactory.java
new file mode 100644
index 0000000000..f834b82aee
--- /dev/null
+++ b/spring-core-4/src/main/java/com/baeldung/factorymethod/InstanceBarFactory.java
@@ -0,0 +1,8 @@
+package com.baeldung.factorymethod;
+
+public class InstanceBarFactory {
+
+ public Bar createInstance(String name) {
+ return new Bar(name);
+ }
+}
diff --git a/spring-core-4/src/main/java/com/baeldung/factorymethod/InstanceFooFactory.java b/spring-core-4/src/main/java/com/baeldung/factorymethod/InstanceFooFactory.java
new file mode 100644
index 0000000000..c3125d3339
--- /dev/null
+++ b/spring-core-4/src/main/java/com/baeldung/factorymethod/InstanceFooFactory.java
@@ -0,0 +1,8 @@
+package com.baeldung.factorymethod;
+
+public class InstanceFooFactory {
+
+ public Foo createInstance() {
+ return new Foo();
+ }
+}
diff --git a/spring-core-4/src/main/java/com/baeldung/factorymethod/SingletonBarFactory.java b/spring-core-4/src/main/java/com/baeldung/factorymethod/SingletonBarFactory.java
new file mode 100644
index 0000000000..93802819b1
--- /dev/null
+++ b/spring-core-4/src/main/java/com/baeldung/factorymethod/SingletonBarFactory.java
@@ -0,0 +1,11 @@
+package com.baeldung.factorymethod;
+
+public class SingletonBarFactory {
+
+ private static final Bar INSTANCE = new Bar("unnamed");
+
+ public static Bar createInstance(String name) {
+ INSTANCE.setName(name);
+ return INSTANCE;
+ }
+}
diff --git a/spring-core-4/src/main/java/com/baeldung/factorymethod/SingletonFooFactory.java b/spring-core-4/src/main/java/com/baeldung/factorymethod/SingletonFooFactory.java
new file mode 100644
index 0000000000..77d56cc7f6
--- /dev/null
+++ b/spring-core-4/src/main/java/com/baeldung/factorymethod/SingletonFooFactory.java
@@ -0,0 +1,10 @@
+package com.baeldung.factorymethod;
+
+public class SingletonFooFactory {
+
+ private static final Foo INSTANCE = new Foo();
+
+ public static Foo createInstance() {
+ return INSTANCE;
+ }
+}
diff --git a/spring-core-4/src/test/java/com/baeldung/factorymethod/InstanceBarFactoryIntegrationTest.java b/spring-core-4/src/test/java/com/baeldung/factorymethod/InstanceBarFactoryIntegrationTest.java
new file mode 100644
index 0000000000..b5728316e7
--- /dev/null
+++ b/spring-core-4/src/test/java/com/baeldung/factorymethod/InstanceBarFactoryIntegrationTest.java
@@ -0,0 +1,24 @@
+package com.baeldung.factorymethod;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration("/factorymethod/instance-bar-config.xml")
+public class InstanceBarFactoryIntegrationTest {
+
+ @Autowired
+ private Bar instance;
+
+ @Test
+ public void givenValidInstanceFactoryConfig_whenCreateInstance_thenNameIsCorrect() {
+ assertNotNull(instance);
+ assertEquals("someName", instance.getName());
+ }
+}
diff --git a/spring-core-4/src/test/java/com/baeldung/factorymethod/InstanceFooFactoryIntegrationTest.java b/spring-core-4/src/test/java/com/baeldung/factorymethod/InstanceFooFactoryIntegrationTest.java
new file mode 100644
index 0000000000..6b1857c2f2
--- /dev/null
+++ b/spring-core-4/src/test/java/com/baeldung/factorymethod/InstanceFooFactoryIntegrationTest.java
@@ -0,0 +1,22 @@
+package com.baeldung.factorymethod;
+
+import static org.junit.Assert.assertNotNull;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration("/factorymethod/instance-foo-config.xml")
+public class InstanceFooFactoryIntegrationTest {
+
+ @Autowired
+ private Foo foo;
+
+ @Test
+ public void givenValidInstanceFactoryConfig_whenCreateFooInstance_thenInstanceIsNotNull() {
+ assertNotNull(foo);
+ }
+}
diff --git a/spring-core-4/src/test/java/com/baeldung/factorymethod/SingletonBarFactoryIntegrationTest.java b/spring-core-4/src/test/java/com/baeldung/factorymethod/SingletonBarFactoryIntegrationTest.java
new file mode 100644
index 0000000000..403b46156b
--- /dev/null
+++ b/spring-core-4/src/test/java/com/baeldung/factorymethod/SingletonBarFactoryIntegrationTest.java
@@ -0,0 +1,24 @@
+package com.baeldung.factorymethod;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration("/factorymethod/static-bar-config.xml")
+public class SingletonBarFactoryIntegrationTest {
+
+ @Autowired
+ private Bar instance;
+
+ @Test
+ public void givenValidStaticFactoryConfig_whenCreateInstance_thenNameIsCorrect() {
+ assertNotNull(instance);
+ assertEquals("someName", instance.getName());
+ }
+}
diff --git a/spring-core-4/src/test/java/com/baeldung/factorymethod/SingletonFooFactoryIntegrationTest.java b/spring-core-4/src/test/java/com/baeldung/factorymethod/SingletonFooFactoryIntegrationTest.java
new file mode 100644
index 0000000000..52154b81ab
--- /dev/null
+++ b/spring-core-4/src/test/java/com/baeldung/factorymethod/SingletonFooFactoryIntegrationTest.java
@@ -0,0 +1,22 @@
+package com.baeldung.factorymethod;
+
+import static org.junit.Assert.assertNotNull;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@ContextConfiguration("/factorymethod/static-foo-config.xml")
+public class SingletonFooFactoryIntegrationTest {
+
+ @Autowired
+ private Foo singleton;
+
+ @Test
+ public void givenValidStaticFactoryConfig_whenCreateInstance_thenInstanceIsNotNull() {
+ assertNotNull(singleton);
+ }
+}
diff --git a/spring-core-4/src/test/resources/factorymethod/instance-bar-config.xml b/spring-core-4/src/test/resources/factorymethod/instance-bar-config.xml
new file mode 100644
index 0000000000..a4281aee4e
--- /dev/null
+++ b/spring-core-4/src/test/resources/factorymethod/instance-bar-config.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-core-4/src/test/resources/factorymethod/instance-foo-config.xml b/spring-core-4/src/test/resources/factorymethod/instance-foo-config.xml
new file mode 100644
index 0000000000..0f21f06f5a
--- /dev/null
+++ b/spring-core-4/src/test/resources/factorymethod/instance-foo-config.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-core-4/src/test/resources/factorymethod/static-bar-config.xml b/spring-core-4/src/test/resources/factorymethod/static-bar-config.xml
new file mode 100644
index 0000000000..2cacc293bc
--- /dev/null
+++ b/spring-core-4/src/test/resources/factorymethod/static-bar-config.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-core-4/src/test/resources/factorymethod/static-foo-config.xml b/spring-core-4/src/test/resources/factorymethod/static-foo-config.xml
new file mode 100644
index 0000000000..ffe1480638
--- /dev/null
+++ b/spring-core-4/src/test/resources/factorymethod/static-foo-config.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
\ No newline at end of file