diff --git a/spring-boot-modules/spring-boot-basic-customization-3/README.md b/spring-boot-modules/spring-boot-basic-customization-3/README.md
new file mode 100644
index 0000000000..2641427608
--- /dev/null
+++ b/spring-boot-modules/spring-boot-basic-customization-3/README.md
@@ -0,0 +1,5 @@
+## Spring Boot Basic Customization 3
+
+This module contains articles about Spring Boot customization 3
+
+### Relevant Articles:
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-basic-customization-3/pom.xml b/spring-boot-modules/spring-boot-basic-customization-3/pom.xml
new file mode 100644
index 0000000000..1b09162cf4
--- /dev/null
+++ b/spring-boot-modules/spring-boot-basic-customization-3/pom.xml
@@ -0,0 +1,53 @@
+
+
+ 4.0.0
+ spring-boot-basic-customization-3
+ spring-boot-basic-customization-3
+ jar
+ Module For Spring Boot Basic Customization 3
+
+
+ com.baeldung
+ parent-boot-3
+ 0.0.1-SNAPSHOT
+ ../../parent-boot-3
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+ springStartupApp
+ com.baeldung.springStart.SpringStartApplication
+
+
+
+
+ repackage
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/spring-boot-modules/spring-boot-basic-customization-3/src/main/java/com/baeldung/filter/AppConfig.java b/spring-boot-modules/spring-boot-basic-customization-3/src/main/java/com/baeldung/filter/AppConfig.java
new file mode 100644
index 0000000000..f90c7b2889
--- /dev/null
+++ b/spring-boot-modules/spring-boot-basic-customization-3/src/main/java/com/baeldung/filter/AppConfig.java
@@ -0,0 +1,30 @@
+package com.baeldung.filter;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.filter.DelegatingFilterProxy;
+
+@Configuration
+public class AppConfig {
+
+ @Bean
+ public FilterRegistrationBean loggingFilterDelegatingProxy() {
+ FilterRegistrationBean registrationBean = new FilterRegistrationBean<>();
+ registrationBean.setFilter(new DelegatingFilterProxy("loggingFilterDelegateProxy"));
+ registrationBean.addUrlPatterns("/*");
+ return registrationBean;
+ }
+
+ @Bean
+ @Autowired
+ public FilterRegistrationBean loggingFilterRegistration(LoggingService loggingService) {
+ FilterRegistrationBean registrationBean = new FilterRegistrationBean<>();
+ registrationBean.setFilter(new LoggingFilterRegistrationBean(loggingService));
+ registrationBean.addUrlPatterns("/*");
+ return registrationBean;
+ }
+
+
+}
diff --git a/spring-boot-modules/spring-boot-basic-customization-3/src/main/java/com/baeldung/filter/LoggingFilterAutowiringSupport.java b/spring-boot-modules/spring-boot-basic-customization-3/src/main/java/com/baeldung/filter/LoggingFilterAutowiringSupport.java
new file mode 100644
index 0000000000..6aaf521ee8
--- /dev/null
+++ b/spring-boot-modules/spring-boot-basic-customization-3/src/main/java/com/baeldung/filter/LoggingFilterAutowiringSupport.java
@@ -0,0 +1,35 @@
+package com.baeldung.filter;
+
+import java.io.IOException;
+
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.Filter;
+import jakarta.servlet.FilterConfig;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.support.SpringBeanAutowiringSupport;
+
+@Component
+public class LoggingFilterAutowiringSupport implements Filter {
+
+ @Autowired
+ LoggingService loggingService;
+
+ @Override
+ public void init(FilterConfig filterConfig) {
+ SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this,
+ filterConfig.getServletContext());
+ }
+
+ @Override
+ public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
+ HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
+ loggingService.log(httpServletRequest.getMethod(), httpServletRequest.getRequestURI());
+ filterChain.doFilter(servletRequest, servletResponse);
+ }
+}
diff --git a/spring-boot-modules/spring-boot-basic-customization-3/src/main/java/com/baeldung/filter/LoggingFilterDelegatingFilterProxy.java b/spring-boot-modules/spring-boot-basic-customization-3/src/main/java/com/baeldung/filter/LoggingFilterDelegatingFilterProxy.java
new file mode 100644
index 0000000000..84f0477379
--- /dev/null
+++ b/spring-boot-modules/spring-boot-basic-customization-3/src/main/java/com/baeldung/filter/LoggingFilterDelegatingFilterProxy.java
@@ -0,0 +1,27 @@
+package com.baeldung.filter;
+
+import java.io.IOException;
+
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.Filter;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component("loggingFilterDelegateProxy")
+public class LoggingFilterDelegatingFilterProxy implements Filter {
+
+ @Autowired
+ LoggingService loggingService;
+
+ @Override
+ public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
+ HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
+ loggingService.log(httpServletRequest.getMethod(), httpServletRequest.getRequestURI());
+ filterChain.doFilter(servletRequest, servletResponse);
+ }
+}
diff --git a/spring-boot-modules/spring-boot-basic-customization-3/src/main/java/com/baeldung/filter/LoggingFilterRegistrationBean.java b/spring-boot-modules/spring-boot-basic-customization-3/src/main/java/com/baeldung/filter/LoggingFilterRegistrationBean.java
new file mode 100644
index 0000000000..ec2c57c3a0
--- /dev/null
+++ b/spring-boot-modules/spring-boot-basic-customization-3/src/main/java/com/baeldung/filter/LoggingFilterRegistrationBean.java
@@ -0,0 +1,32 @@
+package com.baeldung.filter;
+
+import java.io.IOException;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.support.SpringBeanAutowiringSupport;
+
+import jakarta.servlet.Filter;
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.FilterConfig;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+
+@Component
+public class LoggingFilterRegistrationBean implements Filter {
+
+ private LoggingService loggingService;
+
+ public LoggingFilterRegistrationBean(LoggingService loggingService) {
+ this.loggingService = loggingService;
+ }
+
+ @Override
+ public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
+ HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
+ loggingService.log(httpServletRequest.getMethod(), httpServletRequest.getRequestURI());
+ filterChain.doFilter(servletRequest, servletResponse);
+ }
+}
diff --git a/spring-boot-modules/spring-boot-basic-customization-3/src/main/java/com/baeldung/filter/LoggingFilterWebApplicationContext.java b/spring-boot-modules/spring-boot-basic-customization-3/src/main/java/com/baeldung/filter/LoggingFilterWebApplicationContext.java
new file mode 100644
index 0000000000..85d83ebd9d
--- /dev/null
+++ b/spring-boot-modules/spring-boot-basic-customization-3/src/main/java/com/baeldung/filter/LoggingFilterWebApplicationContext.java
@@ -0,0 +1,34 @@
+package com.baeldung.filter;
+
+import java.io.IOException;
+
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.Filter;
+import jakarta.servlet.FilterConfig;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.support.WebApplicationContextUtils;
+
+@Component
+public class LoggingFilterWebApplicationContext implements Filter {
+
+ private LoggingService loggingService;
+
+ @Override
+ public void init(FilterConfig filterConfig) {
+ loggingService = WebApplicationContextUtils
+ .getRequiredWebApplicationContext(filterConfig.getServletContext())
+ .getBean(LoggingService.class);
+ }
+
+ @Override
+ public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
+ HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
+ loggingService.log(httpServletRequest.getMethod(), httpServletRequest.getRequestURI());
+ filterChain.doFilter(servletRequest, servletResponse);
+ }
+}
diff --git a/spring-boot-modules/spring-boot-basic-customization-3/src/main/java/com/baeldung/filter/LoggingService.java b/spring-boot-modules/spring-boot-basic-customization-3/src/main/java/com/baeldung/filter/LoggingService.java
new file mode 100644
index 0000000000..aaaa93a10b
--- /dev/null
+++ b/spring-boot-modules/spring-boot-basic-customization-3/src/main/java/com/baeldung/filter/LoggingService.java
@@ -0,0 +1,14 @@
+package com.baeldung.filter;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+@Service
+public class LoggingService {
+
+ private final Logger logger = LoggerFactory.getLogger(this.getClass());
+ public void log(String message,String url){
+ logger.info("Logging Request {} for URI : {}",message,url);
+ }
+}
diff --git a/spring-boot-modules/spring-boot-basic-customization-3/src/main/java/com/baeldung/filter/SpringBootFilterStartApp.java b/spring-boot-modules/spring-boot-basic-customization-3/src/main/java/com/baeldung/filter/SpringBootFilterStartApp.java
new file mode 100644
index 0000000000..d497bc55ab
--- /dev/null
+++ b/spring-boot-modules/spring-boot-basic-customization-3/src/main/java/com/baeldung/filter/SpringBootFilterStartApp.java
@@ -0,0 +1,12 @@
+package com.baeldung.filter;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SpringBootFilterStartApp {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SpringBootFilterStartApp.class, args);
+ }
+}
diff --git a/spring-boot-modules/spring-boot-basic-customization-3/src/main/java/com/baeldung/filter/User.java b/spring-boot-modules/spring-boot-basic-customization-3/src/main/java/com/baeldung/filter/User.java
new file mode 100644
index 0000000000..983228e8c6
--- /dev/null
+++ b/spring-boot-modules/spring-boot-basic-customization-3/src/main/java/com/baeldung/filter/User.java
@@ -0,0 +1,39 @@
+package com.baeldung.filter;
+
+public class User {
+
+ private String id;
+ private String name;
+ private String email;
+
+ public User(String id, String name, String email) {
+ this.id = id;
+ this.name = name;
+ this.email = email;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+}
diff --git a/spring-boot-modules/spring-boot-basic-customization-3/src/main/java/com/baeldung/filter/UserController.java b/spring-boot-modules/spring-boot-basic-customization-3/src/main/java/com/baeldung/filter/UserController.java
new file mode 100644
index 0000000000..a7e3daa749
--- /dev/null
+++ b/spring-boot-modules/spring-boot-basic-customization-3/src/main/java/com/baeldung/filter/UserController.java
@@ -0,0 +1,17 @@
+package com.baeldung.filter;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class UserController {
+
+ @GetMapping("/users")
+ public List getUsers(){
+ return Arrays.asList(new User("1","John","john@email.com"),
+ new User("2","Smith","smith@email.com"));
+ }
+}
diff --git a/spring-boot-modules/spring-boot-basic-customization-3/src/main/java/com/baeldung/springStart/SpringStartApplication.java b/spring-boot-modules/spring-boot-basic-customization-3/src/main/java/com/baeldung/springStart/SpringStartApplication.java
new file mode 100644
index 0000000000..6648fd8498
--- /dev/null
+++ b/spring-boot-modules/spring-boot-basic-customization-3/src/main/java/com/baeldung/springStart/SpringStartApplication.java
@@ -0,0 +1,12 @@
+package com.baeldung.springStart;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SpringStartApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SpringStartApplication.class, args);
+ }
+}
diff --git a/spring-boot-modules/spring-boot-basic-customization-3/src/main/resources/application.properties b/spring-boot-modules/spring-boot-basic-customization-3/src/main/resources/application.properties
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/spring-boot-modules/spring-boot-basic-customization-3/src/test/java/com/baeldung/filter/LoggingFilterAutowiringSupportUnitTest.java b/spring-boot-modules/spring-boot-basic-customization-3/src/test/java/com/baeldung/filter/LoggingFilterAutowiringSupportUnitTest.java
new file mode 100644
index 0000000000..785bd9c514
--- /dev/null
+++ b/spring-boot-modules/spring-boot-basic-customization-3/src/test/java/com/baeldung/filter/LoggingFilterAutowiringSupportUnitTest.java
@@ -0,0 +1,30 @@
+package com.baeldung.filter;
+
+import java.lang.reflect.Field;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class LoggingFilterAutowiringSupportUnitTest {
+
+ @Autowired
+ private LoggingFilterAutowiringSupport loggingFilter;
+
+ @Test
+ public void givenFilter_whenAutowired_thenDependencyInjected() throws Exception {
+ Assert.assertNotNull(loggingFilter);
+ Assert.assertNotNull(getField(loggingFilter,"loggingService"));
+ }
+
+ private Object getField(Object target, String fieldName) throws NoSuchFieldException, IllegalAccessException {
+ Field field = target.getClass().getDeclaredField(fieldName);
+ field.setAccessible(true);
+ return field.get(target);
+ }
+}
diff --git a/spring-boot-modules/spring-boot-basic-customization-3/src/test/java/com/baeldung/filter/LoggingFilterDelegatingFilterProxyUnitTest.java b/spring-boot-modules/spring-boot-basic-customization-3/src/test/java/com/baeldung/filter/LoggingFilterDelegatingFilterProxyUnitTest.java
new file mode 100644
index 0000000000..7d36a6fe10
--- /dev/null
+++ b/spring-boot-modules/spring-boot-basic-customization-3/src/test/java/com/baeldung/filter/LoggingFilterDelegatingFilterProxyUnitTest.java
@@ -0,0 +1,30 @@
+package com.baeldung.filter;
+
+import java.lang.reflect.Field;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class LoggingFilterDelegatingFilterProxyUnitTest {
+
+ @Autowired
+ private LoggingFilterDelegatingFilterProxy loggingFilter;
+
+ @Test
+ public void testLoggingFilter() throws Exception {
+ Assert.assertNotNull(loggingFilter);
+ Assert.assertNotNull(getField(loggingFilter,"loggingService"));
+ }
+
+ private Object getField(Object target, String fieldName) throws NoSuchFieldException, IllegalAccessException {
+ Field field = target.getClass().getDeclaredField(fieldName);
+ field.setAccessible(true);
+ return field.get(target);
+ }
+}
diff --git a/spring-boot-modules/spring-boot-basic-customization-3/src/test/java/com/baeldung/filter/LoggingFilterRegistrationBeanUnitTest.java b/spring-boot-modules/spring-boot-basic-customization-3/src/test/java/com/baeldung/filter/LoggingFilterRegistrationBeanUnitTest.java
new file mode 100644
index 0000000000..25f1714845
--- /dev/null
+++ b/spring-boot-modules/spring-boot-basic-customization-3/src/test/java/com/baeldung/filter/LoggingFilterRegistrationBeanUnitTest.java
@@ -0,0 +1,30 @@
+package com.baeldung.filter;
+
+import java.lang.reflect.Field;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest
+public class LoggingFilterRegistrationBeanUnitTest {
+
+ @Autowired
+ private LoggingFilterRegistrationBean loggingFilter;
+
+ @Test
+ public void testLoggingFilter() throws Exception {
+ Assert.assertNotNull(loggingFilter);
+ Assert.assertNotNull(getField(loggingFilter,"loggingService"));
+ }
+
+ private Object getField(Object target, String fieldName) throws NoSuchFieldException, IllegalAccessException {
+ Field field = target.getClass().getDeclaredField(fieldName);
+ field.setAccessible(true);
+ return field.get(target);
+ }
+}