diff --git a/core-java-modules/core-java-io-apis/README.md b/core-java-modules/core-java-io-apis/README.md
index 4d2bb0afb1..9399443ebd 100644
--- a/core-java-modules/core-java-io-apis/README.md
+++ b/core-java-modules/core-java-io-apis/README.md
@@ -7,7 +7,6 @@ This module contains articles about core Java input/output(IO) APIs.
- [A Guide to the Java FileReader Class](https://www.baeldung.com/java-filereader)
- [The Java File Class](https://www.baeldung.com/java-io-file)
- [Java FileWriter](https://www.baeldung.com/java-filewriter)
-- [Differences Between the Java WatchService API and the Apache Commons IO Monitor Library](https://www.baeldung.com/java-watchservice-vs-apache-commons-io-monitor-library)
- [Comparing getPath(), getAbsolutePath(), and getCanonicalPath() in Java](https://www.baeldung.com/java-path)
- [Quick Use of FilenameFilter](https://www.baeldung.com/java-filename-filter)
- [Guide to BufferedReader](https://www.baeldung.com/java-buffered-reader)
diff --git a/libraries-apache-commons/README.md b/libraries-apache-commons/README.md
index 439587266b..aceea3282a 100644
--- a/libraries-apache-commons/README.md
+++ b/libraries-apache-commons/README.md
@@ -13,3 +13,4 @@ This module contains articles about Apache Commons libraries.
- [Apache Commons BeanUtils](https://www.baeldung.com/apache-commons-beanutils)
- [Histograms with Apache Commons Frequency](https://www.baeldung.com/apache-commons-frequency)
- [An Introduction to Apache Commons Lang 3](https://www.baeldung.com/java-commons-lang-3)
+- [Differences Between the Java WatchService API and the Apache Commons IO Monitor Library](https://www.baeldung.com/java-watchservice-vs-apache-commons-io-monitor-library)
\ No newline at end of file
diff --git a/libraries-apache-commons/pom.xml b/libraries-apache-commons/pom.xml
index 688a500c4a..74adddabcf 100644
--- a/libraries-apache-commons/pom.xml
+++ b/libraries-apache-commons/pom.xml
@@ -57,6 +57,11 @@
xchart
${xchart-version}
+
+ commons-io
+ commons-io
+ ${common-io.version}
+
@@ -68,6 +73,7 @@
1.6
3.5.2
3.6.1
+ 2.5
diff --git a/core-java-modules/core-java-io-apis/src/main/java/com/baeldung/dirmonitoring/DirectoryMonitoringExample.java b/libraries-apache-commons/src/main/java/com/baeldung/dirmonitoring/DirectoryMonitoringExample.java
similarity index 100%
rename from core-java-modules/core-java-io-apis/src/main/java/com/baeldung/dirmonitoring/DirectoryMonitoringExample.java
rename to libraries-apache-commons/src/main/java/com/baeldung/dirmonitoring/DirectoryMonitoringExample.java
diff --git a/parent-boot-2/pom.xml b/parent-boot-2/pom.xml
index ab5424bfaf..ed0f327b8c 100644
--- a/parent-boot-2/pom.xml
+++ b/parent-boot-2/pom.xml
@@ -31,6 +31,7 @@
io.rest-assured
rest-assured
+ ${rest-assured.version}
org.springframework.boot
diff --git a/persistence-modules/core-java-persistence/src/main/java/com/baeldung/statmentVsPreparedstatment/DatasourceFactory.java b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/statmentVsPreparedstatment/DatasourceFactory.java
new file mode 100644
index 0000000000..adbdc66030
--- /dev/null
+++ b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/statmentVsPreparedstatment/DatasourceFactory.java
@@ -0,0 +1,23 @@
+package com.baeldung.statmentVsPreparedstatment;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+
+public class DatasourceFactory {
+
+ private Connection connection;
+
+ public Connection getConnection() throws ClassNotFoundException, SQLException {
+ Class.forName("org.h2.Driver");
+ connection = DriverManager.getConnection("jdbc:h2:mem:db_basic", "SA", "");
+ connection.setAutoCommit(false);
+ return connection;
+ }
+
+ public boolean createTables() throws SQLException {
+ String query = "create table if not exists PERSONS (ID INT, NAME VARCHAR(45))";
+ return connection.createStatement().executeUpdate(query) == 0;
+ }
+
+}
diff --git a/persistence-modules/core-java-persistence/src/main/java/com/baeldung/statmentVsPreparedstatment/PersonEntity.java b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/statmentVsPreparedstatment/PersonEntity.java
new file mode 100644
index 0000000000..72fc0c1e24
--- /dev/null
+++ b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/statmentVsPreparedstatment/PersonEntity.java
@@ -0,0 +1,42 @@
+package com.baeldung.statmentVsPreparedstatment;
+
+import java.util.Objects;
+
+public class PersonEntity {
+ private int id;
+ private String name;
+
+ public PersonEntity(int id, String name) {
+ this.id = id;
+ this.name = name;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Override public boolean equals(Object o) {
+ if (this == o)
+ return true;
+ if (o == null || getClass() != o.getClass())
+ return false;
+ PersonEntity that = (PersonEntity) o;
+ return id == that.id && Objects.equals(name, that.name);
+ }
+
+ @Override public int hashCode() {
+ return Objects.hash(id, name);
+ }
+}
diff --git a/persistence-modules/core-java-persistence/src/main/java/com/baeldung/statmentVsPreparedstatment/PreparedStatementPersonDao.java b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/statmentVsPreparedstatment/PreparedStatementPersonDao.java
new file mode 100644
index 0000000000..47124d9139
--- /dev/null
+++ b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/statmentVsPreparedstatment/PreparedStatementPersonDao.java
@@ -0,0 +1,88 @@
+package com.baeldung.statmentVsPreparedstatment;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+public class PreparedStatementPersonDao {
+
+ private final Connection connection;
+
+ public PreparedStatementPersonDao(Connection connection) {
+ this.connection = connection;
+ }
+
+ public Optional getById(int id) throws SQLException {
+ String query = "SELECT id, name FROM persons WHERE id = ?";
+
+ PreparedStatement preparedStatement = connection.prepareStatement(query);
+ preparedStatement.setInt(1, id);
+ ResultSet resultSet = preparedStatement.executeQuery();
+
+ if (resultSet.first()) {
+
+ PersonEntity result = new PersonEntity(resultSet.getInt("id"),
+ resultSet.getString("name"));
+
+ return Optional.of(result);
+ } else {
+ return Optional.empty();
+ }
+
+ }
+
+ public void insert(PersonEntity personEntity) throws SQLException {
+
+ String query = "INSERT INTO persons(id, name) VALUES( ?, ?)";
+
+ PreparedStatement preparedStatement = connection.prepareStatement(query);
+ preparedStatement.setInt(1, personEntity.getId());
+ preparedStatement.setString(2, personEntity.getName());
+ preparedStatement.executeUpdate();
+
+ }
+
+ public void insert(List personEntities) throws SQLException {
+ String query = "INSERT INTO persons(id, name) VALUES( ?, ?)";
+
+ PreparedStatement preparedStatement = connection.prepareStatement(query);
+ for (PersonEntity personEntity : personEntities) {
+ preparedStatement.setInt(1, personEntity.getId());
+ preparedStatement.setString(2, personEntity.getName());
+ preparedStatement.addBatch();
+ }
+ preparedStatement.executeBatch();
+
+ }
+
+ public void update(PersonEntity personEntity) throws SQLException {
+ String query = "UPDATE persons SET name = ? WHERE id = ?";
+ PreparedStatement preparedStatement = connection.prepareStatement(query);
+ preparedStatement.setString(1, personEntity.getName());
+ preparedStatement.setInt(2, personEntity.getId());
+ preparedStatement.executeUpdate();
+ }
+
+ public void deleteById(int id) throws SQLException {
+ String query = "DELETE FROM persons WHERE id = ?";
+ PreparedStatement preparedStatement = connection.prepareStatement(query);
+ preparedStatement.setInt(1, id);
+ preparedStatement.executeUpdate();
+ }
+
+ public List getAll() throws SQLException {
+ String query = "SELECT id, name FROM persons";
+
+ PreparedStatement preparedStatement = connection.prepareStatement(query);
+ ResultSet resultSet = preparedStatement.executeQuery();
+ List result = new ArrayList<>();
+ while (resultSet.next()) {
+ result.add(new PersonEntity(resultSet.getInt("id"), resultSet.getString("name")));
+ }
+ return result;
+ }
+}
diff --git a/persistence-modules/core-java-persistence/src/main/java/com/baeldung/statmentVsPreparedstatment/StatementPersonDao.java b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/statmentVsPreparedstatment/StatementPersonDao.java
new file mode 100644
index 0000000000..935ba8efa2
--- /dev/null
+++ b/persistence-modules/core-java-persistence/src/main/java/com/baeldung/statmentVsPreparedstatment/StatementPersonDao.java
@@ -0,0 +1,75 @@
+package com.baeldung.statmentVsPreparedstatment;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+public class StatementPersonDao {
+
+ private final Connection connection;
+
+ public StatementPersonDao(Connection connection) {
+ this.connection = connection;
+ }
+
+ public Optional getById(int id) throws SQLException {
+ String query = "SELECT id, name, FROM persons WHERE id = '" + id + "'";
+
+ Statement statement = connection.createStatement();
+ ResultSet resultSet = statement.executeQuery(query);
+
+ if (resultSet.first()) {
+ PersonEntity result = new PersonEntity(resultSet.getInt("id"),
+ resultSet.getString("name"));
+ return Optional.of(result);
+ } else {
+ return Optional.empty();
+ }
+ }
+
+ public void insert(PersonEntity personEntity) throws SQLException {
+ String query = "INSERT INTO persons(id, name) VALUES(" + personEntity.getId() + ", '"
+ + personEntity.getName() + "')";
+
+ Statement statement = connection.createStatement();
+ statement.executeUpdate(query);
+ }
+
+ public void insert(List personEntities) throws SQLException {
+ for (PersonEntity personEntity : personEntities) {
+ insert(personEntity);
+ }
+ }
+
+ public void update(PersonEntity personEntity) throws SQLException {
+
+ String query = "UPDATE persons SET name = '" + personEntity.getName() + "' WHERE id = "
+ + personEntity.getId();
+
+ Statement statement = connection.createStatement();
+ statement.executeUpdate(query);
+
+ }
+
+ public void deleteById(int id) throws SQLException {
+ String query = "DELETE FROM persons WHERE id = " + id;
+ Statement statement = connection.createStatement();
+ statement.executeUpdate(query);
+ }
+
+ public List getAll() throws SQLException {
+ String query = "SELECT id, name, FROM persons";
+
+ Statement statement = connection.createStatement();
+ ResultSet resultSet = statement.executeQuery(query);
+ List result = new ArrayList<>();
+ while (resultSet.next()) {
+ result.add(new PersonEntity(resultSet.getInt("id"), resultSet.getString("name")));
+ }
+ return result;
+ }
+}
diff --git a/persistence-modules/core-java-persistence/src/test/java/com/baeldung/statmentVsPreparedstatment/DatasourceFactoryUnitTest.java b/persistence-modules/core-java-persistence/src/test/java/com/baeldung/statmentVsPreparedstatment/DatasourceFactoryUnitTest.java
new file mode 100644
index 0000000000..5d3b151d5d
--- /dev/null
+++ b/persistence-modules/core-java-persistence/src/test/java/com/baeldung/statmentVsPreparedstatment/DatasourceFactoryUnitTest.java
@@ -0,0 +1,22 @@
+package com.baeldung.statmentVsPreparedstatment;
+
+import org.junit.jupiter.api.Test;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+class DatasourceFactoryUnitTest {
+
+ @Test
+ void whenCreateConnectionAndTables_thenConnectionIsOpenAndTableIsCreated()
+ throws SQLException, ClassNotFoundException {
+ DatasourceFactory factory = new DatasourceFactory();
+ Connection connection = factory.getConnection();
+
+ assertFalse(connection.isClosed());
+ assertTrue(factory.createTables());
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/core-java-persistence/src/test/java/com/baeldung/statmentVsPreparedstatment/PreparedStatementPersonDaoUnitTest.java b/persistence-modules/core-java-persistence/src/test/java/com/baeldung/statmentVsPreparedstatment/PreparedStatementPersonDaoUnitTest.java
new file mode 100644
index 0000000000..ce79f47802
--- /dev/null
+++ b/persistence-modules/core-java-persistence/src/test/java/com/baeldung/statmentVsPreparedstatment/PreparedStatementPersonDaoUnitTest.java
@@ -0,0 +1,94 @@
+package com.baeldung.statmentVsPreparedstatment;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class PreparedStatementPersonDaoUnitTest {
+ private PreparedStatementPersonDao dao;
+
+ @BeforeEach
+ void setup() throws SQLException, ClassNotFoundException {
+ DatasourceFactory datasourceFactory = new DatasourceFactory();
+ Connection connection = datasourceFactory.getConnection();
+ datasourceFactory.createTables();
+ dao = new PreparedStatementPersonDao(connection);
+ }
+
+ @Test
+ void whenInsertAPerson_thenItNeverThrowsAnException() {
+ assertDoesNotThrow(() -> dao.insert(new PersonEntity(1, "john")));
+ }
+
+ @Test
+ void whenInsertAPersonWithQuoteInText_thenItNeverThrowsAnException() {
+ assertDoesNotThrow(() -> dao.insert(new PersonEntity(1, "O'Brien")));
+ }
+
+ @Test
+ void whenGetAPersonById_thenItReturnThePersonInDatabase() throws SQLException {
+ dao.insert(new PersonEntity(1, "john"));
+
+ Optional maybeEmployee = dao.getById(1);
+ assertTrue(maybeEmployee.isPresent());
+
+ PersonEntity personEntity = maybeEmployee.get();
+
+ assertEquals(1, personEntity.getId());
+ assertEquals("john", personEntity.getName());
+ }
+
+ @Test
+ void whenInsertAndGetMultiplePersons_thenItNeverThrowsAnException() throws SQLException {
+ assertDoesNotThrow(() -> dao.insert(
+ Arrays.asList(new PersonEntity(1, "john"), new PersonEntity(2, "skit"))));
+
+ List result = dao.getAll();
+
+ assertEquals(Arrays.asList(new PersonEntity(1, "john"), new PersonEntity(2, "skit")),
+ result);
+ }
+
+ @Test
+ void whenUpdateAnExistentPerson_thenItReturnsTheUpdatedPerson() throws SQLException {
+ dao.insert(new PersonEntity(1, "john"));
+ dao.update(new PersonEntity(1, "johnny"));
+
+ Optional maybePerson = dao.getById(1);
+
+ assertTrue(maybePerson.isPresent());
+
+ PersonEntity personEntity = maybePerson.get();
+
+ assertEquals(1, personEntity.getId());
+ assertEquals("johnny", personEntity.getName());
+ }
+
+ @Test
+ void whenDeleteAPersonById_thenItWillBeAbsentInDatabase() throws SQLException {
+ dao.insert(new PersonEntity(1, "john"));
+ dao.deleteById(1);
+
+ Optional maybePerson = dao.getById(1);
+
+ assertFalse(maybePerson.isPresent());
+ }
+
+ @Test
+ void whenAHackerUpdateAPerson_thenItUpdatesTheTargetPerson() throws SQLException {
+ dao.insert(Arrays.asList(new PersonEntity(1, "john"), new PersonEntity(2, "skeet")));
+ dao.update(new PersonEntity(1, "hacker' --"));
+
+ List result = dao.getAll();
+
+ assertEquals(Arrays.asList(new PersonEntity(1, "hacker' --"), new PersonEntity(2, "skeet")),
+ result);
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/core-java-persistence/src/test/java/com/baeldung/statmentVsPreparedstatment/StatementPersonDaoUnitTest.java b/persistence-modules/core-java-persistence/src/test/java/com/baeldung/statmentVsPreparedstatment/StatementPersonDaoUnitTest.java
new file mode 100644
index 0000000000..b31bdcc296
--- /dev/null
+++ b/persistence-modules/core-java-persistence/src/test/java/com/baeldung/statmentVsPreparedstatment/StatementPersonDaoUnitTest.java
@@ -0,0 +1,96 @@
+package com.baeldung.statmentVsPreparedstatment;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class StatementPersonDaoUnitTest {
+
+ private StatementPersonDao dao;
+
+ @BeforeEach
+ void setup() throws SQLException, ClassNotFoundException {
+ DatasourceFactory datasourceFactory = new DatasourceFactory();
+ Connection connection = datasourceFactory.getConnection();
+ datasourceFactory.createTables();
+ dao = new StatementPersonDao(connection);
+ }
+
+ @Test
+ void whenInsertAPerson_thenItNeverThrowsAnException() {
+ assertDoesNotThrow(() -> dao.insert(new PersonEntity(1, "john")));
+ }
+
+ @Test
+ void whenInsertAPersonWithQuoteInText_thenItWillThrowAnException() {
+ assertThrows(SQLException.class, () -> dao.insert(new PersonEntity(1, "O'Brien")));
+ }
+
+ @Test
+ void whenGetAPersonById_thenItReturnThePersonInDatabase() throws SQLException {
+ dao.insert(new PersonEntity(1, "john"));
+
+ Optional maybeEmployee = dao.getById(1);
+
+ assertTrue(maybeEmployee.isPresent());
+
+ PersonEntity personEntity = maybeEmployee.get();
+
+ assertEquals(1, personEntity.getId());
+ assertEquals("john", personEntity.getName());
+ }
+
+ @Test
+ void whenInsertAndGetMultiplePersons_thenItNeverThrowsAnException() throws SQLException {
+ assertDoesNotThrow(() -> dao.insert(
+ Arrays.asList(new PersonEntity(1, "john"), new PersonEntity(2, "skeet"))));
+
+ List result = dao.getAll();
+
+ assertEquals(Arrays.asList(new PersonEntity(1, "john"), new PersonEntity(2, "skeet")),
+ result);
+ }
+
+ @Test
+ void whenUpdateAnExistentPerson_thenItReturnsTheUpdatedPerson() throws SQLException {
+ dao.insert(new PersonEntity(1, "john"));
+ dao.update(new PersonEntity(1, "johnny"));
+
+ Optional maybePerson = dao.getById(1);
+
+ assertTrue(maybePerson.isPresent());
+
+ PersonEntity personEntity = maybePerson.get();
+
+ assertEquals(1, personEntity.getId());
+ assertEquals("johnny", personEntity.getName());
+ }
+
+ @Test
+ void whenDeleteAPersonById_thenItWillBeAbsentInDatabase() throws SQLException {
+ dao.insert(new PersonEntity(1, "john"));
+ dao.deleteById(1);
+
+ Optional maybePerson = dao.getById(1);
+
+ assertFalse(maybePerson.isPresent());
+ }
+
+ @Test
+ void whenAHackerUpdateAPerson_thenItAllPersonsAreUpdated() throws SQLException {
+ dao.insert(Arrays.asList(new PersonEntity(1, "john"), new PersonEntity(2, "skeet")));
+ dao.update(new PersonEntity(1, "hacker' --"));
+
+ List result = dao.getAll();
+
+ assertEquals(Arrays.asList(new PersonEntity(1, "hacker"), new PersonEntity(2, "hacker")),
+ result);
+ }
+}
\ No newline at end of file
diff --git a/persistence-modules/hibernate-exceptions/README.md b/persistence-modules/hibernate-exceptions/README.md
index c2014a3c91..616800a63d 100644
--- a/persistence-modules/hibernate-exceptions/README.md
+++ b/persistence-modules/hibernate-exceptions/README.md
@@ -1,3 +1,5 @@
### Relevant Articles:
- [Hibernate could not initialize proxy – no Session](https://www.baeldung.com/hibernate-initialize-proxy-exception)
+- [Hibernate Error “No Persistence Provider for EntityManager”](https://www.baeldung.com/hibernate-no-persistence-provider)
+- [TransactionRequiredException Error](https://www.baeldung.com/jpa-transaction-required-exception)
\ No newline at end of file
diff --git a/persistence-modules/hibernate-jpa/README.md b/persistence-modules/hibernate-jpa/README.md
index 514fcedb8a..64ec9dcae3 100644
--- a/persistence-modules/hibernate-jpa/README.md
+++ b/persistence-modules/hibernate-jpa/README.md
@@ -11,7 +11,5 @@ This module contains articles specific to use of Hibernate as a JPA implementati
- [Criteria API – An Example of IN Expressions](https://www.baeldung.com/jpa-criteria-api-in-expressions)
- [One-to-One Relationship in JPA](https://www.baeldung.com/jpa-one-to-one)
- [Enabling Transaction Locks in Spring Data JPA](https://www.baeldung.com/java-jpa-transaction-locks)
-- [TransactionRequiredException Error](https://www.baeldung.com/jpa-transaction-required-exception)
- [JPA/Hibernate Persistence Context](https://www.baeldung.com/jpa-hibernate-persistence-context)
- [Quick Guide to EntityManager#getReference()](https://www.baeldung.com/jpa-entity-manager-get-reference)
-- [Hibernate Error “No Persistence Provider for EntityManager”](https://www.baeldung.com/hibernate-no-persistence-provider)
diff --git a/persistence-modules/spring-data-redis/pom.xml b/persistence-modules/spring-data-redis/pom.xml
index d2bf074d03..d271df31c7 100644
--- a/persistence-modules/spring-data-redis/pom.xml
+++ b/persistence-modules/spring-data-redis/pom.xml
@@ -98,7 +98,6 @@
3.2.4
0.10.0
0.6
- 2.1.9.RELEASE
diff --git a/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/reactive/redis/config/RedisConfig.java b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/reactive/redis/config/RedisConfig.java
index d23d0092eb..de8e447ef8 100644
--- a/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/reactive/redis/config/RedisConfig.java
+++ b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/reactive/redis/config/RedisConfig.java
@@ -31,11 +31,6 @@ public class RedisConfig {
return new ReactiveRedisTemplate<>(factory, context);
}
- @Bean
- public ReactiveRedisTemplate reactiveRedisTemplateString(ReactiveRedisConnectionFactory connectionFactory) {
- return new ReactiveRedisTemplate<>(connectionFactory, RedisSerializationContext.string());
- }
-
@Bean
public ReactiveKeyCommands keyCommands(final ReactiveRedisConnectionFactory reactiveRedisConnectionFactory) {
return reactiveRedisConnectionFactory.getReactiveConnection()
diff --git a/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/SpringRedisApplication.java b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/SpringRedisApplication.java
new file mode 100644
index 0000000000..82c06f803b
--- /dev/null
+++ b/persistence-modules/spring-data-redis/src/main/java/com/baeldung/spring/data/redis/SpringRedisApplication.java
@@ -0,0 +1,13 @@
+package com.baeldung.spring.data.redis;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SpringRedisApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SpringRedisApplication.class, args);
+ }
+
+}
diff --git a/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/reactive/redis/template/RedisTemplateListOpsIntegrationTest.java b/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/reactive/redis/template/RedisTemplateListOpsIntegrationTest.java
index 58846d7c27..cd5994c854 100644
--- a/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/reactive/redis/template/RedisTemplateListOpsIntegrationTest.java
+++ b/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/reactive/redis/template/RedisTemplateListOpsIntegrationTest.java
@@ -2,9 +2,6 @@ package com.baeldung.spring.data.reactive.redis.template;
import com.baeldung.spring.data.reactive.redis.SpringRedisReactiveApplication;
-
-import java.io.IOException;
-
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
@@ -13,7 +10,7 @@ import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.ReactiveListOperations;
-import org.springframework.data.redis.core.ReactiveRedisTemplate;
+import org.springframework.data.redis.core.ReactiveStringRedisTemplate;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.annotation.DirtiesContext.ClassMode;
import org.springframework.test.context.junit4.SpringRunner;
@@ -21,6 +18,8 @@ import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;
import redis.embedded.RedisServerBuilder;
+import java.io.IOException;
+
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = SpringRedisReactiveApplication.class)
@DirtiesContext(classMode = ClassMode.BEFORE_CLASS)
@@ -30,7 +29,7 @@ public class RedisTemplateListOpsIntegrationTest {
private static redis.embedded.RedisServer redisServer;
@Autowired
- private ReactiveRedisTemplate redisTemplate;
+ private ReactiveStringRedisTemplate redisTemplate;
private ReactiveListOperations reactiveListOps;
diff --git a/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/RedisMessageListenerIntegrationTest.java b/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/RedisMessageListenerIntegrationTest.java
index 6f9e6a8757..6501f3f9f0 100644
--- a/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/RedisMessageListenerIntegrationTest.java
+++ b/persistence-modules/spring-data-redis/src/test/java/com/baeldung/spring/data/redis/RedisMessageListenerIntegrationTest.java
@@ -1,44 +1,40 @@
package com.baeldung.spring.data.redis;
-import static org.junit.Assert.assertTrue;
-
-import java.io.IOException;
-import java.util.UUID;
-
+import com.baeldung.spring.data.redis.queue.RedisMessagePublisher;
+import com.baeldung.spring.data.redis.queue.RedisMessageSubscriber;
import org.junit.AfterClass;
import org.junit.BeforeClass;
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.annotation.DirtiesContext;
import org.springframework.test.annotation.DirtiesContext.ClassMode;
-import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-
-import com.baeldung.spring.data.redis.config.RedisConfig;
-import com.baeldung.spring.data.redis.queue.RedisMessagePublisher;
-import com.baeldung.spring.data.redis.queue.RedisMessageSubscriber;
-
+import org.springframework.test.context.junit4.SpringRunner;
import redis.embedded.RedisServerBuilder;
-@RunWith(SpringJUnit4ClassRunner.class)
-@ContextConfiguration(classes = RedisConfig.class)
+import java.util.UUID;
+
+import static org.junit.Assert.assertTrue;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = SpringRedisApplication.class)
@DirtiesContext(classMode = ClassMode.BEFORE_CLASS)
public class RedisMessageListenerIntegrationTest {
private static redis.embedded.RedisServer redisServer;
-
+
@Autowired
private RedisMessagePublisher redisMessagePublisher;
-
+
@BeforeClass
- public static void startRedisServer() throws IOException {
+ public static void startRedisServer() {
redisServer = new RedisServerBuilder().port(6379).setting("maxmemory 256M").build();
redisServer.start();
}
-
+
@AfterClass
- public static void stopRedisServer() throws IOException {
+ public static void stopRedisServer() {
redisServer.stop();
}
diff --git a/pom.xml b/pom.xml
index f5409d60c4..9d9c448887 100644
--- a/pom.xml
+++ b/pom.xml
@@ -386,6 +386,7 @@
core-java-modules
core-kotlin-modules
+ core-scala
couchbase
custom-pmd
@@ -559,6 +560,7 @@
atomikos
reactive-systems
+ slack
@@ -707,6 +709,7 @@
spring-rest-shell
spring-rest-simple
spring-resttemplate
+ spring-resttemplate-2
spring-rest-testing
spring-roo
@@ -901,6 +904,7 @@
core-java-modules
core-kotlin-modules
+ core-scala
couchbase
custom-pmd
@@ -1071,6 +1075,7 @@
atomikos
reactive-systems
+ slack
@@ -1211,6 +1216,7 @@
spring-rest-shell
spring-rest-simple
spring-resttemplate
+ spring-resttemplate-2
spring-rest-testing
spring-roo
diff --git a/spring-boot-modules/spring-boot-client/pom.xml b/spring-boot-modules/spring-boot-client/pom.xml
index a7737be106..aa832497e9 100644
--- a/spring-boot-modules/spring-boot-client/pom.xml
+++ b/spring-boot-modules/spring-boot-client/pom.xml
@@ -116,7 +116,6 @@
18.0
- 1.2.0
2.2.4
diff --git a/spring-boot-modules/spring-boot-parent/spring-boot-with-starter-parent/pom.xml b/spring-boot-modules/spring-boot-parent/spring-boot-with-starter-parent/pom.xml
index 7413492d7f..108e66b68e 100644
--- a/spring-boot-modules/spring-boot-parent/spring-boot-with-starter-parent/pom.xml
+++ b/spring-boot-modules/spring-boot-parent/spring-boot-with-starter-parent/pom.xml
@@ -41,7 +41,5 @@
1.8
2.2.5.RELEASE
- 4.11
-
diff --git a/spring-cloud/pom.xml b/spring-cloud/pom.xml
index 6fddb1693f..0e2cac1ff9 100644
--- a/spring-cloud/pom.xml
+++ b/spring-cloud/pom.xml
@@ -10,9 +10,9 @@
com.baeldung
- parent-modules
- 1.0.0-SNAPSHOT
- ..
+ parent-boot-2
+ 0.0.1-SNAPSHOT
+ ../parent-boot-2
@@ -56,17 +56,15 @@
- 1.2.2.RELEASE
- Brixton.SR7
- 1.2.2.RELEASE
- 1.2.2.RELEASE
- 2.0.2.RELEASE
- 1.4.6.RELEASE
- 1.2.3.RELEASE
- 1.3.0.RELEASE
- 1.4.2.RELEASE
- 1.4.2.RELEASE
- 1.2.3.RELEASE
+ Hoxton.SR4
+ 2.2.3.RELEASE
+ 2.2.3.RELEASE
+ 1.4.7.RELEASE
+ 1.4.7.RELEASE
+ 1.4.7.RELEASE
+ 3.0.6.RELEASE
+ 2.3.1.RELEASE
+ 2.3.1.RELEASE
diff --git a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/discovery/DiscoveryClientApplication.java b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/discovery/DiscoveryClientApplication.java
index d013969ad3..e01799b8d9 100644
--- a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/discovery/DiscoveryClientApplication.java
+++ b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/discovery/DiscoveryClientApplication.java
@@ -4,12 +4,14 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import static org.springframework.boot.WebApplicationType.NONE;
+
@SpringBootApplication
@EnableDiscoveryClient
public class DiscoveryClientApplication {
public static void main(String[] args) {
- new SpringApplicationBuilder(DiscoveryClientApplication.class).web(true)
+ new SpringApplicationBuilder(DiscoveryClientApplication.class).web(NONE)
.run(args);
}
diff --git a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/health/ServiceDiscoveryApplication.java b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/health/ServiceDiscoveryApplication.java
index 020d7d017c..1ef3e34e08 100644
--- a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/health/ServiceDiscoveryApplication.java
+++ b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/health/ServiceDiscoveryApplication.java
@@ -1,13 +1,16 @@
package com.baeldung.spring.cloud.consul.health;
+import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
+import static org.springframework.boot.WebApplicationType.NONE;
+
@SpringBootApplication
public class ServiceDiscoveryApplication {
public static void main(String[] args) {
- new SpringApplicationBuilder(ServiceDiscoveryApplication.class).web(true)
+ new SpringApplicationBuilder(ServiceDiscoveryApplication.class).web(NONE)
.run(args);
}
diff --git a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/properties/DistributedPropertiesApplication.java b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/properties/DistributedPropertiesApplication.java
index c1d2b0acc5..d854b5aaba 100644
--- a/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/properties/DistributedPropertiesApplication.java
+++ b/spring-cloud/spring-cloud-consul/src/main/java/com/baeldung/spring/cloud/consul/properties/DistributedPropertiesApplication.java
@@ -4,12 +4,14 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.web.bind.annotation.RestController;
+import static org.springframework.boot.WebApplicationType.NONE;
+
@SpringBootApplication
@RestController
public class DistributedPropertiesApplication {
public static void main(String[] args) {
- new SpringApplicationBuilder(DistributedPropertiesApplication.class).web(true)
+ new SpringApplicationBuilder(DistributedPropertiesApplication.class).web(NONE)
.run(args);
}
diff --git a/spring-cloud/spring-cloud-functions/pom.xml b/spring-cloud/spring-cloud-functions/pom.xml
index 4654d70dd7..7e6f5dfbdc 100644
--- a/spring-cloud/spring-cloud-functions/pom.xml
+++ b/spring-cloud/spring-cloud-functions/pom.xml
@@ -85,7 +85,6 @@
1.0.1.RELEASE
2.0.2
1.1.0
- 2.0.4.RELEASE
1.0.10.RELEASE
diff --git a/spring-cloud/spring-cloud-hystrix/feign-rest-consumer/pom.xml b/spring-cloud/spring-cloud-hystrix/feign-rest-consumer/pom.xml
index 367b7c111e..acb9993881 100644
--- a/spring-cloud/spring-cloud-hystrix/feign-rest-consumer/pom.xml
+++ b/spring-cloud/spring-cloud-hystrix/feign-rest-consumer/pom.xml
@@ -36,18 +36,22 @@
org.springframework.cloud
spring-cloud-starter-hystrix
+ ${spring-cloud-starter-hystrix.version}
org.springframework.cloud
spring-cloud-starter-hystrix-dashboard
+ ${spring-cloud-starter-hystrix.version}
org.springframework.cloud
spring-cloud-starter-feign
+ ${spring-cloud-starter-feign.version}
org.springframework.boot
spring-boot-starter-web
+ ${spring-boot-starter-web.version}
org.springframework.boot
diff --git a/spring-cloud/spring-cloud-hystrix/feign-rest-consumer/src/main/java/com/baeldung/spring/cloud/hystrix/rest/consumer/GreetingClient.java b/spring-cloud/spring-cloud-hystrix/feign-rest-consumer/src/main/java/com/baeldung/spring/cloud/hystrix/rest/consumer/GreetingClient.java
index 4fcfb0eeda..2a31917352 100644
--- a/spring-cloud/spring-cloud-hystrix/feign-rest-consumer/src/main/java/com/baeldung/spring/cloud/hystrix/rest/consumer/GreetingClient.java
+++ b/spring-cloud/spring-cloud-hystrix/feign-rest-consumer/src/main/java/com/baeldung/spring/cloud/hystrix/rest/consumer/GreetingClient.java
@@ -1,7 +1,7 @@
package com.baeldung.spring.cloud.hystrix.rest.consumer;
import com.baeldung.spring.cloud.hystrix.rest.producer.GreetingController;
-import org.springframework.cloud.netflix.feign.FeignClient;
+import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PathVariable;
diff --git a/spring-cloud/spring-cloud-hystrix/feign-rest-consumer/src/main/java/com/baeldung/spring/cloud/hystrix/rest/consumer/RestConsumerFeignApplication.java b/spring-cloud/spring-cloud-hystrix/feign-rest-consumer/src/main/java/com/baeldung/spring/cloud/hystrix/rest/consumer/RestConsumerFeignApplication.java
index 2fc54216fe..044b0dbcb8 100644
--- a/spring-cloud/spring-cloud-hystrix/feign-rest-consumer/src/main/java/com/baeldung/spring/cloud/hystrix/rest/consumer/RestConsumerFeignApplication.java
+++ b/spring-cloud/spring-cloud-hystrix/feign-rest-consumer/src/main/java/com/baeldung/spring/cloud/hystrix/rest/consumer/RestConsumerFeignApplication.java
@@ -3,8 +3,8 @@ package com.baeldung.spring.cloud.hystrix.rest.consumer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
-import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
+import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableCircuitBreaker
diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplicationIntegrationTest.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplicationIntegrationTest.java
index 898d06897f..c8b8c9f1a9 100644
--- a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplicationIntegrationTest.java
+++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsServiceApplicationIntegrationTest.java
@@ -28,13 +28,13 @@ public class MultipleOutputsServiceApplicationIntegrationTest {
@Test
public void whenSendMessage_thenResponseIsInAOutput() {
whenSendMessage(1);
- thenPayloadInChannelIs(pipe.anOutput(), 1);
+ thenPayloadInChannelIs(pipe.anOutput(), "1");
}
@Test
public void whenSendMessage_thenResponseIsInAnotherOutput() {
whenSendMessage(11);
- thenPayloadInChannelIs(pipe.anotherOutput(), 11);
+ thenPayloadInChannelIs(pipe.anotherOutput(), "11");
}
private void whenSendMessage(Integer val) {
@@ -43,7 +43,7 @@ public class MultipleOutputsServiceApplicationIntegrationTest {
.build());
}
- private void thenPayloadInChannelIs(MessageChannel channel, Integer expectedValue) {
+ private void thenPayloadInChannelIs(MessageChannel channel, String expectedValue) {
Object payload = messageCollector.forChannel(channel)
.poll()
.getPayload();
diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceIntegrationTest.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceIntegrationTest.java
index c3bf5a1205..1aa8d38aa1 100644
--- a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceIntegrationTest.java
+++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MultipleOutputsWithConditionsServiceIntegrationTest.java
@@ -28,13 +28,13 @@ public class MultipleOutputsWithConditionsServiceIntegrationTest {
@Test
public void whenSendMessage_thenResponseIsInAOutput() {
whenSendMessage(1);
- thenPayloadInChannelIs(pipe.anOutput(), 1);
+ thenPayloadInChannelIs(pipe.anOutput(), "1");
}
@Test
public void whenSendMessage_thenResponseIsInAnotherOutput() {
whenSendMessage(11);
- thenPayloadInChannelIs(pipe.anotherOutput(), 11);
+ thenPayloadInChannelIs(pipe.anotherOutput(), "11");
}
private void whenSendMessage(Integer val) {
@@ -43,7 +43,7 @@ public class MultipleOutputsWithConditionsServiceIntegrationTest {
.build());
}
- private void thenPayloadInChannelIs(MessageChannel channel, Integer expectedValue) {
+ private void thenPayloadInChannelIs(MessageChannel channel, String expectedValue) {
Object payload = messageCollector.forChannel(channel)
.poll()
.getPayload();
diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerApplicationIntegrationTest.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerApplicationIntegrationTest.java
index 21d84e79e0..7e5f4fbec7 100644
--- a/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerApplicationIntegrationTest.java
+++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-rabbit/src/test/java/com/baeldung/spring/cloud/stream/rabbit/MyLoggerApplicationIntegrationTest.java
@@ -35,6 +35,6 @@ public class MyLoggerApplicationIntegrationTest {
.poll()
.getPayload();
- assertEquals("[1]: This is my message", payload.toString());
+ assertEquals("{\"message\":\"[1]: This is my message\"}", payload.toString());
}
}
diff --git a/spring-cloud/spring-cloud-zookeeper/Greeting/pom.xml b/spring-cloud/spring-cloud-zookeeper/Greeting/pom.xml
index ac469d8bc4..871218e78c 100644
--- a/spring-cloud/spring-cloud-zookeeper/Greeting/pom.xml
+++ b/spring-cloud/spring-cloud-zookeeper/Greeting/pom.xml
@@ -30,6 +30,10 @@
spring-boot-starter
${spring-boot.version}
+
+ org.springframework.boot
+ spring-boot-starter-web
+
org.springframework
spring-web
@@ -56,7 +60,10 @@
spring-cloud-starter-feign
${spring-cloud-starter-feign.version}
-
+
+ org.springframework.cloud
+ spring-cloud-starter-openfeign
+
org.springframework.boot
spring-boot-starter-test
@@ -71,7 +78,6 @@
- 1.2.5.RELEASE
1.3
diff --git a/spring-cloud/spring-cloud-zookeeper/Greeting/src/main/java/com/baeldung/spring/cloud/greeting/HelloWorldClient.java b/spring-cloud/spring-cloud-zookeeper/Greeting/src/main/java/com/baeldung/spring/cloud/greeting/HelloWorldClient.java
index c56cb1907a..dc90576e08 100644
--- a/spring-cloud/spring-cloud-zookeeper/Greeting/src/main/java/com/baeldung/spring/cloud/greeting/HelloWorldClient.java
+++ b/spring-cloud/spring-cloud-zookeeper/Greeting/src/main/java/com/baeldung/spring/cloud/greeting/HelloWorldClient.java
@@ -2,8 +2,8 @@ package com.baeldung.spring.cloud.greeting;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
-import org.springframework.cloud.netflix.feign.EnableFeignClients;
-import org.springframework.cloud.netflix.feign.FeignClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
diff --git a/spring-cloud/spring-cloud-zookeeper/pom.xml b/spring-cloud/spring-cloud-zookeeper/pom.xml
index 64d30b19a6..244ccbd957 100644
--- a/spring-cloud/spring-cloud-zookeeper/pom.xml
+++ b/spring-cloud/spring-cloud-zookeeper/pom.xml
@@ -18,8 +18,7 @@
- 1.5.2.RELEASE
- 4.3.7.RELEASE
+ 5.2.7.RELEASE
1.0.3.RELEASE
diff --git a/spring-core-2/README.md b/spring-core-2/README.md
index 10d3080b45..3c6bd05876 100644
--- a/spring-core-2/README.md
+++ b/spring-core-2/README.md
@@ -6,13 +6,9 @@ This module contains articles about core Spring functionality
- [Guide to Spring @Autowired](http://www.baeldung.com/spring-autowire)
- [Spring Profiles](http://www.baeldung.com/spring-profiles)
-- [A Spring Custom Annotation for a Better DAO](http://www.baeldung.com/spring-annotation-bean-pre-processor)
- [Quick Guide to Spring Bean Scopes](http://www.baeldung.com/spring-bean-scopes)
-- [Custom Scope in Spring](http://www.baeldung.com/spring-custom-scope)
- [@Order in Spring](http://www.baeldung.com/spring-order)
- [Spring @Primary Annotation](http://www.baeldung.com/spring-primary)
- [Spring Events](https://www.baeldung.com/spring-events)
- [Spring Null-Safety Annotations](https://www.baeldung.com/spring-null-safety-annotations)
-- [Using @Autowired in Abstract Classes](https://www.baeldung.com/spring-autowired-abstract-class)
-- [Running Setup Data on Startup in Spring](https://www.baeldung.com/running-setup-logic-on-startup-in-spring)
- More articles: [[<-- prev]](/spring-core)[[next -->]](/spring-core-3)
diff --git a/spring-core-3/README.md b/spring-core-3/README.md
index 6c210b23ef..b6257cb9a4 100644
--- a/spring-core-3/README.md
+++ b/spring-core-3/README.md
@@ -7,8 +7,8 @@ This module contains articles about core Spring functionality
- [Understanding getBean() in Spring](https://www.baeldung.com/spring-getbean)
- [Guide to the Spring BeanFactory](https://www.baeldung.com/spring-beanfactory)
- [How to use the Spring FactoryBean?](https://www.baeldung.com/spring-factorybean)
-- [Spring – Injecting Collections](https://www.baeldung.com/spring-injecting-collections)
- [Design Patterns in the Spring Framework](https://www.baeldung.com/spring-framework-design-patterns)
-- [Injecting a Value in a Static Field in Spring](https://www.baeldung.com/spring-inject-static-field)
- [Difference Between BeanFactory and ApplicationContext](https://www.baeldung.com/spring-beanfactory-vs-applicationcontext)
+- [A Spring Custom Annotation for a Better DAO](http://www.baeldung.com/spring-annotation-bean-pre-processor)
+- [Custom Scope in Spring](http://www.baeldung.com/spring-custom-scope)
- More articles: [[<-- prev]](/spring-core-2)
diff --git a/spring-core-2/src/main/java/com/baeldung/customannotation/CustomAnnotationConfiguration.java b/spring-core-3/src/main/java/com/baeldung/customannotation/CustomAnnotationConfiguration.java
similarity index 100%
rename from spring-core-2/src/main/java/com/baeldung/customannotation/CustomAnnotationConfiguration.java
rename to spring-core-3/src/main/java/com/baeldung/customannotation/CustomAnnotationConfiguration.java
diff --git a/spring-core-2/src/main/java/com/baeldung/customannotation/DataAccess.java b/spring-core-3/src/main/java/com/baeldung/customannotation/DataAccess.java
similarity index 100%
rename from spring-core-2/src/main/java/com/baeldung/customannotation/DataAccess.java
rename to spring-core-3/src/main/java/com/baeldung/customannotation/DataAccess.java
diff --git a/spring-core-2/src/main/java/com/baeldung/customannotation/DataAccessAnnotationProcessor.java b/spring-core-3/src/main/java/com/baeldung/customannotation/DataAccessAnnotationProcessor.java
similarity index 100%
rename from spring-core-2/src/main/java/com/baeldung/customannotation/DataAccessAnnotationProcessor.java
rename to spring-core-3/src/main/java/com/baeldung/customannotation/DataAccessAnnotationProcessor.java
diff --git a/spring-core-2/src/main/java/com/baeldung/customannotation/DataAccessFieldCallback.java b/spring-core-3/src/main/java/com/baeldung/customannotation/DataAccessFieldCallback.java
similarity index 100%
rename from spring-core-2/src/main/java/com/baeldung/customannotation/DataAccessFieldCallback.java
rename to spring-core-3/src/main/java/com/baeldung/customannotation/DataAccessFieldCallback.java
diff --git a/spring-core-2/src/main/java/com/baeldung/customannotation/GenericDAO.java b/spring-core-3/src/main/java/com/baeldung/customannotation/GenericDAO.java
similarity index 100%
rename from spring-core-2/src/main/java/com/baeldung/customannotation/GenericDAO.java
rename to spring-core-3/src/main/java/com/baeldung/customannotation/GenericDAO.java
diff --git a/spring-core-2/src/main/java/com/baeldung/customscope/TenantBean.java b/spring-core-3/src/main/java/com/baeldung/customscope/TenantBean.java
similarity index 100%
rename from spring-core-2/src/main/java/com/baeldung/customscope/TenantBean.java
rename to spring-core-3/src/main/java/com/baeldung/customscope/TenantBean.java
diff --git a/spring-core-2/src/main/java/com/baeldung/customscope/TenantBeanFactoryPostProcessor.java b/spring-core-3/src/main/java/com/baeldung/customscope/TenantBeanFactoryPostProcessor.java
similarity index 100%
rename from spring-core-2/src/main/java/com/baeldung/customscope/TenantBeanFactoryPostProcessor.java
rename to spring-core-3/src/main/java/com/baeldung/customscope/TenantBeanFactoryPostProcessor.java
diff --git a/spring-core-2/src/main/java/com/baeldung/customscope/TenantBeansConfig.java b/spring-core-3/src/main/java/com/baeldung/customscope/TenantBeansConfig.java
similarity index 100%
rename from spring-core-2/src/main/java/com/baeldung/customscope/TenantBeansConfig.java
rename to spring-core-3/src/main/java/com/baeldung/customscope/TenantBeansConfig.java
diff --git a/spring-core-2/src/main/java/com/baeldung/customscope/TenantScope.java b/spring-core-3/src/main/java/com/baeldung/customscope/TenantScope.java
similarity index 100%
rename from spring-core-2/src/main/java/com/baeldung/customscope/TenantScope.java
rename to spring-core-3/src/main/java/com/baeldung/customscope/TenantScope.java
diff --git a/spring-core-2/src/main/java/com/baeldung/customscope/TenantScopeConfig.java b/spring-core-3/src/main/java/com/baeldung/customscope/TenantScopeConfig.java
similarity index 100%
rename from spring-core-2/src/main/java/com/baeldung/customscope/TenantScopeConfig.java
rename to spring-core-3/src/main/java/com/baeldung/customscope/TenantScopeConfig.java
diff --git a/spring-core-2/src/test/java/com/baeldung/customannotation/Account.java b/spring-core-3/src/test/java/com/baeldung/customannotation/Account.java
similarity index 100%
rename from spring-core-2/src/test/java/com/baeldung/customannotation/Account.java
rename to spring-core-3/src/test/java/com/baeldung/customannotation/Account.java
diff --git a/spring-core-2/src/test/java/com/baeldung/customannotation/BeanWithGenericDAO.java b/spring-core-3/src/test/java/com/baeldung/customannotation/BeanWithGenericDAO.java
similarity index 100%
rename from spring-core-2/src/test/java/com/baeldung/customannotation/BeanWithGenericDAO.java
rename to spring-core-3/src/test/java/com/baeldung/customannotation/BeanWithGenericDAO.java
diff --git a/spring-core-2/src/test/java/com/baeldung/customannotation/DataAccessAnnotationIntegrationTest.java b/spring-core-3/src/test/java/com/baeldung/customannotation/DataAccessAnnotationIntegrationTest.java
similarity index 100%
rename from spring-core-2/src/test/java/com/baeldung/customannotation/DataAccessAnnotationIntegrationTest.java
rename to spring-core-3/src/test/java/com/baeldung/customannotation/DataAccessAnnotationIntegrationTest.java
diff --git a/spring-core-2/src/test/java/com/baeldung/customannotation/DataAccessFieldCallbackIntegrationTest.java b/spring-core-3/src/test/java/com/baeldung/customannotation/DataAccessFieldCallbackIntegrationTest.java
similarity index 100%
rename from spring-core-2/src/test/java/com/baeldung/customannotation/DataAccessFieldCallbackIntegrationTest.java
rename to spring-core-3/src/test/java/com/baeldung/customannotation/DataAccessFieldCallbackIntegrationTest.java
diff --git a/spring-core-2/src/test/java/com/baeldung/customannotation/Person.java b/spring-core-3/src/test/java/com/baeldung/customannotation/Person.java
similarity index 100%
rename from spring-core-2/src/test/java/com/baeldung/customannotation/Person.java
rename to spring-core-3/src/test/java/com/baeldung/customannotation/Person.java
diff --git a/spring-core-2/src/test/java/com/baeldung/customscope/TenantScopeIntegrationTest.java b/spring-core-3/src/test/java/com/baeldung/customscope/TenantScopeIntegrationTest.java
similarity index 100%
rename from spring-core-2/src/test/java/com/baeldung/customscope/TenantScopeIntegrationTest.java
rename to spring-core-3/src/test/java/com/baeldung/customscope/TenantScopeIntegrationTest.java
diff --git a/spring-core-4/README.md b/spring-core-4/README.md
index 9da90ac77a..706c330f39 100644
--- a/spring-core-4/README.md
+++ b/spring-core-4/README.md
@@ -8,4 +8,7 @@ This module contains articles about core Spring functionality
- [How to dynamically Autowire a Bean in Spring](https://www.baeldung.com/spring-dynamic-autowire)
- [Spring @Import Annotation](https://www.baeldung.com/spring-import-annotation)
- [Spring BeanPostProcessor](https://www.baeldung.com/spring-beanpostprocessor)
+- [Using @Autowired in Abstract Classes](https://www.baeldung.com/spring-autowired-abstract-class)
+- [Running Setup Data on Startup in Spring](https://www.baeldung.com/running-setup-logic-on-startup-in-spring)
+- [Constructor Injection in Spring with Lombok](https://www.baeldung.com/spring-injection-lombok)
- More articles: [[<-- prev]](/spring-core-3)
diff --git a/spring-core-4/pom.xml b/spring-core-4/pom.xml
index 299debbc3c..df0b90fef2 100644
--- a/spring-core-4/pom.xml
+++ b/spring-core-4/pom.xml
@@ -24,11 +24,26 @@
spring-core
${spring.version}
+
+ org.springframework
+ spring-web
+ ${spring.version}
+
+
+ org.springframework
+ spring-webmvc
+ ${spring.version}
+
org.springframework
spring-expression
${spring.version}
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+
com.google.guava
guava
@@ -64,6 +79,12 @@
${assertj-core.version}
test
+
+ javax.servlet
+ javax.servlet-api
+ 4.0.0
+
+
diff --git a/spring-core-4/src/main/java/com/baeldung/applicationcontext/AccountConfig.java b/spring-core-4/src/main/java/com/baeldung/applicationcontext/AccountConfig.java
new file mode 100644
index 0000000000..d4c960bd68
--- /dev/null
+++ b/spring-core-4/src/main/java/com/baeldung/applicationcontext/AccountConfig.java
@@ -0,0 +1,28 @@
+package com.baeldung.applicationcontext;
+
+import org.springframework.context.MessageSource;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.support.ResourceBundleMessageSource;
+
+@Configuration
+public class AccountConfig {
+
+ @Bean
+ public AccountService accountService() {
+ return new AccountService(accountRepository());
+ }
+
+ @Bean
+ public AccountRepository accountRepository() {
+ return new AccountRepository();
+ }
+
+ @Bean
+ public MessageSource messageSource() {
+ ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
+ messageSource.setBasename("config/messages");
+ return messageSource;
+ }
+
+}
diff --git a/spring-core-4/src/main/java/com/baeldung/applicationcontext/AccountRepository.java b/spring-core-4/src/main/java/com/baeldung/applicationcontext/AccountRepository.java
new file mode 100644
index 0000000000..f15475acf3
--- /dev/null
+++ b/spring-core-4/src/main/java/com/baeldung/applicationcontext/AccountRepository.java
@@ -0,0 +1,5 @@
+package com.baeldung.applicationcontext;
+
+public class AccountRepository {
+
+}
diff --git a/spring-core-4/src/main/java/com/baeldung/applicationcontext/AccountService.java b/spring-core-4/src/main/java/com/baeldung/applicationcontext/AccountService.java
new file mode 100644
index 0000000000..c8b58915a8
--- /dev/null
+++ b/spring-core-4/src/main/java/com/baeldung/applicationcontext/AccountService.java
@@ -0,0 +1,32 @@
+package com.baeldung.applicationcontext;
+
+import java.util.Locale;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.MessageSource;
+
+public class AccountService {
+
+ @Autowired
+ private AccountRepository accountRepository;
+
+ @Autowired
+ private MessageSource messageSource;
+
+ public void setAccountRepository(AccountRepository accountRepository) {
+ this.accountRepository = accountRepository;
+ }
+
+ public AccountRepository getAccountRepository() {
+ return accountRepository;
+ }
+
+ public AccountService(AccountRepository accountRepository) {
+ this.accountRepository = accountRepository;
+ }
+
+ public String getAccountName() {
+ return messageSource.getMessage("account.name", null, Locale.ENGLISH);
+ }
+
+}
diff --git a/spring-core-4/src/main/java/com/baeldung/applicationcontext/MyWebApplicationInitializer.java b/spring-core-4/src/main/java/com/baeldung/applicationcontext/MyWebApplicationInitializer.java
new file mode 100644
index 0000000000..0296910311
--- /dev/null
+++ b/spring-core-4/src/main/java/com/baeldung/applicationcontext/MyWebApplicationInitializer.java
@@ -0,0 +1,24 @@
+package com.baeldung.applicationcontext;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRegistration;
+
+import org.springframework.web.WebApplicationInitializer;
+import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
+import org.springframework.web.servlet.DispatcherServlet;
+
+public class MyWebApplicationInitializer implements WebApplicationInitializer {
+
+ public void onStartup(ServletContext container) throws ServletException {
+ AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
+ context.register(AccountConfig.class);
+ context.setServletContext(container);
+
+ ServletRegistration.Dynamic servlet = container.addServlet("dispatcher", new DispatcherServlet(context));
+ servlet.setLoadOnStartup(1);
+
+ servlet.addMapping("/");
+ }
+
+}
diff --git a/spring-core-4/src/main/java/com/baeldung/applicationcontext/MyXmlWebApplicationInitializer.java b/spring-core-4/src/main/java/com/baeldung/applicationcontext/MyXmlWebApplicationInitializer.java
new file mode 100644
index 0000000000..fe681f1784
--- /dev/null
+++ b/spring-core-4/src/main/java/com/baeldung/applicationcontext/MyXmlWebApplicationInitializer.java
@@ -0,0 +1,24 @@
+package com.baeldung.applicationcontext;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRegistration;
+
+import org.springframework.web.WebApplicationInitializer;
+import org.springframework.web.context.support.XmlWebApplicationContext;
+import org.springframework.web.servlet.DispatcherServlet;
+
+public class MyXmlWebApplicationInitializer implements WebApplicationInitializer {
+
+ public void onStartup(ServletContext container) throws ServletException {
+ XmlWebApplicationContext context = new XmlWebApplicationContext();
+ context.setConfigLocation("/WEB-INF/spring/applicationContext.xml");
+ context.setServletContext(container);
+
+ ServletRegistration.Dynamic servlet = container.addServlet("dispatcher", new DispatcherServlet(context));
+ servlet.setLoadOnStartup(1);
+
+ servlet.addMapping("/");
+ }
+
+}
diff --git a/spring-core-4/src/main/java/com/baeldung/applicationcontext/UserService.java b/spring-core-4/src/main/java/com/baeldung/applicationcontext/UserService.java
new file mode 100644
index 0000000000..b63d6828a7
--- /dev/null
+++ b/spring-core-4/src/main/java/com/baeldung/applicationcontext/UserService.java
@@ -0,0 +1,10 @@
+package com.baeldung.applicationcontext;
+
+import org.springframework.stereotype.Component;
+
+@Component
+public class UserService {
+
+ // user service code
+
+}
diff --git a/spring-core/src/main/java/com/baeldung/lombok/ApologizeService.java b/spring-core-4/src/main/java/com/baeldung/lombok/ApologizeService.java
similarity index 100%
rename from spring-core/src/main/java/com/baeldung/lombok/ApologizeService.java
rename to spring-core-4/src/main/java/com/baeldung/lombok/ApologizeService.java
diff --git a/spring-core/src/main/java/com/baeldung/lombok/FarewellService.java b/spring-core-4/src/main/java/com/baeldung/lombok/FarewellService.java
similarity index 100%
rename from spring-core/src/main/java/com/baeldung/lombok/FarewellService.java
rename to spring-core-4/src/main/java/com/baeldung/lombok/FarewellService.java
diff --git a/spring-core/src/main/java/com/baeldung/lombok/GreetingService.java b/spring-core-4/src/main/java/com/baeldung/lombok/GreetingService.java
similarity index 100%
rename from spring-core/src/main/java/com/baeldung/lombok/GreetingService.java
rename to spring-core-4/src/main/java/com/baeldung/lombok/GreetingService.java
diff --git a/spring-core/src/main/java/com/baeldung/lombok/ThankingService.java b/spring-core-4/src/main/java/com/baeldung/lombok/ThankingService.java
similarity index 100%
rename from spring-core/src/main/java/com/baeldung/lombok/ThankingService.java
rename to spring-core-4/src/main/java/com/baeldung/lombok/ThankingService.java
diff --git a/spring-core/src/main/java/com/baeldung/lombok/Translator.java b/spring-core-4/src/main/java/com/baeldung/lombok/Translator.java
similarity index 100%
rename from spring-core/src/main/java/com/baeldung/lombok/Translator.java
rename to spring-core-4/src/main/java/com/baeldung/lombok/Translator.java
diff --git a/spring-core-2/src/main/java/com/baeldung/sampleabstract/BallService.java b/spring-core-4/src/main/java/com/baeldung/sampleabstract/BallService.java
similarity index 100%
rename from spring-core-2/src/main/java/com/baeldung/sampleabstract/BallService.java
rename to spring-core-4/src/main/java/com/baeldung/sampleabstract/BallService.java
diff --git a/spring-core-2/src/main/java/com/baeldung/sampleabstract/BasketballService.java b/spring-core-4/src/main/java/com/baeldung/sampleabstract/BasketballService.java
similarity index 100%
rename from spring-core-2/src/main/java/com/baeldung/sampleabstract/BasketballService.java
rename to spring-core-4/src/main/java/com/baeldung/sampleabstract/BasketballService.java
diff --git a/spring-core-2/src/main/java/com/baeldung/sampleabstract/DemoApp.java b/spring-core-4/src/main/java/com/baeldung/sampleabstract/DemoApp.java
similarity index 100%
rename from spring-core-2/src/main/java/com/baeldung/sampleabstract/DemoApp.java
rename to spring-core-4/src/main/java/com/baeldung/sampleabstract/DemoApp.java
diff --git a/spring-core-2/src/main/java/com/baeldung/sampleabstract/LogRepository.java b/spring-core-4/src/main/java/com/baeldung/sampleabstract/LogRepository.java
similarity index 100%
rename from spring-core-2/src/main/java/com/baeldung/sampleabstract/LogRepository.java
rename to spring-core-4/src/main/java/com/baeldung/sampleabstract/LogRepository.java
diff --git a/spring-core-2/src/main/java/com/baeldung/sampleabstract/RuleRepository.java b/spring-core-4/src/main/java/com/baeldung/sampleabstract/RuleRepository.java
similarity index 100%
rename from spring-core-2/src/main/java/com/baeldung/sampleabstract/RuleRepository.java
rename to spring-core-4/src/main/java/com/baeldung/sampleabstract/RuleRepository.java
diff --git a/spring-core-2/src/main/java/com/baeldung/startup/AllStrategiesExampleBean.java b/spring-core-4/src/main/java/com/baeldung/startup/AllStrategiesExampleBean.java
similarity index 100%
rename from spring-core-2/src/main/java/com/baeldung/startup/AllStrategiesExampleBean.java
rename to spring-core-4/src/main/java/com/baeldung/startup/AllStrategiesExampleBean.java
diff --git a/spring-core-2/src/main/java/com/baeldung/startup/EventListenerExampleBean.java b/spring-core-4/src/main/java/com/baeldung/startup/EventListenerExampleBean.java
similarity index 100%
rename from spring-core-2/src/main/java/com/baeldung/startup/EventListenerExampleBean.java
rename to spring-core-4/src/main/java/com/baeldung/startup/EventListenerExampleBean.java
diff --git a/spring-core-2/src/main/java/com/baeldung/startup/InitMethodExampleBean.java b/spring-core-4/src/main/java/com/baeldung/startup/InitMethodExampleBean.java
similarity index 100%
rename from spring-core-2/src/main/java/com/baeldung/startup/InitMethodExampleBean.java
rename to spring-core-4/src/main/java/com/baeldung/startup/InitMethodExampleBean.java
diff --git a/spring-core-2/src/main/java/com/baeldung/startup/InitializingBeanExampleBean.java b/spring-core-4/src/main/java/com/baeldung/startup/InitializingBeanExampleBean.java
similarity index 100%
rename from spring-core-2/src/main/java/com/baeldung/startup/InitializingBeanExampleBean.java
rename to spring-core-4/src/main/java/com/baeldung/startup/InitializingBeanExampleBean.java
diff --git a/spring-core-2/src/main/java/com/baeldung/startup/InvalidInitExampleBean.java b/spring-core-4/src/main/java/com/baeldung/startup/InvalidInitExampleBean.java
similarity index 100%
rename from spring-core-2/src/main/java/com/baeldung/startup/InvalidInitExampleBean.java
rename to spring-core-4/src/main/java/com/baeldung/startup/InvalidInitExampleBean.java
diff --git a/spring-core-2/src/main/java/com/baeldung/startup/LogicInConstructorExampleBean.java b/spring-core-4/src/main/java/com/baeldung/startup/LogicInConstructorExampleBean.java
similarity index 100%
rename from spring-core-2/src/main/java/com/baeldung/startup/LogicInConstructorExampleBean.java
rename to spring-core-4/src/main/java/com/baeldung/startup/LogicInConstructorExampleBean.java
diff --git a/spring-core-2/src/main/java/com/baeldung/startup/PostConstructExampleBean.java b/spring-core-4/src/main/java/com/baeldung/startup/PostConstructExampleBean.java
similarity index 100%
rename from spring-core-2/src/main/java/com/baeldung/startup/PostConstructExampleBean.java
rename to spring-core-4/src/main/java/com/baeldung/startup/PostConstructExampleBean.java
diff --git a/spring-core-2/src/main/java/com/baeldung/startup/SpringStartupConfig.java b/spring-core-4/src/main/java/com/baeldung/startup/SpringStartupConfig.java
similarity index 100%
rename from spring-core-2/src/main/java/com/baeldung/startup/SpringStartupConfig.java
rename to spring-core-4/src/main/java/com/baeldung/startup/SpringStartupConfig.java
diff --git a/spring-core-2/src/main/java/com/baeldung/startup/StartupApplicationListenerExample.java b/spring-core-4/src/main/java/com/baeldung/startup/StartupApplicationListenerExample.java
similarity index 100%
rename from spring-core-2/src/main/java/com/baeldung/startup/StartupApplicationListenerExample.java
rename to spring-core-4/src/main/java/com/baeldung/startup/StartupApplicationListenerExample.java
diff --git a/spring-core-2/src/main/resources/startupConfig.xml b/spring-core-4/src/main/resources/startupConfig.xml
similarity index 100%
rename from spring-core-2/src/main/resources/startupConfig.xml
rename to spring-core-4/src/main/resources/startupConfig.xml
diff --git a/spring-core-4/src/test/java/com/baeldung/applicationcontext/ApplicationContextUnitTest.java b/spring-core-4/src/test/java/com/baeldung/applicationcontext/ApplicationContextUnitTest.java
new file mode 100644
index 0000000000..491d5dd9d0
--- /dev/null
+++ b/spring-core-4/src/test/java/com/baeldung/applicationcontext/ApplicationContextUnitTest.java
@@ -0,0 +1,71 @@
+package com.baeldung.applicationcontext;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import org.junit.Ignore;
+import org.junit.Test;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+import org.springframework.context.support.FileSystemXmlApplicationContext;
+
+public class ApplicationContextUnitTest {
+
+ @Test
+ public void givenAnnotationConfigAppContext_whenSpringConfig_thenMappingSuccess() {
+ ApplicationContext context = new AnnotationConfigApplicationContext(AccountConfig.class);
+ AccountService accountService = context.getBean(AccountService.class);
+
+ assertNotNull(accountService);
+ assertNotNull(accountService.getAccountRepository());
+
+ ((AnnotationConfigApplicationContext) context).close();
+ }
+
+ @Test
+ public void givenClasspathXmlAppContext_whenAnnotationConfig_thenMappingSuccess() {
+ ApplicationContext context = new ClassPathXmlApplicationContext("applicationcontext/user-bean-config.xml");
+ UserService userService = context.getBean(UserService.class);
+
+ assertNotNull(userService);
+
+ ((ClassPathXmlApplicationContext) context).close();
+ }
+
+ @Test
+ @Ignore
+ public void givenFileXmlAppContext_whenXMLConfig_thenMappingSuccess() {
+ String path = "D:/workspaces/Baeldung/tutorials/spring-core-4/src/test/resources/applicationcontext/account-bean-config.xml";
+
+ ApplicationContext context = new FileSystemXmlApplicationContext(path);
+ AccountService accountService = context.getBean("accountService", AccountService.class);
+
+ assertNotNull(accountService);
+ assertNotNull(accountService.getAccountRepository());
+
+ ((FileSystemXmlApplicationContext) context).close();
+ }
+
+ @Test
+ public void givenClasspathXmlAppContext_whenXMLConfig_thenMappingSuccess() {
+ ApplicationContext context = new ClassPathXmlApplicationContext("applicationcontext/account-bean-config.xml");
+ AccountService accountService = context.getBean("accountService", AccountService.class);
+
+ assertNotNull(accountService);
+ assertNotNull(accountService.getAccountRepository());
+
+ ((ClassPathXmlApplicationContext) context).close();
+ }
+
+ @Test
+ public void givenMessagesInFile_whenMessageResourceUsed_thenReadMessage() {
+ ApplicationContext context = new AnnotationConfigApplicationContext(AccountConfig.class);
+ AccountService accountService = context.getBean(AccountService.class);
+
+ assertEquals("TestAccount", accountService.getAccountName());
+
+ ((AnnotationConfigApplicationContext) context).close();
+ }
+
+}
diff --git a/spring-core/src/test/java/com/baeldung/lombok/ApologizeServiceAutowiringIntegrationTest.java b/spring-core-4/src/test/java/com/baeldung/lombok/ApologizeServiceAutowiringIntegrationTest.java
similarity index 100%
rename from spring-core/src/test/java/com/baeldung/lombok/ApologizeServiceAutowiringIntegrationTest.java
rename to spring-core-4/src/test/java/com/baeldung/lombok/ApologizeServiceAutowiringIntegrationTest.java
diff --git a/spring-core/src/test/java/com/baeldung/lombok/ApologizeServiceIntegrationTest.java b/spring-core-4/src/test/java/com/baeldung/lombok/ApologizeServiceIntegrationTest.java
similarity index 100%
rename from spring-core/src/test/java/com/baeldung/lombok/ApologizeServiceIntegrationTest.java
rename to spring-core-4/src/test/java/com/baeldung/lombok/ApologizeServiceIntegrationTest.java
diff --git a/spring-core/src/test/java/com/baeldung/lombok/FarewellAutowiringIntegrationTest.java b/spring-core-4/src/test/java/com/baeldung/lombok/FarewellAutowiringIntegrationTest.java
similarity index 100%
rename from spring-core/src/test/java/com/baeldung/lombok/FarewellAutowiringIntegrationTest.java
rename to spring-core-4/src/test/java/com/baeldung/lombok/FarewellAutowiringIntegrationTest.java
diff --git a/spring-core/src/test/java/com/baeldung/lombok/FarewellServiceIntegrationTest.java b/spring-core-4/src/test/java/com/baeldung/lombok/FarewellServiceIntegrationTest.java
similarity index 100%
rename from spring-core/src/test/java/com/baeldung/lombok/FarewellServiceIntegrationTest.java
rename to spring-core-4/src/test/java/com/baeldung/lombok/FarewellServiceIntegrationTest.java
diff --git a/spring-core/src/test/java/com/baeldung/lombok/GreetingServiceIntegrationTest.java b/spring-core-4/src/test/java/com/baeldung/lombok/GreetingServiceIntegrationTest.java
similarity index 100%
rename from spring-core/src/test/java/com/baeldung/lombok/GreetingServiceIntegrationTest.java
rename to spring-core-4/src/test/java/com/baeldung/lombok/GreetingServiceIntegrationTest.java
diff --git a/spring-core/src/test/java/com/baeldung/lombok/TestConfig.java b/spring-core-4/src/test/java/com/baeldung/lombok/TestConfig.java
similarity index 100%
rename from spring-core/src/test/java/com/baeldung/lombok/TestConfig.java
rename to spring-core-4/src/test/java/com/baeldung/lombok/TestConfig.java
diff --git a/spring-core/src/test/java/com/baeldung/lombok/ThankingServiceAutowiringIntegrationTest.java b/spring-core-4/src/test/java/com/baeldung/lombok/ThankingServiceAutowiringIntegrationTest.java
similarity index 100%
rename from spring-core/src/test/java/com/baeldung/lombok/ThankingServiceAutowiringIntegrationTest.java
rename to spring-core-4/src/test/java/com/baeldung/lombok/ThankingServiceAutowiringIntegrationTest.java
diff --git a/spring-core/src/test/java/com/baeldung/lombok/ThankingServiceIntegrationTest.java b/spring-core-4/src/test/java/com/baeldung/lombok/ThankingServiceIntegrationTest.java
similarity index 100%
rename from spring-core/src/test/java/com/baeldung/lombok/ThankingServiceIntegrationTest.java
rename to spring-core-4/src/test/java/com/baeldung/lombok/ThankingServiceIntegrationTest.java
diff --git a/spring-core-2/src/test/java/com/baeldung/startup/SpringStartupIntegrationTest.java b/spring-core-4/src/test/java/com/baeldung/startup/SpringStartupIntegrationTest.java
similarity index 100%
rename from spring-core-2/src/test/java/com/baeldung/startup/SpringStartupIntegrationTest.java
rename to spring-core-4/src/test/java/com/baeldung/startup/SpringStartupIntegrationTest.java
diff --git a/spring-core-2/src/test/java/com/baeldung/startup/SpringStartupXMLConfigIntegrationTest.java b/spring-core-4/src/test/java/com/baeldung/startup/SpringStartupXMLConfigIntegrationTest.java
similarity index 100%
rename from spring-core-2/src/test/java/com/baeldung/startup/SpringStartupXMLConfigIntegrationTest.java
rename to spring-core-4/src/test/java/com/baeldung/startup/SpringStartupXMLConfigIntegrationTest.java
diff --git a/spring-core-4/src/test/resources/applicationcontext/account-bean-config.xml b/spring-core-4/src/test/resources/applicationcontext/account-bean-config.xml
new file mode 100644
index 0000000000..eef434928f
--- /dev/null
+++ b/spring-core-4/src/test/resources/applicationcontext/account-bean-config.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
diff --git a/spring-core-4/src/test/resources/applicationcontext/user-bean-config.xml b/spring-core-4/src/test/resources/applicationcontext/user-bean-config.xml
new file mode 100644
index 0000000000..9779d64270
--- /dev/null
+++ b/spring-core-4/src/test/resources/applicationcontext/user-bean-config.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
diff --git a/spring-core-4/src/test/resources/config/messages.properties b/spring-core-4/src/test/resources/config/messages.properties
new file mode 100644
index 0000000000..7d5a4baa73
--- /dev/null
+++ b/spring-core-4/src/test/resources/config/messages.properties
@@ -0,0 +1 @@
+account.name=TestAccount
diff --git a/spring-core/README.md b/spring-core/README.md
index 1f3dcb783b..b8d46f6b34 100644
--- a/spring-core/README.md
+++ b/spring-core/README.md
@@ -3,10 +3,8 @@
This module contains articles about core Spring functionality
### Relevant Articles:
-- [Wiring in Spring: @Autowired, @Resource and @Inject](https://www.baeldung.com/spring-annotations-resource-inject-autowire)
-- [Constructor Injection in Spring with Lombok](https://www.baeldung.com/spring-injection-lombok)
+
- [Introduction to Spring’s StreamUtils](https://www.baeldung.com/spring-stream-utils)
-- [XML-Based Injection in Spring](https://www.baeldung.com/spring-xml-injection)
- [A Quick Guide to the Spring @Lazy Annotation](https://www.baeldung.com/spring-lazy-annotation)
- [BeanNameAware and BeanFactoryAware Interfaces in Spring](https://www.baeldung.com/spring-bean-name-factory-aware)
- [Access a File from the Classpath in a Spring Application](https://www.baeldung.com/spring-classpath-file-access)
diff --git a/spring-di-2/README.md b/spring-di-2/README.md
new file mode 100644
index 0000000000..15249efa7c
--- /dev/null
+++ b/spring-di-2/README.md
@@ -0,0 +1,11 @@
+## Spring Dependency Injection
+
+This module contains articles about dependency injection with Spring
+
+### Relevant Articles
+
+- [Injecting Spring Beans into Unmanaged Objects](https://www.baeldung.com/spring-inject-bean-into-unmanaged-objects)
+- [Injecting a Value in a Static Field in Spring](https://www.baeldung.com/spring-inject-static-field)
+- [Spring – Injecting Collections](https://www.baeldung.com/spring-injecting-collections)
+- [Wiring in Spring: @Autowired, @Resource and @Inject](https://www.baeldung.com/spring-annotations-resource-inject-autowire)
+- More articles: [[<-- prev]](/spring-di)
\ No newline at end of file
diff --git a/spring-di-2/pom.xml b/spring-di-2/pom.xml
index 9b703d55d9..4dd92ca18c 100644
--- a/spring-di-2/pom.xml
+++ b/spring-di-2/pom.xml
@@ -25,11 +25,26 @@
spring-boot-starter-data-jpa
${spring-boot.version}
+
+ org.springframework.boot
+ spring-boot-starter-web
+ ${spring-boot.version}
+
org.springframework
spring-aspects
${spring.version}
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+
+
+ javax.inject
+ javax.inject
+ ${javax.inject.version}
+
@@ -61,5 +76,6 @@
2.3.1.RELEASE
1.11
+ 1
\ No newline at end of file
diff --git a/spring-core-3/src/main/java/com/baeldung/collection/BaeldungBean.java b/spring-di-2/src/main/java/com/baeldung/collection/BaeldungBean.java
similarity index 100%
rename from spring-core-3/src/main/java/com/baeldung/collection/BaeldungBean.java
rename to spring-di-2/src/main/java/com/baeldung/collection/BaeldungBean.java
diff --git a/spring-core-3/src/main/java/com/baeldung/collection/CollectionConfig.java b/spring-di-2/src/main/java/com/baeldung/collection/CollectionConfig.java
similarity index 100%
rename from spring-core-3/src/main/java/com/baeldung/collection/CollectionConfig.java
rename to spring-di-2/src/main/java/com/baeldung/collection/CollectionConfig.java
diff --git a/spring-core-3/src/main/java/com/baeldung/collection/CollectionInjectionDemo.java b/spring-di-2/src/main/java/com/baeldung/collection/CollectionInjectionDemo.java
similarity index 100%
rename from spring-core-3/src/main/java/com/baeldung/collection/CollectionInjectionDemo.java
rename to spring-di-2/src/main/java/com/baeldung/collection/CollectionInjectionDemo.java
diff --git a/spring-core-3/src/main/java/com/baeldung/collection/CollectionsBean.java b/spring-di-2/src/main/java/com/baeldung/collection/CollectionsBean.java
similarity index 100%
rename from spring-core-3/src/main/java/com/baeldung/collection/CollectionsBean.java
rename to spring-di-2/src/main/java/com/baeldung/collection/CollectionsBean.java
diff --git a/spring-di/src/main/java/com/baeldung/dependency/AnotherArbitraryDependency.java b/spring-di-2/src/main/java/com/baeldung/dependency/AnotherArbitraryDependency.java
similarity index 100%
rename from spring-di/src/main/java/com/baeldung/dependency/AnotherArbitraryDependency.java
rename to spring-di-2/src/main/java/com/baeldung/dependency/AnotherArbitraryDependency.java
diff --git a/spring-di/src/main/java/com/baeldung/dependency/ArbitraryDependency.java b/spring-di-2/src/main/java/com/baeldung/dependency/ArbitraryDependency.java
similarity index 100%
rename from spring-di/src/main/java/com/baeldung/dependency/ArbitraryDependency.java
rename to spring-di-2/src/main/java/com/baeldung/dependency/ArbitraryDependency.java
diff --git a/spring-di/src/main/java/com/baeldung/dependency/YetAnotherArbitraryDependency.java b/spring-di-2/src/main/java/com/baeldung/dependency/YetAnotherArbitraryDependency.java
similarity index 100%
rename from spring-di/src/main/java/com/baeldung/dependency/YetAnotherArbitraryDependency.java
rename to spring-di-2/src/main/java/com/baeldung/dependency/YetAnotherArbitraryDependency.java
diff --git a/spring-core-3/src/main/java/com/baeldung/staticvalue/injection/Application.java b/spring-di-2/src/main/java/com/baeldung/staticvalue/injection/Application.java
similarity index 72%
rename from spring-core-3/src/main/java/com/baeldung/staticvalue/injection/Application.java
rename to spring-di-2/src/main/java/com/baeldung/staticvalue/injection/Application.java
index 45c47c955f..b4222ddcc9 100644
--- a/spring-core-3/src/main/java/com/baeldung/staticvalue/injection/Application.java
+++ b/spring-di-2/src/main/java/com/baeldung/staticvalue/injection/Application.java
@@ -2,9 +2,10 @@ package com.baeldung.staticvalue.injection;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.annotation.PropertySource;
-@SpringBootApplication
+@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
@PropertySource("/application.properties")
public class Application {
diff --git a/spring-core-3/src/main/java/com/baeldung/staticvalue/injection/PropertyController.java b/spring-di-2/src/main/java/com/baeldung/staticvalue/injection/PropertyController.java
similarity index 100%
rename from spring-core-3/src/main/java/com/baeldung/staticvalue/injection/PropertyController.java
rename to spring-di-2/src/main/java/com/baeldung/staticvalue/injection/PropertyController.java
diff --git a/spring-di-2/src/main/resources/application.properties b/spring-di-2/src/main/resources/application.properties
new file mode 100644
index 0000000000..828fa9cd2a
--- /dev/null
+++ b/spring-di-2/src/main/resources/application.properties
@@ -0,0 +1 @@
+name = Inject a value to a static field
diff --git a/spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredName.java b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/ApplicationContextTestAutowiredName.java
similarity index 85%
rename from spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredName.java
rename to spring-di-2/src/test/java/com/baeldung/wiring/configuration/ApplicationContextTestAutowiredName.java
index 48c4495465..3046e68829 100644
--- a/spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredName.java
+++ b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/ApplicationContextTestAutowiredName.java
@@ -1,4 +1,4 @@
-package com.baeldung.configuration;
+package com.baeldung.wiring.configuration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
diff --git a/spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredQualifier.java b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/ApplicationContextTestAutowiredQualifier.java
similarity index 94%
rename from spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredQualifier.java
rename to spring-di-2/src/test/java/com/baeldung/wiring/configuration/ApplicationContextTestAutowiredQualifier.java
index ef6690ab4b..33969ea69d 100644
--- a/spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredQualifier.java
+++ b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/ApplicationContextTestAutowiredQualifier.java
@@ -1,9 +1,10 @@
-package com.baeldung.configuration;
+package com.baeldung.wiring.configuration;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
import com.baeldung.dependency.AnotherArbitraryDependency;
import com.baeldung.dependency.ArbitraryDependency;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
@Configuration
public class ApplicationContextTestAutowiredQualifier {
diff --git a/spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredType.java b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/ApplicationContextTestAutowiredType.java
similarity index 90%
rename from spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredType.java
rename to spring-di-2/src/test/java/com/baeldung/wiring/configuration/ApplicationContextTestAutowiredType.java
index 240bc466b7..24cdd978e4 100644
--- a/spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredType.java
+++ b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/ApplicationContextTestAutowiredType.java
@@ -1,9 +1,10 @@
-package com.baeldung.configuration;
+package com.baeldung.wiring.configuration;
-import com.baeldung.dependency.ArbitraryDependency;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import com.baeldung.dependency.ArbitraryDependency;
+
@Configuration
public class ApplicationContextTestAutowiredType {
diff --git a/spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectName.java b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/ApplicationContextTestInjectName.java
similarity index 92%
rename from spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectName.java
rename to spring-di-2/src/test/java/com/baeldung/wiring/configuration/ApplicationContextTestInjectName.java
index 851aa0b8ee..cb465d0183 100644
--- a/spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectName.java
+++ b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/ApplicationContextTestInjectName.java
@@ -1,9 +1,10 @@
-package com.baeldung.configuration;
+package com.baeldung.wiring.configuration;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
import com.baeldung.dependency.ArbitraryDependency;
import com.baeldung.dependency.YetAnotherArbitraryDependency;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
@Configuration
public class ApplicationContextTestInjectName {
diff --git a/spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectQualifier.java b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/ApplicationContextTestInjectQualifier.java
similarity index 93%
rename from spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectQualifier.java
rename to spring-di-2/src/test/java/com/baeldung/wiring/configuration/ApplicationContextTestInjectQualifier.java
index 59af5a91bb..c2a63dac9e 100644
--- a/spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectQualifier.java
+++ b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/ApplicationContextTestInjectQualifier.java
@@ -1,9 +1,10 @@
-package com.baeldung.configuration;
+package com.baeldung.wiring.configuration;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
import com.baeldung.dependency.AnotherArbitraryDependency;
import com.baeldung.dependency.ArbitraryDependency;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
@Configuration
public class ApplicationContextTestInjectQualifier {
diff --git a/spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectType.java b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/ApplicationContextTestInjectType.java
similarity index 90%
rename from spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectType.java
rename to spring-di-2/src/test/java/com/baeldung/wiring/configuration/ApplicationContextTestInjectType.java
index 1e1f01f269..15a75b8f2d 100644
--- a/spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectType.java
+++ b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/ApplicationContextTestInjectType.java
@@ -1,9 +1,10 @@
-package com.baeldung.configuration;
+package com.baeldung.wiring.configuration;
-import com.baeldung.dependency.ArbitraryDependency;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import com.baeldung.dependency.ArbitraryDependency;
+
@Configuration
public class ApplicationContextTestInjectType {
diff --git a/spring-core/src/test/java/com/baeldung/configuration/ApplicationContextTestResourceNameType.java b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/ApplicationContextTestResourceNameType.java
similarity index 89%
rename from spring-core/src/test/java/com/baeldung/configuration/ApplicationContextTestResourceNameType.java
rename to spring-di-2/src/test/java/com/baeldung/wiring/configuration/ApplicationContextTestResourceNameType.java
index cb1b5981e8..708ade7647 100644
--- a/spring-core/src/test/java/com/baeldung/configuration/ApplicationContextTestResourceNameType.java
+++ b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/ApplicationContextTestResourceNameType.java
@@ -1,4 +1,4 @@
-package com.baeldung.configuration;
+package com.baeldung.wiring.configuration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
diff --git a/spring-core/src/test/java/com/baeldung/configuration/ApplicationContextTestResourceQualifier.java b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/ApplicationContextTestResourceQualifier.java
similarity index 92%
rename from spring-core/src/test/java/com/baeldung/configuration/ApplicationContextTestResourceQualifier.java
rename to spring-di-2/src/test/java/com/baeldung/wiring/configuration/ApplicationContextTestResourceQualifier.java
index c9aa2f4a7d..87864b183e 100644
--- a/spring-core/src/test/java/com/baeldung/configuration/ApplicationContextTestResourceQualifier.java
+++ b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/ApplicationContextTestResourceQualifier.java
@@ -1,4 +1,4 @@
-package com.baeldung.configuration;
+package com.baeldung.wiring.configuration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
diff --git a/spring-di/src/test/java/com/baeldung/autowired/FieldAutowiredIntegrationTest.java b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/autowired/FieldAutowiredIntegrationTest.java
similarity index 87%
rename from spring-di/src/test/java/com/baeldung/autowired/FieldAutowiredIntegrationTest.java
rename to spring-di-2/src/test/java/com/baeldung/wiring/configuration/autowired/FieldAutowiredIntegrationTest.java
index a78799f1d9..f3f065ed4d 100644
--- a/spring-di/src/test/java/com/baeldung/autowired/FieldAutowiredIntegrationTest.java
+++ b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/autowired/FieldAutowiredIntegrationTest.java
@@ -1,7 +1,8 @@
-package com.baeldung.autowired;
+package com.baeldung.wiring.configuration.autowired;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
-import com.baeldung.configuration.ApplicationContextTestAutowiredType;
-import com.baeldung.dependency.ArbitraryDependency;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
@@ -9,8 +10,8 @@ import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
+import com.baeldung.dependency.ArbitraryDependency;
+import com.baeldung.wiring.configuration.ApplicationContextTestAutowiredType;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(
diff --git a/spring-di/src/test/java/com/baeldung/autowired/FieldAutowiredNameIntegrationTest.java b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/autowired/FieldAutowiredNameIntegrationTest.java
similarity index 88%
rename from spring-di/src/test/java/com/baeldung/autowired/FieldAutowiredNameIntegrationTest.java
rename to spring-di-2/src/test/java/com/baeldung/wiring/configuration/autowired/FieldAutowiredNameIntegrationTest.java
index 8f09e73c33..199241c7e2 100644
--- a/spring-di/src/test/java/com/baeldung/autowired/FieldAutowiredNameIntegrationTest.java
+++ b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/autowired/FieldAutowiredNameIntegrationTest.java
@@ -1,7 +1,8 @@
-package com.baeldung.autowired;
+package com.baeldung.wiring.configuration.autowired;
-import com.baeldung.configuration.ApplicationContextTestAutowiredName;
import com.baeldung.dependency.ArbitraryDependency;
+import com.baeldung.wiring.configuration.ApplicationContextTestAutowiredName;
+
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/spring-di/src/test/java/com/baeldung/autowired/FieldQualifierAutowiredIntegrationTest.java b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/autowired/FieldQualifierAutowiredIntegrationTest.java
similarity index 91%
rename from spring-di/src/test/java/com/baeldung/autowired/FieldQualifierAutowiredIntegrationTest.java
rename to spring-di-2/src/test/java/com/baeldung/wiring/configuration/autowired/FieldQualifierAutowiredIntegrationTest.java
index 01317aef6f..081fbf24ad 100644
--- a/spring-di/src/test/java/com/baeldung/autowired/FieldQualifierAutowiredIntegrationTest.java
+++ b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/autowired/FieldQualifierAutowiredIntegrationTest.java
@@ -1,7 +1,8 @@
-package com.baeldung.autowired;
+package com.baeldung.wiring.configuration.autowired;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
-import com.baeldung.configuration.ApplicationContextTestAutowiredQualifier;
-import com.baeldung.dependency.ArbitraryDependency;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
@@ -10,8 +11,8 @@ import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
+import com.baeldung.dependency.ArbitraryDependency;
+import com.baeldung.wiring.configuration.ApplicationContextTestAutowiredQualifier;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(
diff --git a/spring-di/src/test/java/com/baeldung/inject/FieldByNameInjectIntegrationTest.java b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/inject/FieldByNameInjectIntegrationTest.java
similarity index 89%
rename from spring-di/src/test/java/com/baeldung/inject/FieldByNameInjectIntegrationTest.java
rename to spring-di-2/src/test/java/com/baeldung/wiring/configuration/inject/FieldByNameInjectIntegrationTest.java
index f5897febab..d1a75d73ea 100644
--- a/spring-di/src/test/java/com/baeldung/inject/FieldByNameInjectIntegrationTest.java
+++ b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/inject/FieldByNameInjectIntegrationTest.java
@@ -1,18 +1,19 @@
-package com.baeldung.inject;
+package com.baeldung.wiring.configuration.inject;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import javax.inject.Inject;
+import javax.inject.Named;
-import com.baeldung.configuration.ApplicationContextTestInjectName;
-import com.baeldung.dependency.ArbitraryDependency;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
-import javax.inject.Inject;
-import javax.inject.Named;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
+import com.baeldung.dependency.ArbitraryDependency;
+import com.baeldung.wiring.configuration.ApplicationContextTestInjectName;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(
diff --git a/spring-di/src/test/java/com/baeldung/inject/FieldInjectIntegrationTest.java b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/inject/FieldInjectIntegrationTest.java
similarity index 88%
rename from spring-di/src/test/java/com/baeldung/inject/FieldInjectIntegrationTest.java
rename to spring-di-2/src/test/java/com/baeldung/wiring/configuration/inject/FieldInjectIntegrationTest.java
index 45b7c8015c..995f560701 100644
--- a/spring-di/src/test/java/com/baeldung/inject/FieldInjectIntegrationTest.java
+++ b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/inject/FieldInjectIntegrationTest.java
@@ -1,17 +1,18 @@
-package com.baeldung.inject;
+package com.baeldung.wiring.configuration.inject;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import javax.inject.Inject;
-import com.baeldung.configuration.ApplicationContextTestInjectType;
-import com.baeldung.dependency.ArbitraryDependency;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
-import javax.inject.Inject;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
+import com.baeldung.dependency.ArbitraryDependency;
+import com.baeldung.wiring.configuration.ApplicationContextTestInjectType;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(
diff --git a/spring-di/src/test/java/com/baeldung/inject/FieldQualifierInjectIntegrationTest.java b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/inject/FieldQualifierInjectIntegrationTest.java
similarity index 91%
rename from spring-di/src/test/java/com/baeldung/inject/FieldQualifierInjectIntegrationTest.java
rename to spring-di-2/src/test/java/com/baeldung/wiring/configuration/inject/FieldQualifierInjectIntegrationTest.java
index 0fd6a0e4c1..67fa2bf3d4 100644
--- a/spring-di/src/test/java/com/baeldung/inject/FieldQualifierInjectIntegrationTest.java
+++ b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/inject/FieldQualifierInjectIntegrationTest.java
@@ -1,7 +1,10 @@
-package com.baeldung.inject;
+package com.baeldung.wiring.configuration.inject;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import javax.inject.Inject;
-import com.baeldung.configuration.ApplicationContextTestInjectQualifier;
-import com.baeldung.dependency.ArbitraryDependency;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Qualifier;
@@ -9,10 +12,8 @@ import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
-import javax.inject.Inject;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
+import com.baeldung.dependency.ArbitraryDependency;
+import com.baeldung.wiring.configuration.ApplicationContextTestInjectQualifier;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = AnnotationConfigContextLoader.class,
diff --git a/spring-core/src/test/java/com/baeldung/resource/FieldResourceInjectionIntegrationTest.java b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/FieldResourceInjectionIntegrationTest.java
similarity index 86%
rename from spring-core/src/test/java/com/baeldung/resource/FieldResourceInjectionIntegrationTest.java
rename to spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/FieldResourceInjectionIntegrationTest.java
index 63a25cb499..938d557939 100644
--- a/spring-core/src/test/java/com/baeldung/resource/FieldResourceInjectionIntegrationTest.java
+++ b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/FieldResourceInjectionIntegrationTest.java
@@ -1,17 +1,19 @@
-package com.baeldung.resource;
+package com.baeldung.wiring.configuration.resource;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.File;
+
+import javax.annotation.Resource;
-import com.baeldung.configuration.ApplicationContextTestResourceNameType;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
-import javax.annotation.Resource;
-import java.io.File;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
+import com.baeldung.wiring.configuration.ApplicationContextTestResourceNameType;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(
diff --git a/spring-core/src/test/java/com/baeldung/resource/MethodByQualifierResourceIntegrationTest.java b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/MethodByQualifierResourceIntegrationTest.java
similarity index 91%
rename from spring-core/src/test/java/com/baeldung/resource/MethodByQualifierResourceIntegrationTest.java
rename to spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/MethodByQualifierResourceIntegrationTest.java
index f5bb9f10cf..f49bf70aba 100644
--- a/spring-core/src/test/java/com/baeldung/resource/MethodByQualifierResourceIntegrationTest.java
+++ b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/MethodByQualifierResourceIntegrationTest.java
@@ -1,6 +1,5 @@
-package com.baeldung.resource;
+package com.baeldung.wiring.configuration.resource;
-import com.baeldung.configuration.ApplicationContextTestResourceQualifier;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Qualifier;
@@ -8,6 +7,8 @@ import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
+import com.baeldung.wiring.configuration.ApplicationContextTestResourceQualifier;
+
import javax.annotation.Resource;
import java.io.File;
diff --git a/spring-core/src/test/java/com/baeldung/resource/MethodByTypeResourceIntegrationTest.java b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/MethodByTypeResourceIntegrationTest.java
similarity index 87%
rename from spring-core/src/test/java/com/baeldung/resource/MethodByTypeResourceIntegrationTest.java
rename to spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/MethodByTypeResourceIntegrationTest.java
index 171cbfea47..aecd02a1d5 100644
--- a/spring-core/src/test/java/com/baeldung/resource/MethodByTypeResourceIntegrationTest.java
+++ b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/MethodByTypeResourceIntegrationTest.java
@@ -1,12 +1,13 @@
-package com.baeldung.resource;
+package com.baeldung.wiring.configuration.resource;
-import com.baeldung.configuration.ApplicationContextTestResourceNameType;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
+import com.baeldung.wiring.configuration.ApplicationContextTestResourceNameType;
+
import javax.annotation.Resource;
import java.io.File;
diff --git a/spring-core/src/test/java/com/baeldung/resource/MethodResourceInjectionIntegrationTest.java b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/MethodResourceInjectionIntegrationTest.java
similarity index 88%
rename from spring-core/src/test/java/com/baeldung/resource/MethodResourceInjectionIntegrationTest.java
rename to spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/MethodResourceInjectionIntegrationTest.java
index 2e1c3c39a9..4ef9368c28 100644
--- a/spring-core/src/test/java/com/baeldung/resource/MethodResourceInjectionIntegrationTest.java
+++ b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/MethodResourceInjectionIntegrationTest.java
@@ -1,12 +1,13 @@
-package com.baeldung.resource;
+package com.baeldung.wiring.configuration.resource;
-import com.baeldung.configuration.ApplicationContextTestResourceNameType;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
+import com.baeldung.wiring.configuration.ApplicationContextTestResourceNameType;
+
import javax.annotation.Resource;
import java.io.File;
diff --git a/spring-core/src/test/java/com/baeldung/resource/NamedResourceIntegrationTest.java b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/NamedResourceIntegrationTest.java
similarity index 86%
rename from spring-core/src/test/java/com/baeldung/resource/NamedResourceIntegrationTest.java
rename to spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/NamedResourceIntegrationTest.java
index d52660e9b8..4339194f63 100644
--- a/spring-core/src/test/java/com/baeldung/resource/NamedResourceIntegrationTest.java
+++ b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/NamedResourceIntegrationTest.java
@@ -1,12 +1,13 @@
-package com.baeldung.resource;
+package com.baeldung.wiring.configuration.resource;
-import com.baeldung.configuration.ApplicationContextTestResourceNameType;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
+import com.baeldung.wiring.configuration.ApplicationContextTestResourceNameType;
+
import javax.annotation.Resource;
import java.io.File;
diff --git a/spring-core/src/test/java/com/baeldung/resource/QualifierResourceInjectionIntegrationTest.java b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/QualifierResourceInjectionIntegrationTest.java
similarity index 90%
rename from spring-core/src/test/java/com/baeldung/resource/QualifierResourceInjectionIntegrationTest.java
rename to spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/QualifierResourceInjectionIntegrationTest.java
index 3f812350c9..cc8c669757 100644
--- a/spring-core/src/test/java/com/baeldung/resource/QualifierResourceInjectionIntegrationTest.java
+++ b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/QualifierResourceInjectionIntegrationTest.java
@@ -1,6 +1,5 @@
-package com.baeldung.resource;
+package com.baeldung.wiring.configuration.resource;
-import com.baeldung.configuration.ApplicationContextTestResourceQualifier;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Qualifier;
@@ -8,6 +7,8 @@ import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
+import com.baeldung.wiring.configuration.ApplicationContextTestResourceQualifier;
+
import javax.annotation.Resource;
import java.io.File;
diff --git a/spring-core/src/test/java/com/baeldung/resource/SetterResourceInjectionIntegrationTest.java b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/SetterResourceInjectionIntegrationTest.java
similarity index 88%
rename from spring-core/src/test/java/com/baeldung/resource/SetterResourceInjectionIntegrationTest.java
rename to spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/SetterResourceInjectionIntegrationTest.java
index ae13b2336a..90c8677bff 100644
--- a/spring-core/src/test/java/com/baeldung/resource/SetterResourceInjectionIntegrationTest.java
+++ b/spring-di-2/src/test/java/com/baeldung/wiring/configuration/resource/SetterResourceInjectionIntegrationTest.java
@@ -1,12 +1,13 @@
-package com.baeldung.resource;
+package com.baeldung.wiring.configuration.resource;
-import com.baeldung.configuration.ApplicationContextTestResourceNameType;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
+import com.baeldung.wiring.configuration.ApplicationContextTestResourceNameType;
+
import javax.annotation.Resource;
import java.io.File;
diff --git a/spring-di/README.md b/spring-di/README.md
index 7571b12916..d470768f16 100644
--- a/spring-di/README.md
+++ b/spring-di/README.md
@@ -13,3 +13,5 @@ This module contains articles about dependency injection with Spring
- [Controlling Bean Creation Order with @DependsOn Annotation](https://www.baeldung.com/spring-depends-on)
- [Unsatisfied Dependency in Spring](https://www.baeldung.com/spring-unsatisfied-dependency)
- [Circular Dependencies in Spring](https://www.baeldung.com/circular-dependencies-in-spring)
+- [XML-Based Injection in Spring](https://www.baeldung.com/spring-xml-injection)
+- More articles: [[next -->]](/spring-di-2)