You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by mm...@apache.org on 2022/01/03 12:07:10 UTC

[syncope] branch master updated: Remove CGLib proxies from Spring configuration components - part 1 (#301)

This is an automated email from the ASF dual-hosted git repository.

mmoayyed pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/syncope.git


The following commit(s) were added to refs/heads/master by this push:
     new 273ca7b  Remove CGLib proxies from Spring configuration components - part 1 (#301)
273ca7b is described below

commit 273ca7bf2608ba53e3c9594068a6416e0c31622b
Author: Misagh Moayyed <mm...@gmail.com>
AuthorDate: Mon Jan 3 16:07:02 2022 +0400

    Remove CGLib proxies from Spring configuration components - part 1 (#301)
---
 .github/workflows/codeql-analysis.yml              |   2 +-
 .github/workflows/crosschecks.yml                  |   2 +-
 .github/workflows/fit_Elasticsearch.yml            |   2 +-
 .github/workflows/fit_Payara.yml                   |   2 +-
 .github/workflows/fit_Tomcat_H2_JSON.yml           |   2 +-
 .github/workflows/fit_Tomcat_H2_XML.yml            |   2 +-
 .github/workflows/fit_Tomcat_H2_YAML.yml           |   2 +-
 .github/workflows/fit_WA_SAML2PS4UI_OIDCC4UI.yml   |   2 +-
 .github/workflows/fit_WA_SRA_CASClient.yml         |   4 +-
 .github/workflows/fit_WA_SRA_OAuth2.yml            |   2 +-
 .github/workflows/fit_WA_SRA_OIDC.yml              |   2 +-
 .github/workflows/fit_WA_SRA_SAML2.yml             |   2 +-
 .github/workflows/fit_Wildfly.yml                  |   2 +-
 .github/workflows/fit_Zookeeper.yml                |   2 +-
 .github/workflows/mariadb.yml                      |   2 +-
 .github/workflows/mysql.yml                        |   2 +-
 .github/workflows/postgresql.yml                   |   2 +-
 .../client/console/SyncopeAMConsoleContext.java    |   2 +-
 .../client/console/SyncopeIdMConsoleContext.java   |   2 +-
 .../syncope/client/console/SecurityConfig.java     |  44 +-
 .../client/console/SyncopeConsoleApplication.java  |  17 +-
 .../console/src/main/resources/console.properties  |   5 +
 .../syncope/client/console/AbstractTest.java       |   2 +-
 .../syncope/client/enduser/SecurityConfig.java     |  44 +-
 .../client/enduser/SyncopeEnduserApplication.java  |  16 +-
 .../actuate/SyncopeEnduserInfoContributor.java     |   8 +-
 .../enduser/src/main/resources/enduser.properties  |   5 +
 .../syncope/client/enduser/AbstractTest.java       |   2 +-
 .../client/zookeeper/ZookeeperConfParamOps.java    |   8 +-
 .../zookeeper/ZookeeperKeymasterClientContext.java |  12 +-
 .../client/zookeeper/ZookeeperTestContext.java     |   2 +-
 .../client/self/SelfKeymasterClientContext.java    |  24 +-
 .../apache/syncope/core/logic/AMLogicContext.java  |  74 ++--
 .../syncope/core/rest/cxf/AMRESTCXFContext.java    |  17 +-
 .../apache/syncope/core/logic/IdMLogicContext.java |  73 ++--
 .../syncope/core/logic/IdMLogicTestContext.java    |   5 +-
 .../syncope/core/rest/cxf/IdMRESTCXFContext.java   |   7 +-
 .../syncope/core/logic/IdRepoLogicContext.java     | 244 +++++------
 .../core/rest/cxf/IdRepoRESTCXFContext.java        | 103 ++---
 .../rest/cxf/service/IdRepoRESTCXFTestContext.java |   7 +-
 .../persistence/jpa/JPAJSONPersistenceContext.java |   5 +-
 .../jpa/MyJPAJSONPersistenceContext.java           |   4 -
 .../jpa/PGJPAJSONPersistenceContext.java           |   4 -
 .../syncope/core/persistence/jpa/MasterDomain.java |  44 +-
 .../core/persistence/jpa/PersistenceContext.java   |  61 +--
 .../persistence/jpa/PersistenceTestContext.java    |   5 +-
 .../provisioning/java/ProvisioningContext.java     | 202 +++++----
 .../provisioning/java/ProvisioningTestContext.java |   5 +-
 .../syncope/core/starter/SelfKeymasterContext.java |  24 +-
 .../core/spring/security/AuthContextUtils.java     |   3 +-
 .../core/spring/security/SecurityContext.java      |  55 +--
 .../core/spring/security/WebSecurityContext.java   | 104 ++---
 .../core/spring/SpringTestConfiguration.java       |   2 +-
 .../syncope/core/starter/SwaggerUIInitializer.java |   2 +-
 .../core/starter/SyncopeCoreApplication.java       | 161 +++++++-
 ...java => DefaultSyncopeCoreInfoContributor.java} | 240 ++++++-----
 .../actuate/SyncopeCoreInfoContributor.java        | 451 +--------------------
 core/starter/src/main/resources/core.properties    |   6 +
 .../core/workflow/java/WorkflowContext.java        |   6 +-
 .../syncope/core/logic/CamelLogicContext.java      |  19 +-
 .../persistence/jpa/CamelPersistenceContext.java   |   2 +-
 .../camel/CamelProvisioningContext.java            |   8 +-
 .../camel/component/PropagateComponent.java        |   8 +-
 .../syncope/core/rest/cxf/CamelRESTCXFContext.java |   4 +-
 .../client/ElasticsearchClientContext.java         |   5 +-
 .../jpa/ElasticsearchPersistenceContext.java       |   5 +-
 .../core/flowable/FlowableWorkflowContext.java     |  53 +--
 .../syncope/core/logic/FlowableLogicContext.java   |  44 +-
 .../core/rest/cxf/FlowableRESTCXFContext.java      |   6 +-
 .../syncope/core/logic/OIDCC4UILogicContext.java   |  14 +-
 .../syncope/core/logic/OIDCC4UIProviderLogic.java  |   2 +-
 .../jpa/OIDCC4UIPersistenceContext.java            |   2 +-
 .../java/data/OIDCC4UIProvisioningContext.java     |   4 +-
 .../core/rest/cxf/OIDCC4UIRESTCXFContext.java      |   5 +-
 .../syncope/core/logic/SAML2SP4UILogicContext.java |  19 +-
 .../jpa/SAML2SP4UIPersistenceContext.java          |   2 +-
 .../java/SAML2SP4UIProvisioningContext.java        |   4 +-
 .../core/rest/cxf/SAML2SP4UIRESTCXFContext.java    |   5 +-
 .../syncope/core/logic/SCIMLogicContext.java       |   6 +-
 .../syncope/core/rest/cxf/SCIMRESTCXFContext.java  |   4 +-
 .../ext/scimv2/cxf/SCIMv2RESTCXFContext.java       |  23 +-
 .../buildtools/SyncopeBuildToolsApplication.java   |  18 +-
 .../reference/flowable/AssignDirectorGroup.java    |  14 +-
 .../reference/flowable/CreateARelationship.java    |  14 +-
 .../reference/flowable/FlowableConfiguration.java  |  31 +-
 .../reference/flowable/PrintersValueProvider.java  |  10 +-
 .../fit/core/reference/CoreReferenceContext.java   |   6 +-
 fit/core-reference/src/main/resources/log4j2.xml   |   1 -
 .../syncope/fit/console/AbstractConsoleITCase.java |   2 +-
 .../org/apache/syncope/fit/core/CoreITContext.java |   2 +-
 .../syncope/fit/enduser/AbstractEnduserITCase.java |   2 +-
 fit/wa-reference/src/main/resources/log4j2.xml     |   2 +-
 fit/wa-reference/src/test/resources/log4j2.xml     |   6 +-
 .../org/apache/syncope/sra/SecurityConfig.java     | 116 ++++--
 .../java/org/apache/syncope/sra/SessionConfig.java |   2 +-
 .../apache/syncope/sra/SyncopeSRAApplication.java  |  51 ++-
 .../syncope/sra/SyncopeSRAWebExceptionHandler.java |  14 +-
 .../syncope/sra/security/CsrfRouteMatcher.java     |  10 +-
 .../syncope/sra/security/LogoutRouteMatcher.java   |   2 -
 .../syncope/sra/security/PublicRouteMatcher.java   |   2 -
 ...cClientInitiatedServerLogoutSuccessHandler.java |   6 +-
 sra/src/main/resources/sra.properties              |   5 +
 .../bootstrap/SyncopeWABootstrapConfiguration.java |   2 -
 .../syncope/wa/starter/SyncopeWAApplication.java   |  20 +-
 .../starter/actuate/SyncopeWAInfoContributor.java  |   8 +-
 .../wa/starter/config/SyncopeWAConfiguration.java  |  29 +-
 .../starter/config/SyncopeWARefreshContextJob.java |   2 +-
 .../metadata/RestfulSamlIdPMetadataGenerator.java  |   6 +-
 wa/starter/src/main/resources/wa.properties        |   5 +
 109 files changed, 1129 insertions(+), 1646 deletions(-)

diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index cb00413..4c05279 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -18,7 +18,7 @@ name: "CodeQL"
 
 on:
   push:
-    branches: [master,2_1_X]
+    branches: [master,2_1_X,pr-*]
   pull_request:
     # The branches below must be a subset of the branches above
     branches: [master,2_1_X]
diff --git a/.github/workflows/crosschecks.yml b/.github/workflows/crosschecks.yml
index a7cddba..7e79fca 100644
--- a/.github/workflows/crosschecks.yml
+++ b/.github/workflows/crosschecks.yml
@@ -18,7 +18,7 @@ name: "Cross Checks"
 
 on:
   push:
-    branches: [master]
+    branches: ['master', 'pr-*']
   pull_request:
     # The branches below must be a subset of the branches above
     branches: [master]
diff --git a/.github/workflows/fit_Elasticsearch.yml b/.github/workflows/fit_Elasticsearch.yml
index 9f889b8..689c2b5 100644
--- a/.github/workflows/fit_Elasticsearch.yml
+++ b/.github/workflows/fit_Elasticsearch.yml
@@ -18,7 +18,7 @@ name: "FIT Elasticsearch"
 
 on:
   push:
-    branches: [master]
+    branches: ['master', 'pr-*']
   pull_request:
     # The branches below must be a subset of the branches above
     branches: [master]
diff --git a/.github/workflows/fit_Payara.yml b/.github/workflows/fit_Payara.yml
index ef04e09..5f65c0c 100644
--- a/.github/workflows/fit_Payara.yml
+++ b/.github/workflows/fit_Payara.yml
@@ -18,7 +18,7 @@ name: "FIT Payara"
 
 on:
   push:
-    branches: [master]
+    branches: ['master', 'pr-*']
   pull_request:
     # The branches below must be a subset of the branches above
     branches: [master]
diff --git a/.github/workflows/fit_Tomcat_H2_JSON.yml b/.github/workflows/fit_Tomcat_H2_JSON.yml
index 02b1b31..0dbb9ca 100644
--- a/.github/workflows/fit_Tomcat_H2_JSON.yml
+++ b/.github/workflows/fit_Tomcat_H2_JSON.yml
@@ -18,7 +18,7 @@ name: "FIT Tomcat H2 JSON"
 
 on:
   push:
-    branches: [master]
+    branches: ['master', 'pr-*']
   pull_request:
     # The branches below must be a subset of the branches above
     branches: [master]
diff --git a/.github/workflows/fit_Tomcat_H2_XML.yml b/.github/workflows/fit_Tomcat_H2_XML.yml
index d069168..ca727db 100644
--- a/.github/workflows/fit_Tomcat_H2_XML.yml
+++ b/.github/workflows/fit_Tomcat_H2_XML.yml
@@ -18,7 +18,7 @@ name: "FIT Tomcat H2 XML"
 
 on:
   push:
-    branches: [master]
+    branches: ['master', 'pr-*']
   pull_request:
     # The branches below must be a subset of the branches above
     branches: [master]
diff --git a/.github/workflows/fit_Tomcat_H2_YAML.yml b/.github/workflows/fit_Tomcat_H2_YAML.yml
index 422e2f0..c0622fd 100644
--- a/.github/workflows/fit_Tomcat_H2_YAML.yml
+++ b/.github/workflows/fit_Tomcat_H2_YAML.yml
@@ -18,7 +18,7 @@ name: "FIT Tomcat H2 YAML"
 
 on:
   push:
-    branches: [master]
+    branches: ['master', 'pr-*']
   pull_request:
     # The branches below must be a subset of the branches above
     branches: [master]
diff --git a/.github/workflows/fit_WA_SAML2PS4UI_OIDCC4UI.yml b/.github/workflows/fit_WA_SAML2PS4UI_OIDCC4UI.yml
index 3795aef..a1519ce 100644
--- a/.github/workflows/fit_WA_SAML2PS4UI_OIDCC4UI.yml
+++ b/.github/workflows/fit_WA_SAML2PS4UI_OIDCC4UI.yml
@@ -18,7 +18,7 @@ name: "FIT WA SAML2SP4UI OIDCC4UI"
 
 on:
   push:
-    branches: [master]
+    branches: ['master', 'pr-*']
   pull_request:
     # The branches below must be a subset of the branches above
     branches: [master]
diff --git a/.github/workflows/fit_WA_SRA_CASClient.yml b/.github/workflows/fit_WA_SRA_CASClient.yml
index 5966e7c..a229757 100644
--- a/.github/workflows/fit_WA_SRA_CASClient.yml
+++ b/.github/workflows/fit_WA_SRA_CASClient.yml
@@ -18,7 +18,7 @@ name: "FIT WA SRA CASClient"
 
 on:
   push:
-    branches: [master]
+    branches: ['master', 'pr-*']
   pull_request:
     # The branches below must be a subset of the branches above
     branches: [master]
@@ -43,5 +43,7 @@ jobs:
         restore-keys: ${{ runner.os }}-m2
     - name: Build
       run: mvn -U -T 1C -P 'skipTests,all'
+#    - name: Setup tmate session
+#      uses: mxschmitt/action-tmate@v3
     - name: 'WA / SRA / CAS Client'
       run: mvn -f fit/wa-reference/pom.xml verify -Dinvoker.streamLogs=true -Dmodernizer.skip=true -Drat.skip=true -Dcheckstyle.skip=true -Djacoco.skip=true -Dit.test=org.apache.syncope.fit.sra.CASSRAITCase
diff --git a/.github/workflows/fit_WA_SRA_OAuth2.yml b/.github/workflows/fit_WA_SRA_OAuth2.yml
index ad9f317..a08434c 100644
--- a/.github/workflows/fit_WA_SRA_OAuth2.yml
+++ b/.github/workflows/fit_WA_SRA_OAuth2.yml
@@ -18,7 +18,7 @@ name: "FIT WA SRA OAuth2"
 
 on:
   push:
-    branches: [master]
+    branches: ['master', 'pr-*']
   pull_request:
     # The branches below must be a subset of the branches above
     branches: [master]
diff --git a/.github/workflows/fit_WA_SRA_OIDC.yml b/.github/workflows/fit_WA_SRA_OIDC.yml
index 540cec3..a306d11 100644
--- a/.github/workflows/fit_WA_SRA_OIDC.yml
+++ b/.github/workflows/fit_WA_SRA_OIDC.yml
@@ -18,7 +18,7 @@ name: "FIT WA SRA OIDC"
 
 on:
   push:
-    branches: [master]
+    branches: ['master', 'pr-*']
   pull_request:
     # The branches below must be a subset of the branches above
     branches: [master]
diff --git a/.github/workflows/fit_WA_SRA_SAML2.yml b/.github/workflows/fit_WA_SRA_SAML2.yml
index 1086845..503c5a3 100644
--- a/.github/workflows/fit_WA_SRA_SAML2.yml
+++ b/.github/workflows/fit_WA_SRA_SAML2.yml
@@ -18,7 +18,7 @@ name: "FIT WA SRA SAML2"
 
 on:
   push:
-    branches: [master]
+    branches: ['master', 'pr-*']
   pull_request:
     # The branches below must be a subset of the branches above
     branches: [master]
diff --git a/.github/workflows/fit_Wildfly.yml b/.github/workflows/fit_Wildfly.yml
index 8177f53..7aec478 100644
--- a/.github/workflows/fit_Wildfly.yml
+++ b/.github/workflows/fit_Wildfly.yml
@@ -18,7 +18,7 @@ name: "FIT Wildfly"
 
 on:
   push:
-    branches: [master]
+    branches: ['master', 'pr-*']
   pull_request:
     # The branches below must be a subset of the branches above
     branches: [master]
diff --git a/.github/workflows/fit_Zookeeper.yml b/.github/workflows/fit_Zookeeper.yml
index e7bf993..877aa92 100644
--- a/.github/workflows/fit_Zookeeper.yml
+++ b/.github/workflows/fit_Zookeeper.yml
@@ -18,7 +18,7 @@ name: "FIT Zookeeper"
 
 on:
   push:
-    branches: [master]
+    branches: ['master', 'pr-*']
   pull_request:
     # The branches below must be a subset of the branches above
     branches: [master]
diff --git a/.github/workflows/mariadb.yml b/.github/workflows/mariadb.yml
index 5d4e1c2..6e64c87 100644
--- a/.github/workflows/mariadb.yml
+++ b/.github/workflows/mariadb.yml
@@ -18,7 +18,7 @@ name: "MariaDB"
 
 on:
   push:
-    branches: [master]
+    branches: ['master', 'pr-*']
   pull_request:
     # The branches below must be a subset of the branches above
     branches: [master]
diff --git a/.github/workflows/mysql.yml b/.github/workflows/mysql.yml
index 38d21e1..2d39bde 100644
--- a/.github/workflows/mysql.yml
+++ b/.github/workflows/mysql.yml
@@ -18,7 +18,7 @@ name: "MySQL"
 
 on:
   push:
-    branches: [master]
+    branches: ['master', 'pr-*']
   pull_request:
     # The branches below must be a subset of the branches above
     branches: [master]
diff --git a/.github/workflows/postgresql.yml b/.github/workflows/postgresql.yml
index 6c87300..3d7aef3 100644
--- a/.github/workflows/postgresql.yml
+++ b/.github/workflows/postgresql.yml
@@ -18,7 +18,7 @@ name: "PostgreSQL"
 
 on:
   push:
-    branches: [master]
+    branches: ['master', 'pr-*']
   pull_request:
     # The branches below must be a subset of the branches above
     branches: [master]
diff --git a/client/am/console/src/main/java/org/apache/syncope/client/console/SyncopeAMConsoleContext.java b/client/am/console/src/main/java/org/apache/syncope/client/console/SyncopeAMConsoleContext.java
index e3ff01a..b5b3552 100644
--- a/client/am/console/src/main/java/org/apache/syncope/client/console/SyncopeAMConsoleContext.java
+++ b/client/am/console/src/main/java/org/apache/syncope/client/console/SyncopeAMConsoleContext.java
@@ -27,7 +27,7 @@ import org.apache.syncope.client.console.init.ClassPathScanImplementationContrib
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class SyncopeAMConsoleContext {
 
     @Bean
diff --git a/client/idm/console/src/main/java/org/apache/syncope/client/console/SyncopeIdMConsoleContext.java b/client/idm/console/src/main/java/org/apache/syncope/client/console/SyncopeIdMConsoleContext.java
index 15b3e07..bafd990 100644
--- a/client/idm/console/src/main/java/org/apache/syncope/client/console/SyncopeIdMConsoleContext.java
+++ b/client/idm/console/src/main/java/org/apache/syncope/client/console/SyncopeIdMConsoleContext.java
@@ -39,7 +39,7 @@ import org.apache.syncope.client.console.commons.AnyDirectoryPanelAdditionalActi
 import org.apache.syncope.client.console.init.ClassPathScanImplementationContributor;
 import org.apache.syncope.client.console.init.IdMClassPathScanImplementationContributor;
 
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class SyncopeIdMConsoleContext {
 
     @Bean
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SecurityConfig.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SecurityConfig.java
index a77f5cc..86a5e39 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SecurityConfig.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SecurityConfig.java
@@ -19,8 +19,8 @@
 package org.apache.syncope.client.console;
 
 import org.apache.syncope.common.lib.types.IdRepoEntitlement;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.actuate.autoconfigure.security.servlet.EndpointRequest;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
@@ -28,27 +28,29 @@ import org.springframework.security.config.annotation.web.configuration.EnableWe
 import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
 
 @EnableWebSecurity
-@Configuration
-public class SecurityConfig extends WebSecurityConfigurerAdapter {
+@Configuration(proxyBeanMethods = false)
+public class SecurityConfig {
 
-    @Autowired
-    private ConsoleProperties props;
+    @Bean
+    public WebSecurityConfigurerAdapter consoleSecurityConfigAdapter(final ConsoleProperties props) {
+        return new WebSecurityConfigurerAdapter() {
+            @Override
+            protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
+                auth.inMemoryAuthentication().
+                    withUser(props.getAnonymousUser()).
+                    password("{noop}" + props.getAnonymousKey()).
+                    roles(IdRepoEntitlement.ANONYMOUS);
+            }
 
-    @Override
-    protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
-        auth.inMemoryAuthentication().
-                withUser(props.getAnonymousUser()).
-                password("{noop}" + props.getAnonymousKey()).
-                roles(IdRepoEntitlement.ANONYMOUS);
-    }
-
-    @Override
-    protected void configure(final HttpSecurity http) throws Exception {
-        http.csrf().disable().
-                authorizeRequests().
-                requestMatchers(EndpointRequest.toAnyEndpoint()).
-                authenticated().
-                and().
-                httpBasic();
+            @Override
+            protected void configure(final HttpSecurity http) throws Exception {
+                http.csrf().disable().
+                    authorizeRequests().
+                    requestMatchers(EndpointRequest.toAnyEndpoint()).
+                    authenticated().
+                    and().
+                    httpBasic();
+            }
+        };
     }
 }
diff --git a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleApplication.java b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleApplication.java
index 4348523..9ee4764 100644
--- a/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleApplication.java
+++ b/client/idrepo/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleApplication.java
@@ -50,7 +50,6 @@ import org.apache.syncope.common.keymaster.client.api.ServiceOps;
 import org.apache.syncope.common.keymaster.client.api.model.NetworkService;
 import org.apache.syncope.common.keymaster.client.api.startstop.KeymasterStart;
 import org.apache.syncope.common.keymaster.client.api.startstop.KeymasterStop;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration;
@@ -63,7 +62,7 @@ import org.springframework.context.annotation.Bean;
 
 @SpringBootApplication(exclude = {
     ErrorMvcAutoConfiguration.class,
-    HttpMessageConvertersAutoConfiguration.class })
+    HttpMessageConvertersAutoConfiguration.class }, proxyBeanMethods = false)
 @EnableConfigurationProperties(ConsoleProperties.class)
 public class SyncopeConsoleApplication extends SpringBootServletInitializer {
 
@@ -73,15 +72,6 @@ public class SyncopeConsoleApplication extends SpringBootServletInitializer {
                 build().run(args);
     }
 
-    @Autowired
-    private ServiceOps serviceOps;
-
-    @Autowired
-    private ConsoleProperties props;
-
-    @Autowired
-    private ApplicationContext ctx;
-
     @Override
     protected SpringApplicationBuilder configure(final SpringApplicationBuilder builder) {
         return builder.properties(Map.of(
@@ -97,7 +87,8 @@ public class SyncopeConsoleApplication extends SpringBootServletInitializer {
 
     @ConditionalOnMissingBean
     @Bean
-    public SyncopeCoreHealthIndicator syncopeCoreHealthIndicator() {
+    public SyncopeCoreHealthIndicator syncopeCoreHealthIndicator(final ServiceOps serviceOps,
+                                                                 final ConsoleProperties props) {
         return new SyncopeCoreHealthIndicator(
                 serviceOps,
                 props.getAnonymousUser(),
@@ -113,7 +104,7 @@ public class SyncopeConsoleApplication extends SpringBootServletInitializer {
 
     @ConditionalOnMissingBean(name = "classPathScanImplementationLookup")
     @Bean
-    public ClassPathScanImplementationLookup classPathScanImplementationLookup() {
+    public ClassPathScanImplementationLookup classPathScanImplementationLookup(final ApplicationContext ctx) {
         ClassPathScanImplementationLookup lookup = new ClassPathScanImplementationLookup(
                 ctx.getBeansOfType(ClassPathScanImplementationContributor.class).values());
         lookup.load();
diff --git a/client/idrepo/console/src/main/resources/console.properties b/client/idrepo/console/src/main/resources/console.properties
index 723e8e3..41407e7 100644
--- a/client/idrepo/console/src/main/resources/console.properties
+++ b/client/idrepo/console/src/main/resources/console.properties
@@ -71,3 +71,8 @@ console.security-headers.Strict-Transport-Security=max-age=31536000; includeSubD
 console.security-headers.X-Content-Type-Options=nosniff
 console.security-headers.X-Frame-Options=sameorigin
 #console.security-headers.Content-Security-Policy=default-src https:
+
+##
+# Disable CGLib Proxies
+spring.aop.auto=true
+spring.aop.proxy-target-class=false
diff --git a/client/idrepo/console/src/test/java/org/apache/syncope/client/console/AbstractTest.java b/client/idrepo/console/src/test/java/org/apache/syncope/client/console/AbstractTest.java
index a3d45e2..f33eb5f 100644
--- a/client/idrepo/console/src/test/java/org/apache/syncope/client/console/AbstractTest.java
+++ b/client/idrepo/console/src/test/java/org/apache/syncope/client/console/AbstractTest.java
@@ -85,7 +85,7 @@ import org.springframework.context.annotation.Configuration;
 public abstract class AbstractTest {
 
     @ImportAutoConfiguration
-    @Configuration
+    @Configuration(proxyBeanMethods = false)
     public static class SyncopeConsoleWebApplicationTestConfig {
 
         @Bean
diff --git a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/SecurityConfig.java b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/SecurityConfig.java
index a9537a6..38e6e6a 100644
--- a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/SecurityConfig.java
+++ b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/SecurityConfig.java
@@ -19,8 +19,8 @@
 package org.apache.syncope.client.enduser;
 
 import org.apache.syncope.common.lib.types.IdRepoEntitlement;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.actuate.autoconfigure.security.servlet.EndpointRequest;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
@@ -28,27 +28,29 @@ import org.springframework.security.config.annotation.web.configuration.EnableWe
 import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
 
 @EnableWebSecurity
-@Configuration
-public class SecurityConfig extends WebSecurityConfigurerAdapter {
+@Configuration(proxyBeanMethods = false)
+public class SecurityConfig {
 
-    @Autowired
-    private EnduserProperties props;
+    @Bean
+    public WebSecurityConfigurerAdapter enduserSecurityAdapter(final EnduserProperties props) {
+        return new WebSecurityConfigurerAdapter() {
+            @Override
+            protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
+                auth.inMemoryAuthentication().
+                    withUser(props.getAnonymousUser()).
+                    password("{noop}" + props.getAnonymousKey()).
+                    roles(IdRepoEntitlement.ANONYMOUS);
+            }
 
-    @Override
-    protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
-        auth.inMemoryAuthentication().
-                withUser(props.getAnonymousUser()).
-                password("{noop}" + props.getAnonymousKey()).
-                roles(IdRepoEntitlement.ANONYMOUS);
-    }
-
-    @Override
-    protected void configure(final HttpSecurity http) throws Exception {
-        http.csrf().disable().
-                authorizeRequests().
-                requestMatchers(EndpointRequest.toAnyEndpoint()).
-                authenticated().
-                and().
-                httpBasic();
+            @Override
+            protected void configure(final HttpSecurity http) throws Exception {
+                http.csrf().disable().
+                    authorizeRequests().
+                    requestMatchers(EndpointRequest.toAnyEndpoint()).
+                    authenticated().
+                    and().
+                    httpBasic();
+            }
+        };
     }
 }
diff --git a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/SyncopeEnduserApplication.java b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/SyncopeEnduserApplication.java
index 2dfe2a6..d51fa88 100644
--- a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/SyncopeEnduserApplication.java
+++ b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/SyncopeEnduserApplication.java
@@ -30,7 +30,6 @@ import org.apache.syncope.common.keymaster.client.api.ServiceOps;
 import org.apache.syncope.common.keymaster.client.api.model.NetworkService;
 import org.apache.syncope.common.keymaster.client.api.startstop.KeymasterStart;
 import org.apache.syncope.common.keymaster.client.api.startstop.KeymasterStop;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration;
@@ -42,7 +41,7 @@ import org.springframework.context.annotation.Bean;
 
 @SpringBootApplication(exclude = {
     ErrorMvcAutoConfiguration.class,
-    HttpMessageConvertersAutoConfiguration.class })
+    HttpMessageConvertersAutoConfiguration.class }, proxyBeanMethods = false)
 @EnableConfigurationProperties(EnduserProperties.class)
 public class SyncopeEnduserApplication extends SpringBootServletInitializer {
 
@@ -52,12 +51,6 @@ public class SyncopeEnduserApplication extends SpringBootServletInitializer {
                 build().run(args);
     }
 
-    @Autowired
-    private ServiceOps serviceOps;
-
-    @Autowired
-    private EnduserProperties props;
-
     @Override
     protected SpringApplicationBuilder configure(final SpringApplicationBuilder builder) {
         return builder.properties(Map.of(
@@ -73,7 +66,8 @@ public class SyncopeEnduserApplication extends SpringBootServletInitializer {
 
     @ConditionalOnMissingBean
     @Bean
-    public SyncopeCoreHealthIndicator syncopeCoreHealthIndicator() {
+    public SyncopeCoreHealthIndicator syncopeCoreHealthIndicator(final ServiceOps serviceOps,
+                                                                 final EnduserProperties props) {
         return new SyncopeCoreHealthIndicator(
                 serviceOps,
                 props.getAnonymousUser(),
@@ -83,8 +77,8 @@ public class SyncopeEnduserApplication extends SpringBootServletInitializer {
 
     @ConditionalOnMissingBean
     @Bean
-    public SyncopeEnduserInfoContributor syncopeEnduserInfoContributor() {
-        return new SyncopeEnduserInfoContributor();
+    public SyncopeEnduserInfoContributor syncopeEnduserInfoContributor(final EnduserProperties enduserProperties) {
+        return new SyncopeEnduserInfoContributor(enduserProperties);
     }
 
     @ConditionalOnMissingBean(name = "classPathScanImplementationLookup")
diff --git a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/actuate/SyncopeEnduserInfoContributor.java b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/actuate/SyncopeEnduserInfoContributor.java
index 6d4db1b..8bbc6af 100644
--- a/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/actuate/SyncopeEnduserInfoContributor.java
+++ b/client/idrepo/enduser/src/main/java/org/apache/syncope/client/enduser/actuate/SyncopeEnduserInfoContributor.java
@@ -19,15 +19,17 @@
 package org.apache.syncope.client.enduser.actuate;
 
 import org.apache.syncope.client.enduser.EnduserProperties;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.actuate.info.Info;
 import org.springframework.boot.actuate.info.InfoContributor;
 import org.springframework.security.access.prepost.PreAuthorize;
 
 public class SyncopeEnduserInfoContributor implements InfoContributor {
 
-    @Autowired
-    protected EnduserProperties enduserProperties;
+    protected final EnduserProperties enduserProperties;
+
+    public SyncopeEnduserInfoContributor(final EnduserProperties enduserProperties) {
+        this.enduserProperties = enduserProperties;
+    }
 
     @PreAuthorize("isAuthenticated()")
     @Override
diff --git a/client/idrepo/enduser/src/main/resources/enduser.properties b/client/idrepo/enduser/src/main/resources/enduser.properties
index a9f6930..c9d8cc6 100644
--- a/client/idrepo/enduser/src/main/resources/enduser.properties
+++ b/client/idrepo/enduser/src/main/resources/enduser.properties
@@ -61,3 +61,8 @@ enduser.security.headers.Strict-Transport-Security=max-age=31536000; includeSubD
 enduser.security.headers.X-Content-Type-Options=nosniff
 enduser.security.headers.X-Frame-Options=sameorigin
 #enduser.security.headers.Content-Security-Policy=default-src https:
+
+##
+# Disable CGLib Proxies
+spring.aop.auto=true
+spring.aop.proxy-target-class=false
diff --git a/client/idrepo/enduser/src/test/java/org/apache/syncope/client/enduser/AbstractTest.java b/client/idrepo/enduser/src/test/java/org/apache/syncope/client/enduser/AbstractTest.java
index 9ae41d8..0ce331f 100644
--- a/client/idrepo/enduser/src/test/java/org/apache/syncope/client/enduser/AbstractTest.java
+++ b/client/idrepo/enduser/src/test/java/org/apache/syncope/client/enduser/AbstractTest.java
@@ -64,7 +64,7 @@ import org.springframework.context.annotation.Configuration;
 public abstract class AbstractTest {
 
     @ImportAutoConfiguration
-    @Configuration
+    @Configuration(proxyBeanMethods = false)
     public static class SyncopeEnduserWebApplicationTestConfig {
 
         @Bean
diff --git a/common/keymaster/client-zookeeper/src/main/java/org/apache/syncope/common/keymaster/client/zookeeper/ZookeeperConfParamOps.java b/common/keymaster/client-zookeeper/src/main/java/org/apache/syncope/common/keymaster/client/zookeeper/ZookeeperConfParamOps.java
index 7e4c985..a331d40 100644
--- a/common/keymaster/client-zookeeper/src/main/java/org/apache/syncope/common/keymaster/client/zookeeper/ZookeeperConfParamOps.java
+++ b/common/keymaster/client-zookeeper/src/main/java/org/apache/syncope/common/keymaster/client/zookeeper/ZookeeperConfParamOps.java
@@ -28,7 +28,6 @@ import org.apache.syncope.common.keymaster.client.api.KeymasterException;
 import org.apache.zookeeper.KeeperException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * Implements {@link ConfParamOps} via Apache Curator / Zookeeper.
@@ -41,13 +40,16 @@ public class ZookeeperConfParamOps implements ConfParamOps {
 
     private static final String CONF_PATH = "/conf";
 
-    @Autowired
-    private CuratorFramework client;
+    private final CuratorFramework client;
 
     private static String buildConfPath(final String... parts) {
         return CONF_PATH + '/' + String.join("/", parts);
     }
 
+    public ZookeeperConfParamOps(final CuratorFramework client) {
+        this.client = client;
+    }
+
     @Override
     public Map<String, Object> list(final String domain) {
         try {
diff --git a/common/keymaster/client-zookeeper/src/main/java/org/apache/syncope/common/keymaster/client/zookeeper/ZookeeperKeymasterClientContext.java b/common/keymaster/client-zookeeper/src/main/java/org/apache/syncope/common/keymaster/client/zookeeper/ZookeeperKeymasterClientContext.java
index 079d8ea..5a76d54 100644
--- a/common/keymaster/client-zookeeper/src/main/java/org/apache/syncope/common/keymaster/client/zookeeper/ZookeeperKeymasterClientContext.java
+++ b/common/keymaster/client-zookeeper/src/main/java/org/apache/syncope/common/keymaster/client/zookeeper/ZookeeperKeymasterClientContext.java
@@ -35,7 +35,6 @@ import org.apache.syncope.common.keymaster.client.api.ServiceOps;
 import org.apache.zookeeper.ZooDefs;
 import org.apache.zookeeper.data.ACL;
 import org.apache.zookeeper.server.auth.DigestLoginModule;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
 import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
@@ -46,7 +45,7 @@ import org.springframework.context.annotation.Configuration;
 import org.springframework.core.type.AnnotatedTypeMetadata;
 
 @EnableConfigurationProperties(KeymasterProperties.class)
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class ZookeeperKeymasterClientContext {
 
     private static final Pattern IPV4 = Pattern.compile(
@@ -63,12 +62,9 @@ public class ZookeeperKeymasterClientContext {
         }
     }
 
-    @Autowired
-    private KeymasterProperties props;
-
     @Conditional(ZookeeperCondition.class)
     @Bean
-    public CuratorFramework curatorFramework() throws InterruptedException {
+    public CuratorFramework curatorFramework(final KeymasterProperties props) throws InterruptedException {
         if (StringUtils.isNotBlank(props.getUsername()) && StringUtils.isNotBlank(props.getPassword())) {
             javax.security.auth.login.Configuration.setConfiguration(new javax.security.auth.login.Configuration() {
 
@@ -115,8 +111,8 @@ public class ZookeeperKeymasterClientContext {
 
     @Conditional(ZookeeperCondition.class)
     @Bean
-    public ConfParamOps selfConfParamOps() {
-        return new ZookeeperConfParamOps();
+    public ConfParamOps selfConfParamOps(final CuratorFramework client) {
+        return new ZookeeperConfParamOps(client);
     }
 
     @Conditional(ZookeeperCondition.class)
diff --git a/common/keymaster/client-zookeeper/src/test/java/org/apache/syncope/common/keymaster/client/zookeeper/ZookeeperTestContext.java b/common/keymaster/client-zookeeper/src/test/java/org/apache/syncope/common/keymaster/client/zookeeper/ZookeeperTestContext.java
index 7b43155..ff5facb 100644
--- a/common/keymaster/client-zookeeper/src/test/java/org/apache/syncope/common/keymaster/client/zookeeper/ZookeeperTestContext.java
+++ b/common/keymaster/client-zookeeper/src/test/java/org/apache/syncope/common/keymaster/client/zookeeper/ZookeeperTestContext.java
@@ -24,7 +24,7 @@ import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.PropertySource;
 
 @PropertySource("classpath:test.properties")
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class ZookeeperTestContext {
 
     @Bean
diff --git a/common/keymaster/self/client-self/src/main/java/org/apache/syncope/common/keymaster/client/self/SelfKeymasterClientContext.java b/common/keymaster/self/client-self/src/main/java/org/apache/syncope/common/keymaster/client/self/SelfKeymasterClientContext.java
index ecd3426..8c33190 100644
--- a/common/keymaster/self/client-self/src/main/java/org/apache/syncope/common/keymaster/client/self/SelfKeymasterClientContext.java
+++ b/common/keymaster/self/client-self/src/main/java/org/apache/syncope/common/keymaster/client/self/SelfKeymasterClientContext.java
@@ -27,7 +27,7 @@ import org.apache.syncope.common.keymaster.client.api.ConfParamOps;
 import org.apache.syncope.common.keymaster.client.api.DomainOps;
 import org.apache.syncope.common.keymaster.client.api.KeymasterProperties;
 import org.apache.syncope.common.keymaster.client.api.ServiceOps;
-import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.autoconfigure.condition.SpringBootCondition;
@@ -39,7 +39,7 @@ import org.springframework.context.annotation.Configuration;
 import org.springframework.core.type.AnnotatedTypeMetadata;
 
 @EnableConfigurationProperties(KeymasterProperties.class)
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class SelfKeymasterClientContext {
 
     private static final Pattern HTTP = Pattern.compile("^http.+");
@@ -55,13 +55,10 @@ public class SelfKeymasterClientContext {
         }
     }
 
-    @Autowired
-    private KeymasterProperties props;
-
     @Conditional(SelfKeymasterCondition.class)
     @Bean
     @ConditionalOnMissingBean(name = "selfKeymasterRESTClientFactoryBean")
-    public JAXRSClientFactoryBean selfKeymasterRESTClientFactoryBean() {
+    public JAXRSClientFactoryBean selfKeymasterRESTClientFactoryBean(final KeymasterProperties props) {
         JAXRSClientFactoryBean restClientFactoryBean = new JAXRSClientFactoryBean();
         restClientFactoryBean.setAddress(props.getAddress());
         restClientFactoryBean.setUsername(props.getUsername());
@@ -77,21 +74,24 @@ public class SelfKeymasterClientContext {
     @Conditional(SelfKeymasterCondition.class)
     @Bean
     @ConditionalOnMissingBean(name = "selfConfParamOps")
-    public ConfParamOps selfConfParamOps() {
-        return new SelfKeymasterConfParamOps(selfKeymasterRESTClientFactoryBean());
+    public ConfParamOps selfConfParamOps(@Qualifier("selfKeymasterRESTClientFactoryBean")
+                                         final JAXRSClientFactoryBean selfKeymasterRESTClientFactoryBean) {
+        return new SelfKeymasterConfParamOps(selfKeymasterRESTClientFactoryBean);
     }
 
     @Conditional(SelfKeymasterCondition.class)
     @Bean
     @ConditionalOnMissingBean(name = "selfServiceOps")
-    public ServiceOps selfServiceOps() {
-        return new SelfKeymasterServiceOps(selfKeymasterRESTClientFactoryBean(), 5);
+    public ServiceOps selfServiceOps(@Qualifier("selfKeymasterRESTClientFactoryBean")
+                                     final JAXRSClientFactoryBean selfKeymasterRESTClientFactoryBean) {
+        return new SelfKeymasterServiceOps(selfKeymasterRESTClientFactoryBean, 5);
     }
 
     @Conditional(SelfKeymasterCondition.class)
     @Bean
     @ConditionalOnMissingBean(name = "domainOps")
-    public DomainOps domainOps() {
-        return new SelfKeymasterDomainOps(selfKeymasterRESTClientFactoryBean());
+    public DomainOps domainOps(@Qualifier("selfKeymasterRESTClientFactoryBean")
+                               final JAXRSClientFactoryBean selfKeymasterRESTClientFactoryBean) {
+        return new SelfKeymasterDomainOps(selfKeymasterRESTClientFactoryBean);
     }
 }
diff --git a/core/am/logic/src/main/java/org/apache/syncope/core/logic/AMLogicContext.java b/core/am/logic/src/main/java/org/apache/syncope/core/logic/AMLogicContext.java
index cf6e357..91bcf3f 100644
--- a/core/am/logic/src/main/java/org/apache/syncope/core/logic/AMLogicContext.java
+++ b/core/am/logic/src/main/java/org/apache/syncope/core/logic/AMLogicContext.java
@@ -49,38 +49,13 @@ import org.apache.syncope.core.provisioning.api.data.SRARouteDataBinder;
 import org.apache.syncope.core.provisioning.api.data.WAConfigDataBinder;
 import org.apache.syncope.core.provisioning.api.data.wa.WAClientAppDataBinder;
 import org.apache.syncope.core.spring.security.SecurityProperties;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class AMLogicContext {
 
-    @Autowired
-    private SecurityProperties securityProperties;
-
-    @Autowired
-    private ServiceOps serviceOps;
-
-    @Autowired
-    private AuthProfileDAO authProfileDAO;
-
-    @Autowired
-    private AuthProfileDataBinder authProfileDataBinder;
-
-    @Autowired
-    private CASSPDAO casspDAO;
-
-    @Autowired
-    private OIDCRPDAO oidcrpDAO;
-
-    @Autowired
-    private SAML2SPDAO saml2spDAO;
-
-    @Autowired
-    private EntityFactory entityFactory;
-
     @ConditionalOnMissingBean
     @Bean
     public AMEntitlementLoader amEntitlementLoader() {
@@ -89,7 +64,6 @@ public class AMLogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public AuthModuleLogic authModuleLogic(
             final AuthModuleDataBinder binder,
             final AuthModuleDAO authModuleDAO) {
@@ -99,15 +73,19 @@ public class AMLogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
-    public AuthProfileLogic authProfileLogic() {
+    public AuthProfileLogic authProfileLogic(final AuthProfileDAO authProfileDAO,
+                                             final AuthProfileDataBinder authProfileDataBinder) {
         return new AuthProfileLogic(authProfileDAO, authProfileDataBinder);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public ClientAppLogic clientAppLogic(
+            final ServiceOps serviceOps,
+            final CASSPDAO casspDAO,
+            final OIDCRPDAO oidcrpDAO,
+            final SAML2SPDAO saml2spDAO,
+            final SecurityProperties securityProperties,
             final ClientAppUtilsFactory clientAppUtilsFactory,
             final ClientAppDataBinder binder) {
 
@@ -123,7 +101,6 @@ public class AMLogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public OIDCJWKSLogic oidcJWKSLogic(
             final OIDCJWKSDataBinder binder,
             final OIDCJWKSDAO dao) {
@@ -133,7 +110,6 @@ public class AMLogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public SAML2IdPEntityLogic saml2IdPEntityLogic(
             final SAML2IdPEntityDataBinder binder,
             final SAML2IdPEntityDAO entityDAO) {
@@ -143,7 +119,6 @@ public class AMLogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public SAML2SPEntityLogic saml2SPEntityLogic(
             final SAML2SPEntityDataBinder binder,
             final SAML2SPEntityDAO entityDAO) {
@@ -153,8 +128,10 @@ public class AMLogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public SRARouteLogic sraRouteLogic(
+            final EntityFactory entityFactory,
+            final ServiceOps serviceOps,
+            final SecurityProperties securityProperties,
             final SRARouteDAO routeDAO,
             final SRARouteDataBinder binder) {
 
@@ -163,39 +140,50 @@ public class AMLogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    public GoogleMfaAuthAccountLogic googleMfaAuthAccountLogic() {
+    public GoogleMfaAuthAccountLogic googleMfaAuthAccountLogic(final AuthProfileDAO authProfileDAO,
+                                                               final AuthProfileDataBinder authProfileDataBinder,
+                                                               final EntityFactory entityFactory) {
         return new GoogleMfaAuthAccountLogic(entityFactory, authProfileDAO, authProfileDataBinder);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    public GoogleMfaAuthTokenLogic googleMfaAuthTokenLogic() {
+    public GoogleMfaAuthTokenLogic googleMfaAuthTokenLogic(final AuthProfileDAO authProfileDAO,
+                                                           final AuthProfileDataBinder authProfileDataBinder,
+                                                           final EntityFactory entityFactory) {
         return new GoogleMfaAuthTokenLogic(entityFactory, authProfileDAO, authProfileDataBinder);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    public ImpersonationLogic impersonationLogic() {
+    public ImpersonationLogic impersonationLogic(final AuthProfileDAO authProfileDAO,
+                                                 final AuthProfileDataBinder authProfileDataBinder,
+                                                 final EntityFactory entityFactory) {
         return new ImpersonationLogic(entityFactory, authProfileDAO, authProfileDataBinder);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    public U2FRegistrationLogic u2fRegistrationLogic() {
+    public U2FRegistrationLogic u2fRegistrationLogic(final AuthProfileDAO authProfileDAO,
+                                                     final AuthProfileDataBinder authProfileDataBinder,
+                                                     final EntityFactory entityFactory) {
         return new U2FRegistrationLogic(entityFactory, authProfileDAO, authProfileDataBinder);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
-    public WAClientAppLogic waClientAppLogic(final WAClientAppDataBinder binder) {
+    public WAClientAppLogic waClientAppLogic(final WAClientAppDataBinder binder,
+                                             final SAML2SPDAO saml2spDAO,
+                                             final OIDCRPDAO oidcrpDAO,
+                                             final CASSPDAO casspDAO) {
         return new WAClientAppLogic(binder, saml2spDAO, oidcrpDAO, casspDAO);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public WAConfigLogic waConfigLogic(
+            final ServiceOps serviceOps,
+            final SecurityProperties securityProperties,
             final WAConfigDataBinder binder,
             final WAConfigDAO waConfigDAO) {
 
@@ -204,7 +192,9 @@ public class AMLogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    public WebAuthnRegistrationLogic webAuthnRegistrationLogic() {
+    public WebAuthnRegistrationLogic webAuthnRegistrationLogic(final AuthProfileDAO authProfileDAO,
+                                                               final AuthProfileDataBinder authProfileDataBinder,
+                                                               final EntityFactory entityFactory) {
         return new WebAuthnRegistrationLogic(entityFactory, authProfileDAO, authProfileDataBinder);
     }
 }
diff --git a/core/am/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/AMRESTCXFContext.java b/core/am/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/AMRESTCXFContext.java
index 913865c..c55da93 100644
--- a/core/am/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/AMRESTCXFContext.java
+++ b/core/am/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/AMRESTCXFContext.java
@@ -60,38 +60,33 @@ import org.apache.syncope.core.rest.cxf.service.wa.U2FRegistrationServiceImpl;
 import org.apache.syncope.core.rest.cxf.service.wa.WAClientAppServiceImpl;
 import org.apache.syncope.core.rest.cxf.service.wa.WAConfigServiceImpl;
 import org.apache.syncope.core.rest.cxf.service.wa.WebAuthnRegistrationServiceImpl;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class AMRESTCXFContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public AuthModuleService authModuleService(final AuthModuleLogic authModuleLogic) {
         return new AuthModuleServiceImpl(authModuleLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public AuthProfileService authProfileService(final AuthProfileLogic authProfileLogic) {
         return new AuthProfileServiceImpl(authProfileLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public ClientAppService clientAppService(final ClientAppLogic clientAppLogic) {
         return new ClientAppServiceImpl(clientAppLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public GoogleMfaAuthAccountService googleMfaAuthAccountService(
             final GoogleMfaAuthAccountLogic googleMfaAuthAccountLogic) {
 
@@ -100,7 +95,6 @@ public class AMRESTCXFContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public GoogleMfaAuthTokenService googleMfaAuthTokenService(
             final GoogleMfaAuthTokenLogic googleMfaAuthTokenLogic) {
 
@@ -109,63 +103,54 @@ public class AMRESTCXFContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public ImpersonationService impersonationService(final ImpersonationLogic impersonationLogic) {
         return new ImpersonationServiceImpl(impersonationLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public OIDCJWKSService oidcJWKSService(final OIDCJWKSLogic oidcJWKSLogic) {
         return new OIDCJWKSServiceImpl(oidcJWKSLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public SAML2IdPEntityService saml2IdPEntityService(final SAML2IdPEntityLogic saml2IdPEntityLogic) {
         return new SAML2IdPEntityServiceImpl(saml2IdPEntityLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public SAML2SPEntityService saml2SPEntityService(final SAML2SPEntityLogic saml2SPEntityLogic) {
         return new SAML2SPEntityServiceImpl(saml2SPEntityLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public SRARouteService sraRouteService(final SRARouteLogic sraRouteLogic) {
         return new SRARouteServiceImpl(sraRouteLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public U2FRegistrationService u2fRegistrationService(final U2FRegistrationLogic u2fRegistrationLogic) {
         return new U2FRegistrationServiceImpl(u2fRegistrationLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public WAClientAppService waClientAppService(final WAClientAppLogic waClientAppLogic) {
         return new WAClientAppServiceImpl(waClientAppLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public WAConfigService waConfigService(final WAConfigLogic waConfigLogic) {
         return new WAConfigServiceImpl(waConfigLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public WebAuthnRegistrationService webAuthnRegistrationService(
             final WebAuthnRegistrationLogic webAuthnRegistrationLogic) {
 
diff --git a/core/idm/logic/src/main/java/org/apache/syncope/core/logic/IdMLogicContext.java b/core/idm/logic/src/main/java/org/apache/syncope/core/logic/IdMLogicContext.java
index b29e181..67dd540 100644
--- a/core/idm/logic/src/main/java/org/apache/syncope/core/logic/IdMLogicContext.java
+++ b/core/idm/logic/src/main/java/org/apache/syncope/core/logic/IdMLogicContext.java
@@ -39,47 +39,12 @@ import org.apache.syncope.core.provisioning.api.data.RemediationDataBinder;
 import org.apache.syncope.core.provisioning.api.data.ResourceDataBinder;
 import org.apache.syncope.core.provisioning.java.pushpull.InboundMatcher;
 import org.apache.syncope.core.provisioning.java.pushpull.OutboundMatcher;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class IdMLogicContext {
-
-    @Autowired
-    private AnyTypeDAO anyTypeDAO;
-
-    @Autowired
-    private ExternalResourceDAO resourceDAO;
-
-    @Autowired
-    private ConnInstanceDAO connInstanceDAO;
-
-    @Autowired
-    private VirSchemaDAO virSchemaDAO;
-
-    @Autowired
-    private VirAttrHandler virAttrHandler;
-
-    @Autowired
-    private ConnInstanceDataBinder connInstanceDataBinder;
-
-    @Autowired
-    private ConnectorManager connectorManager;
-
-    @Autowired
-    private InboundMatcher inboundMatcher;
-
-    @Autowired
-    private OutboundMatcher outboundMatcher;
-
-    @Autowired
-    private MappingManager mappingManager;
-
-    @Autowired
-    private AnyUtilsFactory anyUtilsFactory;
-
     @ConditionalOnMissingBean
     @Bean
     public IdMEntitlementLoader idmEntitlementLoader() {
@@ -94,8 +59,12 @@ public class IdMLogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
-    public ConnectorLogic connectorLogic(final ConnIdBundleManager connIdBundleManager) {
+    public ConnectorLogic connectorLogic(
+        final ConnIdBundleManager connIdBundleManager,
+        final ExternalResourceDAO resourceDAO,
+        final ConnInstanceDAO connInstanceDAO,
+        final ConnInstanceDataBinder connInstanceDataBinder,
+        final ConnectorManager connectorManager) {
         return new ConnectorLogic(
                 connIdBundleManager,
                 connectorManager,
@@ -106,12 +75,20 @@ public class IdMLogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public ReconciliationLogic reconciliationLogic(
             final RealmDAO realmDAO,
+            final AnyUtilsFactory anyUtilsFactory,
             final PlainSchemaDAO plainSchemaDAO,
             final DerSchemaDAO derSchemaDAO,
-            final AnySearchDAO anySearchDAO) {
+            final AnySearchDAO anySearchDAO,
+            final AnyTypeDAO anyTypeDAO,
+            final ExternalResourceDAO resourceDAO,
+            final VirSchemaDAO virSchemaDAO,
+            final VirAttrHandler virAttrHandler,
+            final ConnectorManager connectorManager,
+            final InboundMatcher inboundMatcher,
+            final OutboundMatcher outboundMatcher,
+            final MappingManager mappingManager) {
 
         return new ReconciliationLogic(
                 anyUtilsFactory,
@@ -131,7 +108,6 @@ public class IdMLogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public RemediationLogic remediationLogic(
             final UserLogic userLogic,
             final GroupLogic groupLogic,
@@ -144,8 +120,19 @@ public class IdMLogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
-    public ResourceLogic resourceLogic(final ResourceDataBinder resourceDataBinder) {
+    public ResourceLogic resourceLogic(
+        final ResourceDataBinder resourceDataBinder,
+        final AnyUtilsFactory anyUtilsFactory,
+        final AnyTypeDAO anyTypeDAO,
+        final ExternalResourceDAO resourceDAO,
+        final ConnInstanceDAO connInstanceDAO,
+        final VirSchemaDAO virSchemaDAO,
+        final VirAttrHandler virAttrHandler,
+        final ConnInstanceDataBinder connInstanceDataBinder,
+        final ConnectorManager connectorManager,
+        final OutboundMatcher outboundMatcher,
+        final MappingManager mappingManager) {
+        
         return new ResourceLogic(
                 resourceDAO,
                 anyTypeDAO,
diff --git a/core/idm/logic/src/test/java/org/apache/syncope/core/logic/IdMLogicTestContext.java b/core/idm/logic/src/test/java/org/apache/syncope/core/logic/IdMLogicTestContext.java
index 92b98d9..f29b633 100644
--- a/core/idm/logic/src/test/java/org/apache/syncope/core/logic/IdMLogicTestContext.java
+++ b/core/idm/logic/src/test/java/org/apache/syncope/core/logic/IdMLogicTestContext.java
@@ -31,7 +31,6 @@ import org.apache.syncope.core.persistence.jpa.StartupDomainLoader;
 import org.apache.syncope.core.provisioning.java.ProvisioningContext;
 import org.apache.syncope.core.spring.security.SecurityContext;
 import org.apache.syncope.core.workflow.java.WorkflowContext;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -41,11 +40,10 @@ import org.springframework.context.annotation.PropertySource;
 @PropertySource("classpath:core-test.properties")
 @Import({ IdRepoLogicContext.class, IdMLogicContext.class, SecurityContext.class,
     PersistenceContext.class, MasterDomain.class, ProvisioningContext.class, WorkflowContext.class })
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class IdMLogicTestContext {
 
     @Bean
-    @Autowired
     public TestInitializer testInitializer(
             final StartupDomainLoader domainLoader,
             final DomainHolder domainHolder,
@@ -66,7 +64,6 @@ public class IdMLogicTestContext {
     }
 
     @Bean
-    @Autowired
     public DomainOps domainOps(final DomainRegistry domainRegistry) {
         return new DummyDomainOps(domainRegistry);
     }
diff --git a/core/idm/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/IdMRESTCXFContext.java b/core/idm/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/IdMRESTCXFContext.java
index 3a0ce14..0c0ceb2 100644
--- a/core/idm/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/IdMRESTCXFContext.java
+++ b/core/idm/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/IdMRESTCXFContext.java
@@ -34,24 +34,21 @@ import org.apache.syncope.core.rest.cxf.service.ConnectorServiceImpl;
 import org.apache.syncope.core.rest.cxf.service.ReconciliationServiceImpl;
 import org.apache.syncope.core.rest.cxf.service.RemediationServiceImpl;
 import org.apache.syncope.core.rest.cxf.service.ResourceServiceImpl;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class IdMRESTCXFContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public ConnectorService connectorService(final ConnectorLogic connectorLogic) {
         return new ConnectorServiceImpl(connectorLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public ReconciliationService reconciliationService(
             final SearchCondVisitor searchCondVisitor,
             final ReconciliationLogic reconciliationLogic) {
@@ -61,7 +58,6 @@ public class IdMRESTCXFContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public RemediationService remediationService(
             final RemediationLogic remediationLogic,
             final UserDAO userDAO,
@@ -73,7 +69,6 @@ public class IdMRESTCXFContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public ResourceService resourceService(final ResourceLogic resourceLogic) {
         return new ResourceServiceImpl(resourceLogic);
     }
diff --git a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/IdRepoLogicContext.java b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/IdRepoLogicContext.java
index 0b2ac07..f28af9a 100644
--- a/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/IdRepoLogicContext.java
+++ b/core/idrepo/logic/src/main/java/org/apache/syncope/core/logic/IdRepoLogicContext.java
@@ -92,7 +92,6 @@ import org.apache.syncope.core.spring.security.SecurityProperties;
 import org.apache.syncope.core.workflow.api.AnyObjectWorkflowAdapter;
 import org.apache.syncope.core.workflow.api.GroupWorkflowAdapter;
 import org.apache.syncope.core.workflow.api.UserWorkflowAdapter;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.context.annotation.Bean;
@@ -100,108 +99,15 @@ import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.EnableAspectJAutoProxy;
 import org.springframework.scheduling.quartz.SchedulerFactoryBean;
 
-@EnableAspectJAutoProxy
+@EnableAspectJAutoProxy(proxyTargetClass = false)
 @EnableConfigurationProperties(LogicProperties.class)
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class IdRepoLogicContext {
 
-    @Autowired
-    private LogicProperties logicProperties;
-
-    @Autowired
-    private SecurityProperties securityProperties;
-
-    @Autowired
-    private AccessTokenDAO accessTokenDAO;
-
-    @Autowired
-    private AnySearchDAO anySearchDAO;
-
-    @Autowired
-    private AnyObjectDAO anyObjectDAO;
-
-    @Autowired
-    private AnyTypeClassDAO anyTypeClassDAO;
-
-    @Autowired
-    private AnyTypeDAO anyTypeDAO;
-
-    @Autowired
-    private AuditConfDAO auditConfDAO;
-
-    @Autowired
-    private DelegationDAO delegationDAO;
-
-    @Autowired
-    private DerSchemaDAO derSchemaDAO;
-
-    @Autowired
-    private ExternalResourceDAO externalResourceDAO;
-
-    @Autowired
-    private GroupDAO groupDAO;
-
-    @Autowired
-    private ImplementationDAO implementationDAO;
-
-    @Autowired
-    private NotificationDAO notificationDAO;
-
-    @Autowired
-    private PlainSchemaDAO plainSchemaDAO;
-
-    @Autowired
-    private PolicyDAO policyDAO;
-
-    @Autowired
-    private RealmDAO realmDAO;
-
-    @Autowired
-    private ReportDAO reportDAO;
-
-    @Autowired
-    private TaskDAO taskDAO;
-
-    @Autowired
-    private UserDAO userDAO;
-
-    @Autowired
-    private VirSchemaDAO virSchemaDAO;
-
-    @Autowired
-    private AuditManager auditManager;
-
-    @Autowired
-    private TemplateUtils templateUtils;
-
-    @Autowired
-    private EntityFactory entityFactory;
-
-    @Autowired
-    private GroupDataBinder groupDataBinder;
-
-    @Autowired
-    private TaskDataBinder taskDataBinder;
-
-    @Autowired
-    private ConfParamOps confParamOps;
-
-    @Autowired
-    private JobManager jobManager;
-
-    @Autowired
-    private SchedulerFactoryBean scheduler;
-
-    @Autowired
-    private PropagationManager propagationManager;
-
-    @Autowired
-    private PropagationTaskExecutor taskExecutor;
-
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
-    public LogicInvocationHandler logicInvocationHandler(final NotificationManager notificationManager) {
+    public LogicInvocationHandler logicInvocationHandler(final NotificationManager notificationManager,
+                                                         final AuditManager auditManager) {
         return new LogicInvocationHandler(notificationManager, auditManager);
     }
 
@@ -213,27 +119,27 @@ public class IdRepoLogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    public AuditAccessor auditAccessor() {
+    public AuditAccessor auditAccessor(final AuditConfDAO auditConfDAO) {
         return new AuditAccessor(auditConfDAO);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
-    public AuditLoader auditLoader(final AuditAccessor auditAccessor, final ImplementationLookup implementationLookup) {
+    public AuditLoader auditLoader(final AuditAccessor auditAccessor, final ImplementationLookup implementationLookup,
+                                   final LogicProperties logicProperties) {
         return new AuditLoader(auditAccessor, implementationLookup, logicProperties);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    public EntitlementAccessor entitlementAccessor() {
+    public EntitlementAccessor entitlementAccessor(final AnyTypeDAO anyTypeDAO) {
         return new EntitlementAccessor(anyTypeDAO);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    public IdRepoEntitlementLoader idRepoEntitlementLoader() {
-        return new IdRepoEntitlementLoader(entitlementAccessor());
+    public IdRepoEntitlementLoader idRepoEntitlementLoader(final EntitlementAccessor entitlementAccessor) {
+        return new IdRepoEntitlementLoader(entitlementAccessor);
     }
 
     @ConditionalOnMissingBean
@@ -244,16 +150,21 @@ public class IdRepoLogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
-    public AccessTokenLogic accessTokenLogic(final AccessTokenDataBinder binder) {
+    public AccessTokenLogic accessTokenLogic(final AccessTokenDataBinder binder,
+                                             final AccessTokenDAO accessTokenDAO,
+                                             final SecurityProperties securityProperties) {
         return new AccessTokenLogic(securityProperties, binder, accessTokenDAO);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public AnyObjectLogic anyObjectLogic(
             final AnyObjectDataBinder binder,
+            final TemplateUtils templateUtils,
+            final RealmDAO realmDAO,
+            final AnyTypeDAO anyTypeDAO,
+            final AnyObjectDAO anyObjectDAO,
+            final AnySearchDAO anySearchDAO,
             final AnyObjectProvisioningManager provisioningManager) {
 
         return new AnyObjectLogic(
@@ -268,21 +179,21 @@ public class IdRepoLogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
-    public AnyTypeClassLogic anyTypeClassLogic(final AnyTypeClassDataBinder binder) {
+    public AnyTypeClassLogic anyTypeClassLogic(final AnyTypeClassDataBinder binder,
+                                               final AnyTypeClassDAO anyTypeClassDAO) {
         return new AnyTypeClassLogic(binder, anyTypeClassDAO);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
-    public AnyTypeLogic anyTypeLogic(final AnyTypeDataBinder binder) {
+    public AnyTypeLogic anyTypeLogic(final AnyTypeDataBinder binder,
+                                     final AnyTypeDAO anyTypeDAO,
+                                     final AnyObjectDAO anyObjectDAO) {
         return new AnyTypeLogic(binder, anyTypeDAO, anyObjectDAO);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public ApplicationLogic applicationLogic(
             final ApplicationDataBinder binder,
             final ApplicationDAO applicationDAO) {
@@ -292,9 +203,12 @@ public class IdRepoLogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public AuditLogic auditLogic(
+            final AuditManager auditManager,
             final AuditLoader auditLoader,
+            final AuditConfDAO auditConfDAO,
+            final ExternalResourceDAO externalResourceDAO,
+            final EntityFactory entityFactory,
             final AuditDataBinder binder) {
 
         return new AuditLogic(
@@ -308,14 +222,14 @@ public class IdRepoLogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
-    public DelegationLogic delegationLogic(final DelegationDataBinder binder) {
+    public DelegationLogic delegationLogic(final DelegationDataBinder binder,
+                                           final UserDAO userDAO,
+                                           final DelegationDAO delegationDAO) {
         return new DelegationLogic(binder, delegationDAO, userDAO);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public DynRealmLogic dynRealmLogic(
             final DynRealmDataBinder binder,
             final DynRealmDAO dynRealmDAO) {
@@ -325,8 +239,22 @@ public class IdRepoLogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
-    public GroupLogic groupLogic(final GroupProvisioningManager provisioningManager) {
+    public GroupLogic groupLogic(final GroupProvisioningManager provisioningManager,
+                                 final JobManager jobManager,
+                                 final TemplateUtils templateUtils,
+                                 final EntityFactory entityFactory,
+                                 final RealmDAO realmDAO,
+                                 final AnyTypeDAO anyTypeDAO,
+                                 final UserDAO userDAO,
+                                 final GroupDAO groupDAO,
+                                 final AnySearchDAO anySearchDAO,
+                                 final SchedulerFactoryBean scheduler,
+                                 final TaskDAO taskDAO,
+                                 final ConfParamOps confParamOps,
+                                 final GroupDataBinder groupDataBinder,
+                                 final TaskDataBinder taskDataBinder,
+                                 final ImplementationDAO implementationDAO,
+                                 final SecurityProperties securityProperties) {
         return new GroupLogic(
                 realmDAO,
                 anyTypeDAO,
@@ -348,8 +276,15 @@ public class IdRepoLogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
-    public ImplementationLogic implementationLogic(final ImplementationDataBinder binder) {
+    public ImplementationLogic implementationLogic(final ImplementationDataBinder binder,
+                                                   final PlainSchemaDAO plainSchemaDAO,
+                                                   final RealmDAO realmDAO,
+                                                   final PolicyDAO policyDAO,
+                                                   final ReportDAO reportDAO,
+                                                   final TaskDAO taskDAO,
+                                                   final ExternalResourceDAO externalResourceDAO,
+                                                   final ImplementationDAO implementationDAO,
+                                                   final NotificationDAO notificationDAO) {
         return new ImplementationLogic(
                 binder,
                 implementationDAO,
@@ -364,23 +299,26 @@ public class IdRepoLogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
-    public MailTemplateLogic mailTemplateLogic(final MailTemplateDAO mailTemplateDAO) {
+    public MailTemplateLogic mailTemplateLogic(final MailTemplateDAO mailTemplateDAO,
+                                               final EntityFactory entityFactory,
+                                               final NotificationDAO notificationDAO) {
         return new MailTemplateLogic(mailTemplateDAO, notificationDAO, entityFactory);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
-    public NotificationLogic notificationLogic(final NotificationDataBinder binder) {
+    public NotificationLogic notificationLogic(final NotificationDataBinder binder,
+                                               final JobManager jobManager,
+                                               final SchedulerFactoryBean scheduler,
+                                               final NotificationDAO notificationDAO) {
         return new NotificationLogic(jobManager, scheduler, notificationDAO, binder);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public PolicyLogic policyLogic(
             final PolicyDataBinder binder,
+            final PolicyDAO policyDAO,
             final PolicyUtilsFactory policyUtilsFactory) {
 
         return new PolicyLogic(policyDAO, binder, policyUtilsFactory);
@@ -388,14 +326,16 @@ public class IdRepoLogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
-    public RealmLogic realmLogic(final RealmDataBinder binder) {
+    public RealmLogic realmLogic(final RealmDataBinder binder,
+                                 final RealmDAO realmDAO,
+                                 final AnySearchDAO anySearchDAO,
+                                 final PropagationManager propagationManager,
+                                 final PropagationTaskExecutor taskExecutor) {
         return new RealmLogic(realmDAO, anySearchDAO, binder, propagationManager, taskExecutor);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public RelationshipTypeLogic relationshipTypeLogic(
             final RelationshipTypeDataBinder binder,
             final RelationshipTypeDAO relationshipTypeDAO) {
@@ -405,9 +345,13 @@ public class IdRepoLogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public ReportLogic reportLogic(
+            final JobManager jobManager,
+            final ConfParamOps confParamOps,
             final ReportDataBinder binder,
+            final SchedulerFactoryBean scheduler,
+            final ReportDAO reportDAO,
+            final EntityFactory entityFactory,
             final ReportExecDAO reportExecDAO) {
 
         return new ReportLogic(jobManager, scheduler, reportDAO, reportExecDAO, confParamOps, binder, entityFactory);
@@ -415,14 +359,14 @@ public class IdRepoLogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
-    public ReportTemplateLogic reportTemplateLogic(final ReportTemplateDAO reportTemplateDAO) {
+    public ReportTemplateLogic reportTemplateLogic(final ReportTemplateDAO reportTemplateDAO,
+                                                   final ReportDAO reportDAO,
+                                                   final EntityFactory entityFactory) {
         return new ReportTemplateLogic(reportTemplateDAO, reportDAO, entityFactory);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public RoleLogic roleLogic(
             final RoleDataBinder binder,
             final RoleDAO roleDAO) {
@@ -432,16 +376,19 @@ public class IdRepoLogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
-    public SchemaLogic schemaLogic(final SchemaDataBinder binder) {
+    public SchemaLogic schemaLogic(final SchemaDataBinder binder,
+                                   final VirSchemaDAO virSchemaDAO,
+                                   final AnyTypeClassDAO anyTypeClassDAO,
+                                   final DerSchemaDAO derSchemaDAO,
+                                   final PlainSchemaDAO plainSchemaDAO) {
         return new SchemaLogic(plainSchemaDAO, derSchemaDAO, virSchemaDAO, anyTypeClassDAO, binder);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public SecurityQuestionLogic securityQuestionLogic(
             final SecurityQuestionDataBinder binder,
+            final UserDAO userDAO,
             final SecurityQuestionDAO securityQuestionDAO) {
 
         return new SecurityQuestionLogic(securityQuestionDAO, userDAO, binder);
@@ -449,10 +396,14 @@ public class IdRepoLogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public SyncopeLogic syncopeLogic(
             final ContentExporter exporter,
             final UserWorkflowAdapter uwfAdapter,
+            final AnyTypeDAO anyTypeDAO,
+            final GroupDAO groupDAO,
+            final ConfParamOps confParamOps,
+            final GroupDataBinder groupDataBinder,
+            final AnySearchDAO anySearchDAO,
             final GroupWorkflowAdapter gwfAdapter,
             final AnyObjectWorkflowAdapter awfAdapter) {
 
@@ -470,11 +421,18 @@ public class IdRepoLogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public TaskLogic taskLogic(
+            final JobManager jobManager,
+            final PropagationTaskExecutor taskExecutor,
             final TaskExecDAO taskExecDAO,
+            final TaskDAO taskDAO,
+            final SchedulerFactoryBean scheduler,
+            final ConfParamOps confParamOps,
+            final ExternalResourceDAO externalResourceDAO,
             final NotificationJobDelegate notificationJobDelegate,
-            final TaskUtilsFactory taskUtilsFactory) {
+            final TaskDataBinder taskDataBinder,
+            final TaskUtilsFactory taskUtilsFactory,
+            final NotificationDAO notificationDAO) {
 
         return new TaskLogic(
                 jobManager,
@@ -492,9 +450,17 @@ public class IdRepoLogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public UserLogic userLogic(
             final UserDataBinder binder,
+            final TemplateUtils templateUtils,
+            final RealmDAO realmDAO,
+            final AnyTypeDAO anyTypeDAO,
+            final UserDAO userDAO,
+            final GroupDAO groupDAO,
+            final AnySearchDAO anySearchDAO,
+            final AccessTokenDAO accessTokenDAO,
+            final DelegationDAO delegationDAO,
+            final ConfParamOps confParamOps,
             final UserProvisioningManager provisioningManager,
             final SyncopeLogic syncopeLogic) {
 
diff --git a/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/IdRepoRESTCXFContext.java b/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/IdRepoRESTCXFContext.java
index 595c714..71b12d4 100644
--- a/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/IdRepoRESTCXFContext.java
+++ b/core/idrepo/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/IdRepoRESTCXFContext.java
@@ -29,6 +29,8 @@ import java.util.Set;
 import javax.servlet.ServletRequestListener;
 import org.apache.cxf.Bus;
 import org.apache.cxf.endpoint.Server;
+import org.apache.cxf.jaxrs.ext.ContextProvider;
+import org.apache.cxf.jaxrs.ext.search.SearchContext;
 import org.apache.cxf.jaxrs.ext.search.SearchContextImpl;
 import org.apache.cxf.jaxrs.ext.search.SearchContextProvider;
 import org.apache.cxf.jaxrs.ext.search.SearchUtils;
@@ -121,7 +123,6 @@ import org.apache.syncope.core.rest.cxf.service.SyncopeServiceImpl;
 import org.apache.syncope.core.rest.cxf.service.TaskServiceImpl;
 import org.apache.syncope.core.rest.cxf.service.UserSelfServiceImpl;
 import org.apache.syncope.core.rest.cxf.service.UserServiceImpl;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
 import org.springframework.context.ApplicationContext;
@@ -132,18 +133,9 @@ import org.springframework.core.env.Environment;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 
 @PropertySource("classpath:errorMessages.properties")
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class IdRepoRESTCXFContext {
 
-    @Autowired
-    private SearchCondVisitor searchCondVisitor;
-
-    @Autowired
-    private Bus bus;
-
-    @Autowired
-    private ApplicationContext ctx;
-
     @ConditionalOnMissingBean
     @Bean
     public ThreadPoolTaskExecutor batchExecutor() {
@@ -192,9 +184,9 @@ public class IdRepoRESTCXFContext {
 
     @ConditionalOnMissingBean
     @Bean
-    public JAXRSBeanValidationInInterceptor validationInInterceptor() {
+    public JAXRSBeanValidationInInterceptor validationInInterceptor(final BeanValidationProvider validationProvider) {
         JAXRSBeanValidationInInterceptor validationInInterceptor = new JAXRSBeanValidationInInterceptor();
-        validationInInterceptor.setProvider(validationProvider());
+        validationInInterceptor.setProvider(validationProvider);
         return validationInInterceptor;
     }
 
@@ -215,20 +207,18 @@ public class IdRepoRESTCXFContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public RestServiceExceptionMapper restServiceExceptionMapper(final Environment env) {
         return new RestServiceExceptionMapper(env);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    public SearchContextProvider searchContextProvider() {
+    public ContextProvider<SearchContext> searchContextProvider() {
         return new SearchContextProvider();
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public CheckDomainFilter checkDomainFilter(final DomainHolder domainHolder) {
         return new CheckDomainFilter(domainHolder);
     }
@@ -245,17 +235,14 @@ public class IdRepoRESTCXFContext {
         return new AddETagFilter();
     }
 
-    private String version() {
-        return ctx.getEnvironment().getProperty("version");
-    }
-
     @ConditionalOnMissingBean
     @Bean
-    public OpenApiFeature openapiFeature() {
+    public OpenApiFeature openapiFeature(final ApplicationContext ctx) {
+        String version = ctx.getEnvironment().getProperty("version");
         OpenApiFeature openapiFeature = new OpenApiFeature();
         openapiFeature.setTitle("Apache Syncope");
-        openapiFeature.setVersion(version());
-        openapiFeature.setDescription("Apache Syncope " + version());
+        openapiFeature.setVersion(version);
+        openapiFeature.setDescription("Apache Syncope " + version);
         openapiFeature.setContactName("The Apache Syncope community");
         openapiFeature.setContactEmail("dev@syncope.apache.org");
         openapiFeature.setContactUrl("https://syncope.apache.org");
@@ -284,8 +271,20 @@ public class IdRepoRESTCXFContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public Server restContainer(
+            final AddETagFilter addETagFilter,
+            final AddDomainFilter addDomainFilter,
+            final ContextProvider<SearchContext> searchContextProvider,
+            final JacksonYAMLProvider yamlProvider,
+            final JacksonXMLProvider xmlProvider,
+            final JacksonJsonProvider jsonProvider,
+            final DateParamConverterProvider dateParamConverterProvider,
+            final JAXRSBeanValidationInInterceptor validationInInterceptor,
+            final GZIPInInterceptor gzipInInterceptor,
+            final GZIPOutInterceptor gzipOutInterceptor,
+            final OpenApiFeature openapiFeature,
+            final Bus bus,
+            final ApplicationContext ctx,
             final CheckDomainFilter checkDomainFilter,
             final RestServiceExceptionMapper restServiceExceptionMapper) {
 
@@ -304,23 +303,23 @@ public class IdRepoRESTCXFContext {
         restContainer.setProperties(properties);
 
         restContainer.setProviders(List.of(
-                dateParamConverterProvider(),
-                jsonProvider(),
-                xmlProvider(),
-                yamlProvider(),
+                dateParamConverterProvider,
+                jsonProvider,
+                xmlProvider,
+                yamlProvider,
                 restServiceExceptionMapper,
-                searchContextProvider(),
+                searchContextProvider,
                 checkDomainFilter,
-                addDomainFilter(),
-                addETagFilter()));
+                addDomainFilter,
+                addETagFilter));
 
         restContainer.setInInterceptors(List.of(
-                gzipInInterceptor(),
-                validationInInterceptor()));
+                gzipInInterceptor,
+                validationInInterceptor));
 
-        restContainer.setOutInterceptors(List.of(gzipOutInterceptor()));
+        restContainer.setOutInterceptors(List.of(gzipOutInterceptor));
 
-        restContainer.setFeatures(List.of(openapiFeature()));
+        restContainer.setFeatures(List.of(openapiFeature));
 
         restContainer.setApplicationContext(ctx);
         return restContainer.create();
@@ -336,148 +335,130 @@ public class IdRepoRESTCXFContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public AccessTokenService accessTokenService(final AccessTokenLogic accessTokenLogic) {
         return new AccessTokenServiceImpl(accessTokenLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
-    public AnyObjectService anyObjectService(final AnyObjectDAO anyObjectDAO, final AnyObjectLogic anyObjectLogic) {
+    public AnyObjectService anyObjectService(final AnyObjectDAO anyObjectDAO, final AnyObjectLogic anyObjectLogic,
+                                             final SearchCondVisitor searchCondVisitor) {
         return new AnyObjectServiceImpl(searchCondVisitor, anyObjectDAO, anyObjectLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public AnyTypeClassService anyTypeClassService(final AnyTypeClassLogic anyTypeClassLogic) {
         return new AnyTypeClassServiceImpl(anyTypeClassLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public AnyTypeService anyTypeService(final AnyTypeLogic anyTypeLogic) {
         return new AnyTypeServiceImpl(anyTypeLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public ApplicationService applicationService(final ApplicationLogic applicationLogic) {
         return new ApplicationServiceImpl(applicationLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public AuditService auditService(final AuditLogic auditLogic) {
         return new AuditServiceImpl(auditLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public DelegationService delegationService(final DelegationLogic delegationLogic) {
         return new DelegationServiceImpl(delegationLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public DynRealmService dynRealmService(final DynRealmLogic dynRealmLogic) {
         return new DynRealmServiceImpl(dynRealmLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
-    public GroupService groupService(final GroupDAO groupDAO, final GroupLogic groupLogic) {
+    public GroupService groupService(final GroupDAO groupDAO, final GroupLogic groupLogic,
+                                     final SearchCondVisitor searchCondVisitor) {
         return new GroupServiceImpl(searchCondVisitor, groupDAO, groupLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public ImplementationService implementationService(final ImplementationLogic implementationLogic) {
         return new ImplementationServiceImpl(implementationLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public MailTemplateService mailTemplateService(final MailTemplateLogic mailTemplateLogic) {
         return new MailTemplateServiceImpl(mailTemplateLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public NotificationService notificationService(final NotificationLogic notificationLogic) {
         return new NotificationServiceImpl(notificationLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public PolicyService policyService(final PolicyLogic policyLogic) {
         return new PolicyServiceImpl(policyLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public RealmService realmService(final RealmLogic realmLogic) {
         return new RealmServiceImpl(realmLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public RelationshipTypeService relationshipTypeService(final RelationshipTypeLogic relationshipTypeLogic) {
         return new RelationshipTypeServiceImpl(relationshipTypeLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public ReportService reportService(final ReportLogic reportLogic) {
         return new ReportServiceImpl(reportLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public ReportTemplateService reportTemplateService(final ReportTemplateLogic reportTemplateLogic) {
         return new ReportTemplateServiceImpl(reportTemplateLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public RoleService roleService(final RoleLogic roleLogic) {
         return new RoleServiceImpl(roleLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public SchemaService schemaService(final SchemaLogic schemaLogic) {
         return new SchemaServiceImpl(schemaLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public SecurityQuestionService securityQuestionService(final SecurityQuestionLogic securityQuestionLogic) {
         return new SecurityQuestionServiceImpl(securityQuestionLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public SyncopeService syncopeService(
+            final Bus bus,
             final SyncopeLogic syncopeLogic,
             final ThreadPoolTaskExecutor batchExecutor,
             final BatchDAO batchDAO,
@@ -488,22 +469,20 @@ public class IdRepoRESTCXFContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public TaskService taskService(final TaskLogic taskLogic) {
         return new TaskServiceImpl(taskLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public UserSelfService userSelfService(final UserLogic userLogic, final SyncopeLogic syncopeLogic) {
         return new UserSelfServiceImpl(userLogic, syncopeLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
-    public UserService userService(final UserDAO userDAO, final UserLogic userLogic) {
+    public UserService userService(final UserDAO userDAO, final UserLogic userLogic,
+                                   final SearchCondVisitor searchCondVisitor) {
         return new UserServiceImpl(searchCondVisitor, userDAO, userLogic);
     }
 }
diff --git a/core/idrepo/rest-cxf/src/test/java/org/apache/syncope/core/rest/cxf/service/IdRepoRESTCXFTestContext.java b/core/idrepo/rest-cxf/src/test/java/org/apache/syncope/core/rest/cxf/service/IdRepoRESTCXFTestContext.java
index cd30151..05e0e30 100644
--- a/core/idrepo/rest-cxf/src/test/java/org/apache/syncope/core/rest/cxf/service/IdRepoRESTCXFTestContext.java
+++ b/core/idrepo/rest-cxf/src/test/java/org/apache/syncope/core/rest/cxf/service/IdRepoRESTCXFTestContext.java
@@ -37,7 +37,7 @@ import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.core.env.Environment;
 
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class IdRepoRESTCXFTestContext {
 
     @Autowired
@@ -75,9 +75,10 @@ public class IdRepoRESTCXFTestContext {
     }
 
     @Bean
-    public JAXRSBeanValidationInInterceptor validationInInterceptor() {
+    public JAXRSBeanValidationInInterceptor validationInInterceptor(
+        final BeanValidationProvider validationProvider) {
         JAXRSBeanValidationInInterceptor validationInInterceptor = new JAXRSBeanValidationInInterceptor();
-        validationInInterceptor.setProvider(validationProvider());
+        validationInInterceptor.setProvider(validationProvider);
         return validationInInterceptor;
     }
 
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/JPAJSONPersistenceContext.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/JPAJSONPersistenceContext.java
index b07658b..8a3312a 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/JPAJSONPersistenceContext.java
+++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/JPAJSONPersistenceContext.java
@@ -48,7 +48,7 @@ import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Lazy;
 
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public abstract class JPAJSONPersistenceContext {
 
     @Autowired
@@ -59,7 +59,6 @@ public abstract class JPAJSONPersistenceContext {
 
     @ConditionalOnMissingBean(name = "jpaJSONAnyObjectDAO")
     @Bean
-    @Autowired
     public AnyObjectDAO anyObjectDAO(
             final AnyUtilsFactory anyUtilsFactory,
             final @Lazy PlainSchemaDAO plainSchemaDAO,
@@ -82,7 +81,6 @@ public abstract class JPAJSONPersistenceContext {
 
     @ConditionalOnMissingBean(name = "jpaJSONGroupDAO")
     @Bean
-    @Autowired
     public GroupDAO groupDAO(
             final AnyUtilsFactory anyUtilsFactory,
             final @Lazy PlainSchemaDAO plainSchemaDAO,
@@ -125,7 +123,6 @@ public abstract class JPAJSONPersistenceContext {
 
     @ConditionalOnMissingBean(name = "jpaJSONUserDAO")
     @Bean
-    @Autowired
     public UserDAO userDAO(
             final AnyUtilsFactory anyUtilsFactory,
             final @Lazy PlainSchemaDAO plainSchemaDAO,
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/MyJPAJSONPersistenceContext.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/MyJPAJSONPersistenceContext.java
index da88cba..ab01aac 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/MyJPAJSONPersistenceContext.java
+++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/MyJPAJSONPersistenceContext.java
@@ -36,7 +36,6 @@ import org.apache.syncope.core.persistence.jpa.dao.MyJPAJSONAnySearchDAO;
 import org.apache.syncope.core.persistence.jpa.dao.MyJPAJSONAuditConfDAO;
 import org.apache.syncope.core.persistence.jpa.dao.MyJPAJSONPlainSchemaDAO;
 import org.apache.syncope.core.persistence.jpa.entity.MyJPAJSONEntityFactory;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
@@ -53,14 +52,12 @@ public class MyJPAJSONPersistenceContext extends JPAJSONPersistenceContext {
 
     @ConditionalOnMissingBean(name = "myJPAJSONAnyDAO")
     @Bean
-    @Autowired
     public JPAJSONAnyDAO anyDAO(final @Lazy PlainSchemaDAO plainSchemaDAO) {
         return new MyJPAJSONAnyDAO(plainSchemaDAO);
     }
 
     @ConditionalOnMissingBean(name = "myJPAJSONAnySearchDAO")
     @Bean
-    @Autowired
     public AnySearchDAO anySearchDAO(
             final @Lazy RealmDAO realmDAO,
             final @Lazy DynRealmDAO dynRealmDAO,
@@ -90,7 +87,6 @@ public class MyJPAJSONPersistenceContext extends JPAJSONPersistenceContext {
 
     @ConditionalOnMissingBean(name = "myJPAJSONPlainSchemaDAO")
     @Bean
-    @Autowired
     public PlainSchemaDAO plainSchemaDAO(
             final AnyUtilsFactory anyUtilsFactory,
             final @Lazy PlainAttrDAO plainAttrDAO,
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/PGJPAJSONPersistenceContext.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/PGJPAJSONPersistenceContext.java
index be63b58..88e2949 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/PGJPAJSONPersistenceContext.java
+++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/PGJPAJSONPersistenceContext.java
@@ -36,7 +36,6 @@ import org.apache.syncope.core.persistence.jpa.dao.PGJPAJSONAnySearchDAO;
 import org.apache.syncope.core.persistence.jpa.dao.PGJPAJSONAuditConfDAO;
 import org.apache.syncope.core.persistence.jpa.dao.PGJPAJSONPlainSchemaDAO;
 import org.apache.syncope.core.persistence.jpa.entity.PGJPAJSONEntityFactory;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
@@ -53,14 +52,12 @@ public class PGJPAJSONPersistenceContext extends JPAJSONPersistenceContext {
 
     @ConditionalOnMissingBean(name = "pgJPAJSONAnyDAO")
     @Bean
-    @Autowired
     public JPAJSONAnyDAO anyDAO(final @Lazy PlainSchemaDAO plainSchemaDAO) {
         return new PGJPAJSONAnyDAO(plainSchemaDAO);
     }
 
     @ConditionalOnMissingBean(name = "pgJPAJSONAnySearchDAO")
     @Bean
-    @Autowired
     public AnySearchDAO anySearchDAO(
             final @Lazy RealmDAO realmDAO,
             final @Lazy DynRealmDAO dynRealmDAO,
@@ -90,7 +87,6 @@ public class PGJPAJSONPersistenceContext extends JPAJSONPersistenceContext {
 
     @ConditionalOnMissingBean(name = "pgJPAJSONPlainSchemaDAO")
     @Bean
-    @Autowired
     public PlainSchemaDAO plainSchemaDAO(
             final AnyUtilsFactory anyUtilsFactory,
             final @Lazy PlainAttrDAO plainAttrDAO,
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/MasterDomain.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/MasterDomain.java
index 0049087..17593f9 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/MasterDomain.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/MasterDomain.java
@@ -29,7 +29,7 @@ import javax.sql.DataSource;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.core.persistence.jpa.spring.CommonEntityManagerFactoryConf;
 import org.apache.syncope.core.persistence.jpa.spring.DomainEntityManagerFactoryBean;
-import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.context.annotation.Bean;
@@ -45,21 +45,12 @@ import org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter;
 import org.springframework.transaction.PlatformTransactionManager;
 
 @EnableConfigurationProperties(PersistenceProperties.class)
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class MasterDomain {
 
-    @Autowired
-    private CommonEntityManagerFactoryConf commonEMFConf;
-
-    @Autowired
-    private ResourceLoader resourceLoader;
-
-    @Autowired
-    private PersistenceProperties props;
-
     @ConditionalOnMissingBean(name = "MasterDataSource")
     @Bean(name = "MasterDataSource")
-    public JndiObjectFactoryBean masterDataSource() {
+    public JndiObjectFactoryBean masterDataSource(final PersistenceProperties props) {
         HikariConfig hikariConfig = new HikariConfig();
         hikariConfig.setDriverClassName(props.getDomain().get(0).getJdbcDriver());
         hikariConfig.setJdbcUrl(props.getDomain().get(0).getJdbcURL());
@@ -77,7 +68,10 @@ public class MasterDomain {
 
     @ConditionalOnMissingBean(name = "MasterDataSourceInitializer")
     @Bean(name = "MasterDataSourceInitializer")
-    public DataSourceInitializer masterDataSourceInitializer() {
+    public DataSourceInitializer masterDataSourceInitializer(
+        final PersistenceProperties props,
+        @Qualifier("MasterDataSource")
+        final JndiObjectFactoryBean masterDataSource) {
         ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator();
         databasePopulator.setContinueOnError(true);
         databasePopulator.setIgnoreFailedDrops(true);
@@ -85,7 +79,7 @@ public class MasterDomain {
         databasePopulator.addScript(new ClassPathResource("/audit/" + props.getDomain().get(0).getAuditSql()));
 
         DataSourceInitializer dataSourceInitializer = new DataSourceInitializer();
-        dataSourceInitializer.setDataSource((DataSource) Objects.requireNonNull(masterDataSource().getObject()));
+        dataSourceInitializer.setDataSource((DataSource) Objects.requireNonNull(masterDataSource.getObject()));
         dataSourceInitializer.setEnabled(true);
         dataSourceInitializer.setDatabasePopulator(databasePopulator);
         return dataSourceInitializer;
@@ -94,7 +88,11 @@ public class MasterDomain {
     @ConditionalOnMissingBean(name = "MasterEntityManagerFactory")
     @DependsOn("commonEMFConf")
     @Bean(name = "MasterEntityManagerFactory")
-    public DomainEntityManagerFactoryBean masterEntityManagerFactory() {
+    public DomainEntityManagerFactoryBean masterEntityManagerFactory(
+        final PersistenceProperties props,
+        @Qualifier("MasterDataSource")
+        final JndiObjectFactoryBean masterDataSource,
+        final CommonEntityManagerFactoryConf commonEMFConf) {
         OpenJpaVendorAdapter vendorAdapter = new OpenJpaVendorAdapter();
         vendorAdapter.setShowSql(false);
         vendorAdapter.setGenerateDdl(true);
@@ -103,7 +101,7 @@ public class MasterDomain {
         DomainEntityManagerFactoryBean masterEntityManagerFactory = new DomainEntityManagerFactoryBean();
         masterEntityManagerFactory.setMappingResources(props.getDomain().get(0).getOrm());
         masterEntityManagerFactory.setPersistenceUnitName(SyncopeConstants.MASTER_DOMAIN);
-        masterEntityManagerFactory.setDataSource(Objects.requireNonNull((DataSource) masterDataSource().getObject()));
+        masterEntityManagerFactory.setDataSource(Objects.requireNonNull((DataSource) masterDataSource.getObject()));
         masterEntityManagerFactory.setJpaVendorAdapter(vendorAdapter);
         masterEntityManagerFactory.setCommonEntityManagerFactoryConf(commonEMFConf);
 
@@ -118,22 +116,26 @@ public class MasterDomain {
 
     @ConditionalOnMissingBean(name = "MasterTransactionManager")
     @Bean(name = { "MasterTransactionManager", "Master" })
-    public PlatformTransactionManager transactionManager() {
-        return new JpaTransactionManager(Objects.requireNonNull(masterEntityManagerFactory().getObject()));
+    public PlatformTransactionManager transactionManager(
+        @Qualifier("MasterEntityManagerFactory")
+        final DomainEntityManagerFactoryBean masterEntityManagerFactory) {
+        return new JpaTransactionManager(Objects.requireNonNull(masterEntityManagerFactory.getObject()));
     }
 
     @Bean(name = "MasterContentXML")
-    public InputStream masterContentXML() throws IOException {
+    public InputStream masterContentXML(final ResourceLoader resourceLoader,
+                                        final PersistenceProperties props) throws IOException {
         return resourceLoader.getResource(props.getDomain().get(0).getContent()).getInputStream();
     }
 
     @Bean(name = "MasterKeymasterConfParamsJSON")
-    public InputStream masterKeymasterConfParamsJSON() throws IOException {
+    public InputStream masterKeymasterConfParamsJSON(final ResourceLoader resourceLoader,
+                                                     final PersistenceProperties props) throws IOException {
         return resourceLoader.getResource(props.getDomain().get(0).getKeymasterConfParams()).getInputStream();
     }
 
     @Bean(name = "MasterDatabaseSchema")
-    public String masterDatabaseSchema() {
+    public String masterDatabaseSchema(final PersistenceProperties props) {
         return props.getDomain().get(0).getDbSchema();
     }
 }
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/PersistenceContext.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/PersistenceContext.java
index 21a5def..1385c89 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/PersistenceContext.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/PersistenceContext.java
@@ -134,7 +134,6 @@ import org.apache.syncope.core.persistence.jpa.spring.MultiJarAwarePersistenceUn
 import org.apache.syncope.core.spring.security.SecurityProperties;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
@@ -147,7 +146,7 @@ import org.springframework.core.io.ResourceLoader;
 import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
 
 @EnableConfigurationProperties(PersistenceProperties.class)
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class PersistenceContext {
 
     private static final Logger OPENJPA_LOG = LoggerFactory.getLogger("org.apache.openjpa");
@@ -157,21 +156,6 @@ public class PersistenceContext {
         return new DomainTransactionInterceptorInjector();
     }
 
-    @Autowired
-    private PersistenceProperties persistenceProperties;
-
-    @Autowired
-    private SecurityProperties securityProperties;
-
-    @Autowired
-    private ResourceLoader resourceLoader;
-
-    @Autowired
-    private ApplicationEventPublisher publisher;
-
-    @Autowired
-    private Environment env;
-
     @ConditionalOnMissingBean
     @Bean
     public SearchCondVisitor searchCondVisitor() {
@@ -185,7 +169,7 @@ public class PersistenceContext {
 
     @ConditionalOnMissingBean
     @Bean
-    public CommonEntityManagerFactoryConf commonEMFConf() {
+    public CommonEntityManagerFactoryConf commonEMFConf(final PersistenceProperties persistenceProperties) {
         CommonEntityManagerFactoryConf commonEMFConf = new CommonEntityManagerFactoryConf();
         commonEMFConf.setPackagesToScan("org.apache.syncope.core.persistence.jpa.entity");
         commonEMFConf.setValidationMode(ValidationMode.NONE);
@@ -218,7 +202,9 @@ public class PersistenceContext {
 
     @ConditionalOnMissingBean
     @Bean
-    public XMLContentLoader xmlContentLoader() {
+    public XMLContentLoader xmlContentLoader(final PersistenceProperties persistenceProperties,
+                                             final ResourceLoader resourceLoader,
+                                             final Environment env) {
         return new XMLContentLoader(
                 resourceLoader.getResource(persistenceProperties.getViewsXML()),
                 resourceLoader.getResource(persistenceProperties.getIndexesXML()),
@@ -227,27 +213,24 @@ public class PersistenceContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public XMLContentExporter xmlContentExporter(final DomainHolder domainHolder, final RealmDAO realmDAO) {
         return new XMLContentExporter(domainHolder, realmDAO);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public KeymasterConfParamLoader keymasterConfParamLoader(final ConfParamOps confParamOps) {
         return new KeymasterConfParamLoader(confParamOps);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    public DomainRegistry domainRegistry() {
+    public DomainRegistry domainRegistry(final Environment env) {
         return new DomainConfFactory(env);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public RuntimeDomainLoader runtimeDomainLoader(
             final DomainHolder domainHolder,
             final DomainRegistry domainRegistry) {
@@ -257,8 +240,9 @@ public class PersistenceContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public StartupDomainLoader startupDomainLoader(
+            final PersistenceProperties persistenceProperties,
+            final ResourceLoader resourceLoader,
             final DomainOps domainOps,
             final DomainHolder domainHolder,
             final DomainRegistry domainRegistry) {
@@ -274,7 +258,6 @@ public class PersistenceContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public AnyUtilsFactory anyUtilsFactory(
             final @Lazy UserDAO userDAO,
             final @Lazy GroupDAO groupDAO,
@@ -298,7 +281,6 @@ public class PersistenceContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public TaskUtilsFactory taskUtilsFactory(final @Lazy EntityFactory entityFactory) {
         return new JPATaskUtilsFactory(entityFactory);
     }
@@ -311,14 +293,12 @@ public class PersistenceContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public ApplicationDAO applicationDAO(final RoleDAO roleDAO, final @Lazy UserDAO userDAO) {
         return new JPAApplicationDAO(roleDAO, userDAO);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public AnyMatchDAO anyMatchDAO(
             final @Lazy UserDAO userDAO,
             final @Lazy GroupDAO groupDAO,
@@ -332,8 +312,8 @@ public class PersistenceContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public AnyObjectDAO anyObjectDAO(
+            final ApplicationEventPublisher publisher,
             final AnyUtilsFactory anyUtilsFactory,
             final @Lazy PlainSchemaDAO plainSchemaDAO,
             final @Lazy DerSchemaDAO derSchemaDAO,
@@ -353,7 +333,6 @@ public class PersistenceContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public AnySearchDAO anySearchDAO(
             final RealmDAO realmDAO,
             final @Lazy DynRealmDAO dynRealmDAO,
@@ -377,14 +356,12 @@ public class PersistenceContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public AnyTypeDAO anyTypeDAO(final RemediationDAO remediationDAO) {
         return new JPAAnyTypeDAO(remediationDAO);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public AnyTypeClassDAO anyTypeClassDAO(
             final AnyTypeDAO anyTypeDAO,
             final PlainSchemaDAO plainSchemaDAO,
@@ -428,7 +405,6 @@ public class PersistenceContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public ConnInstanceDAO connInstanceDAO(final @Lazy ExternalResourceDAO resourceDAO) {
         return new JPAConnInstanceDAO(resourceDAO);
     }
@@ -441,15 +417,14 @@ public class PersistenceContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public DerSchemaDAO derSchemaDAO(final @Lazy ExternalResourceDAO resourceDAO) {
         return new JPADerSchemaDAO(resourceDAO);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public DynRealmDAO dynRealmDAO(
+            final ApplicationEventPublisher publisher,
             final @Lazy UserDAO userDAO,
             final @Lazy GroupDAO groupDAO,
             final @Lazy AnyObjectDAO anyObjectDAO,
@@ -469,8 +444,8 @@ public class PersistenceContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public GroupDAO groupDAO(
+            final ApplicationEventPublisher publisher,
             final AnyUtilsFactory anyUtilsFactory,
             final @Lazy PlainSchemaDAO plainSchemaDAO,
             final @Lazy DerSchemaDAO derSchemaDAO,
@@ -510,7 +485,6 @@ public class PersistenceContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public NotificationDAO notificationDAO(final TaskDAO taskDAO) {
         return new JPANotificationDAO(taskDAO);
     }
@@ -541,7 +515,6 @@ public class PersistenceContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public PlainSchemaDAO plainSchemaDAO(
             final AnyUtilsFactory anyUtilsFactory,
             final PlainAttrDAO plainAttrDAO,
@@ -552,7 +525,6 @@ public class PersistenceContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public PolicyDAO policyDAO(
             final @Lazy RealmDAO realmDAO,
             final @Lazy ExternalResourceDAO resourceDAO) {
@@ -562,7 +534,6 @@ public class PersistenceContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public RealmDAO realmDAO(final @Lazy RoleDAO roleDAO) {
         return new JPARealmDAO(roleDAO);
     }
@@ -599,7 +570,6 @@ public class PersistenceContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public ExternalResourceDAO resourceDAO(
             final TaskDAO taskDAO,
             final AnyObjectDAO anyObjectDAO,
@@ -614,8 +584,8 @@ public class PersistenceContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public RoleDAO roleDAO(
+            final ApplicationEventPublisher publisher,
             final @Lazy AnyMatchDAO anyMatchDAO,
             final @Lazy AnySearchDAO anySearchDAO,
             final DelegationDAO delegationDAO,
@@ -644,7 +614,6 @@ public class PersistenceContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public SecurityQuestionDAO securityQuestionDAO(final UserDAO userDAO) {
         return new JPASecurityQuestionDAO(userDAO);
     }
@@ -657,22 +626,21 @@ public class PersistenceContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public TaskDAO taskDAO(final RemediationDAO remediationDAO) {
         return new JPATaskDAO(remediationDAO);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public TaskExecDAO taskExecDAO(final TaskDAO taskDAO) {
         return new JPATaskExecDAO(taskDAO);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public UserDAO userDAO(
+            final ApplicationEventPublisher publisher,
+            final SecurityProperties securityProperties,
             final AnyUtilsFactory anyUtilsFactory,
             final @Lazy PlainSchemaDAO plainSchemaDAO,
             final @Lazy DerSchemaDAO derSchemaDAO,
@@ -699,7 +667,6 @@ public class PersistenceContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public VirSchemaDAO virSchemaDAO(final @Lazy ExternalResourceDAO resourceDAO) {
         return new JPAVirSchemaDAO(resourceDAO);
     }
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/PersistenceTestContext.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/PersistenceTestContext.java
index cc2f282..c7048c7 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/PersistenceTestContext.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/PersistenceTestContext.java
@@ -30,7 +30,6 @@ import org.apache.syncope.core.provisioning.api.ConnectorManager;
 import org.apache.syncope.core.spring.security.DefaultPasswordGenerator;
 import org.apache.syncope.core.spring.security.PasswordGenerator;
 import org.apache.syncope.core.spring.security.SecurityProperties;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.context.annotation.Bean;
@@ -41,7 +40,7 @@ import org.springframework.core.io.DefaultResourceLoader;
 import org.springframework.core.io.Resource;
 
 @Import(PersistenceContext.class)
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class PersistenceTestContext {
 
     @Bean
@@ -76,7 +75,6 @@ public class PersistenceTestContext {
     }
 
     @Bean
-    @Autowired
     public TestInitializer testInitializer(
             final StartupDomainLoader domainLoader,
             final DomainHolder domainHolder,
@@ -107,7 +105,6 @@ public class PersistenceTestContext {
     }
 
     @Bean
-    @Autowired
     public DomainOps domainOps(final DomainRegistry domainRegistry) {
         return new DummyDomainOps(domainRegistry);
     }
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ProvisioningContext.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ProvisioningContext.java
index 96ab095..c3f267b 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ProvisioningContext.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ProvisioningContext.java
@@ -18,7 +18,6 @@
  */
 package org.apache.syncope.core.provisioning.java;
 
-import com.fasterxml.jackson.core.JsonProcessingException;
 import java.io.IOException;
 import java.io.PrintStream;
 import java.nio.charset.StandardCharsets;
@@ -179,7 +178,7 @@ import org.apache.syncope.core.workflow.api.GroupWorkflowAdapter;
 import org.apache.syncope.core.workflow.api.UserWorkflowAdapter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.context.ApplicationContext;
@@ -201,8 +200,8 @@ import org.springframework.transaction.PlatformTransactionManager;
 
 @EnableAsync
 @EnableConfigurationProperties(ProvisioningProperties.class)
-@Configuration
-public class ProvisioningContext implements AsyncConfigurer {
+@Configuration(proxyBeanMethods = false)
+public class ProvisioningContext {
 
     private static final Logger LOG = LoggerFactory.getLogger(ProvisioningContext.class);
 
@@ -212,33 +211,6 @@ public class ProvisioningContext implements AsyncConfigurer {
     @Resource(name = "MasterTransactionManager")
     private PlatformTransactionManager masterTransactionManager;
 
-    @Autowired
-    private ProvisioningProperties provisioningProperties;
-
-    @Autowired
-    private SecurityProperties securityProperties;
-
-    @Autowired
-    private EntityFactory entityFactory;
-
-    @Autowired
-    private AnyUtilsFactory anyUtilsFactory;
-
-    @Autowired
-    private TaskUtilsFactory taskUtilsFactory;
-
-    @Autowired
-    private PasswordGenerator passwordGenerator;
-
-    @Autowired
-    private SearchCondVisitor searchCondVisitor;
-
-    @Autowired
-    private DomainHolder domainHolder;
-
-    @Autowired
-    private ApplicationContext ctx;
-
     @ConditionalOnMissingBean
     @Bean
     public AsyncConnectorFacade asyncConnectorFacade() {
@@ -252,7 +224,7 @@ public class ProvisioningContext implements AsyncConfigurer {
      */
     @Bean
     @Primary
-    public Executor asyncConnectorFacadeExecutor() {
+    public ThreadPoolTaskExecutor asyncConnectorFacadeExecutor(final ProvisioningProperties provisioningProperties) {
         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
         executor.setCorePoolSize(provisioningProperties.getAsyncConnectorFacadeExecutor().getCorePoolSize());
         executor.setMaxPoolSize(provisioningProperties.getAsyncConnectorFacadeExecutor().getMaxPoolSize());
@@ -263,18 +235,26 @@ public class ProvisioningContext implements AsyncConfigurer {
         return executor;
     }
 
-    @Override
-    public Executor getAsyncExecutor() {
-        return asyncConnectorFacadeExecutor();
+    @Bean
+    public AsyncConfigurer asyncConfigurer(@Qualifier("asyncConnectorFacadeExecutor")
+                                           final ThreadPoolTaskExecutor asyncConnectorFacadeExecutor) {
+        return new AsyncConfigurer() {
+            @Override
+            public Executor getAsyncExecutor() {
+                return asyncConnectorFacadeExecutor;
+            }
+        };
     }
 
     /**
      * Used by {@link org.apache.syncope.core.provisioning.java.propagation.PriorityPropagationTaskExecutor}.
      *
-     * @return executor
+     * @param provisioningProperties the provisioning properties
+     * @return executor thread pool task executor
      */
     @Bean
-    public ThreadPoolTaskExecutor propagationTaskExecutorAsyncExecutor() {
+    public ThreadPoolTaskExecutor propagationTaskExecutorAsyncExecutor(
+        final ProvisioningProperties provisioningProperties) {
         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
         executor.setCorePoolSize(provisioningProperties.getPropagationTaskExecutorAsyncExecutor().getCorePoolSize());
         executor.setMaxPoolSize(provisioningProperties.getPropagationTaskExecutorAsyncExecutor().getMaxPoolSize());
@@ -286,7 +266,7 @@ public class ProvisioningContext implements AsyncConfigurer {
     }
 
     @Bean
-    public SchedulerDBInit quartzDataSourceInit() throws JsonProcessingException {
+    public SchedulerDBInit quartzDataSourceInit(final ProvisioningProperties provisioningProperties) {
         SchedulerDBInit init = new SchedulerDBInit();
         init.setDataSource(masterDataSource);
 
@@ -303,7 +283,8 @@ public class ProvisioningContext implements AsyncConfigurer {
     @DependsOn("quartzDataSourceInit")
     @Lazy(false)
     @Bean
-    public SchedulerFactoryBean scheduler() {
+    public SchedulerFactoryBean scheduler(final ApplicationContext ctx,
+                                          final ProvisioningProperties provisioningProperties) {
         SchedulerFactoryBean scheduler = new SchedulerFactoryBean();
         scheduler.setAutoStartup(true);
         scheduler.setApplicationContext(ctx);
@@ -334,14 +315,16 @@ public class ProvisioningContext implements AsyncConfigurer {
     }
 
     @Bean
-    public SchedulerShutdown schedulerShutdown() {
+    public SchedulerShutdown schedulerShutdown(final ApplicationContext ctx) {
         return new SchedulerShutdown(ctx);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public JobManager jobManager(
+            final ProvisioningProperties provisioningProperties,
+            final DomainHolder domainHolder,
+            final SecurityProperties securityProperties,
             final SchedulerFactoryBean scheduler,
             final TaskDAO taskDAO,
             final ReportDAO reportDAO,
@@ -362,7 +345,8 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    public JavaMailSender mailSender() throws IllegalArgumentException, NamingException, IOException {
+    public JavaMailSender mailSender(final ProvisioningProperties provisioningProperties)
+        throws IllegalArgumentException, IOException {
         JavaMailSenderImpl mailSender = new JavaMailSenderImpl() {
 
             @Override
@@ -431,8 +415,8 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public ConnectorManager connectorManager(
+            final EntityFactory entityFactory,
             final ConnIdBundleManager connIdBundleManager,
             final RealmDAO realmDAO,
             final ExternalResourceDAO resourceDAO,
@@ -450,15 +434,14 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public ConnectorLoader connectorLoader(final ConnectorManager connectorManager) {
         return new ConnectorLoader(connectorManager);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public InboundMatcher inboundMatcher(
+            final AnyUtilsFactory anyUtilsFactory,
             final UserDAO userDAO,
             final AnyObjectDAO anyObjectDAO,
             final GroupDAO groupDAO,
@@ -482,8 +465,8 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public OutboundMatcher outboundMatcher(
+            final AnyUtilsFactory anyUtilsFactory,
             final MappingManager mappingManager,
             final UserDAO userDAO,
             final VirSchemaDAO virSchemaDAO,
@@ -494,14 +477,14 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    public DerAttrHandler derAttrHandler() {
+    public DerAttrHandler derAttrHandler(final AnyUtilsFactory anyUtilsFactory) {
         return new DefaultDerAttrHandler(anyUtilsFactory);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public VirAttrHandler virAttrHandler(
+            final AnyUtilsFactory anyUtilsFactory,
             final ConnectorManager connectorManager,
             final VirAttrCache virAttrCache,
             @Lazy final OutboundMatcher outboundMatcher) {
@@ -511,8 +494,9 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public MappingManager mappingManager(
+            final PasswordGenerator passwordGenerator,
+            final AnyUtilsFactory anyUtilsFactory,
             final AnyTypeDAO anyTypeDAO,
             final UserDAO userDAO,
             final AnyObjectDAO anyObjectDAO,
@@ -543,15 +527,15 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public TemplateUtils templateUtils(final UserDAO userDAO, final GroupDAO groupDAO) {
         return new TemplateUtils(userDAO, groupDAO);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public ConnObjectUtils connObjectUtils(
+            final PasswordGenerator passwordGenerator,
+            final AnyUtilsFactory anyUtilsFactory,
             final MappingManager mappingManager,
             final TemplateUtils templateUtils,
             final RealmDAO realmDAO,
@@ -570,8 +554,9 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public PropagationManager propagationManager(
+            final EntityFactory entityFactory,
+            final AnyUtilsFactory anyUtilsFactory,
             final VirSchemaDAO virSchemaDAO,
             final ExternalResourceDAO resourceDAO,
             final ConnObjectUtils connObjectUtils,
@@ -590,14 +575,14 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    public ConnIdBundleManager connIdBundleManager() {
+    public ConnIdBundleManager connIdBundleManager(final ProvisioningProperties provisioningProperties) {
         return new DefaultConnIdBundleManager(provisioningProperties.getConnIdLocation());
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
-    public IntAttrNameParser intAttrNameParser(
+        public IntAttrNameParser intAttrNameParser(
+            final AnyUtilsFactory anyUtilsFactory,
             final PlainSchemaDAO plainSchemaDAO,
             final DerSchemaDAO derSchemaDAO,
             final VirSchemaDAO virSchemaDAO) {
@@ -607,8 +592,12 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public PropagationTaskExecutor propagationTaskExecutor(
+            @Qualifier("propagationTaskExecutorAsyncExecutor")
+            final ThreadPoolTaskExecutor propagationTaskExecutorAsyncExecutor,
+            final EntityFactory entityFactory,
+            final TaskUtilsFactory taskUtilsFactory,
+            final AnyUtilsFactory anyUtilsFactory,
             final ConnectorManager connectorManager,
             final ConnObjectUtils connObjectUtils,
             final UserDAO userDAO,
@@ -636,12 +625,11 @@ public class ProvisioningContext implements AsyncConfigurer {
                 taskUtilsFactory,
                 entityFactory,
                 outboundMatcher,
-                propagationTaskExecutorAsyncExecutor());
+                propagationTaskExecutorAsyncExecutor);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public UserProvisioningManager userProvisioningManager(
             final UserWorkflowAdapter uwfAdapter,
             final PropagationManager propagationManager,
@@ -659,7 +647,6 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public GroupProvisioningManager groupProvisioningManager(
             final GroupWorkflowAdapter gwfAdapter,
             final PropagationManager propagationManager,
@@ -679,7 +666,6 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public AnyObjectProvisioningManager anyObjectProvisioningManager(
             final AnyObjectWorkflowAdapter awfAdapter,
             final PropagationManager propagationManager,
@@ -697,7 +683,7 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    public VirAttrCache virAttrCache() {
+    public VirAttrCache virAttrCache(final ProvisioningProperties provisioningProperties) {
         VirAttrCache virAttrCache = new CaffeineVirAttrCache();
         virAttrCache.setCacheSpec(provisioningProperties.getVirAttrCacheSpec());
         return virAttrCache;
@@ -705,8 +691,9 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public NotificationManager notificationManager(
+            final EntityFactory entityFactory,
+            final SearchCondVisitor searchCondVisitor,
             final DerSchemaDAO derSchemaDAO,
             final VirSchemaDAO virSchemaDAO,
             final NotificationDAO notificationDAO,
@@ -747,21 +734,20 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public AuditManager auditManager(final AuditConfDAO auditConfDAO) {
         return new DefaultAuditManager(auditConfDAO);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    public SystemLoadReporterJob systemLoadReporterJob() {
+    public SystemLoadReporterJob systemLoadReporterJob(final ApplicationContext ctx) {
         return new SystemLoadReporterJob(ctx);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public NotificationJobDelegate notificationJobDelegate(
+            final EntityFactory entityFactory,
             final TaskDAO taskDAO,
             final JavaMailSender mailSender,
             final AuditManager auditManager,
@@ -777,22 +763,24 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
-    public NotificationJob notificationJob(final NotificationJobDelegate delegate) {
+    public NotificationJob notificationJob(final NotificationJobDelegate delegate,
+                                           final DomainHolder domainHolder,
+                                           final SecurityProperties securityProperties) {
         return new NotificationJob(securityProperties, domainHolder, delegate);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
-    public ReportJobDelegate reportJobDelegate(final ReportDAO reportDAO, final ReportExecDAO reportExecDAO) {
+    public ReportJobDelegate reportJobDelegate(final ReportDAO reportDAO, final ReportExecDAO reportExecDAO,
+                                               final EntityFactory entityFactory) {
         return new DefaultReportJobDelegate(reportDAO, reportExecDAO, entityFactory);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public AccessTokenDataBinder accessTokenDataBinder(
+            final EntityFactory entityFactory,
+            final SecurityProperties securityProperties,
             final AccessTokenJWSSigner jwsSigner,
             final AccessTokenDAO accessTokenDAO,
             final ConfParamOps confParamOps,
@@ -809,8 +797,9 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public AnyObjectDataBinder anyObjectDataBinder(
+            final EntityFactory entityFactory,
+            final AnyUtilsFactory anyUtilsFactory,
             final AnyTypeDAO anyTypeDAO,
             final RealmDAO realmDAO,
             final AnyTypeClassDAO anyTypeClassDAO,
@@ -851,8 +840,8 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public AnyTypeClassDataBinder anyTypeClassDataBinder(
+            final EntityFactory entityFactory,
             final PlainSchemaDAO plainSchemaDAO,
             final DerSchemaDAO derSchemaDAO,
             final VirSchemaDAO virSchemaDAO,
@@ -863,8 +852,9 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public AnyTypeDataBinder anyTypeDataBinder(
+            final EntityFactory entityFactory,
+            final SecurityProperties securityProperties,
             final AnyTypeDAO anyTypeDAO,
             final AnyTypeClassDAO anyTypeClassDAO,
             final AccessTokenDAO accessTokenDAO) {
@@ -879,8 +869,8 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
-    public ApplicationDataBinder applicationDataBinder(final ApplicationDAO applicationDAO) {
+    public ApplicationDataBinder applicationDataBinder(final ApplicationDAO applicationDAO,
+                                                       final EntityFactory entityFactory) {
         return new ApplicationDataBinderImpl(applicationDAO, entityFactory);
     }
 
@@ -892,27 +882,27 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    public AuthModuleDataBinder authModuleDataBinder() {
+    public AuthModuleDataBinder authModuleDataBinder(final EntityFactory entityFactory) {
         return new AuthModuleDataBinderImpl(entityFactory);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    public AuthProfileDataBinder authProfileDataBinder() {
+    public AuthProfileDataBinder authProfileDataBinder(final EntityFactory entityFactory) {
         return new AuthProfileDataBinderImpl(entityFactory);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
-    public ClientAppDataBinder clientAppDataBinder(final PolicyDAO policyDAO) {
+    public ClientAppDataBinder clientAppDataBinder(final PolicyDAO policyDAO,
+                                                   final EntityFactory entityFactory) {
         return new ClientAppDataBinderImpl(policyDAO, entityFactory);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public ConnInstanceDataBinder connInstanceDataBinder(
+            final EntityFactory entityFactory,
             final ConnIdBundleManager connIdBundleManager,
             final ConnInstanceDAO connInstanceDAO,
             final RealmDAO realmDAO) {
@@ -922,22 +912,25 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
-    public DelegationDataBinder delegationDataBinder(final UserDAO userDAO, final RoleDAO roleDAO) {
+    public DelegationDataBinder delegationDataBinder(final UserDAO userDAO, final RoleDAO roleDAO,
+                                                     final EntityFactory entityFactory) {
         return new DelegationDataBinderImpl(userDAO, roleDAO, entityFactory);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
-    public DynRealmDataBinder dynRealmDataBinder(final AnyTypeDAO anyTypeDAO, final DynRealmDAO dynRealmDAO) {
+    public DynRealmDataBinder dynRealmDataBinder(final AnyTypeDAO anyTypeDAO, final DynRealmDAO dynRealmDAO,
+                                                 final SearchCondVisitor searchCondVisitor,
+                                                 final EntityFactory entityFactory) {
         return new DynRealmDataBinderImpl(anyTypeDAO, dynRealmDAO, entityFactory, searchCondVisitor);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public GroupDataBinder groupDataBinder(
+            final EntityFactory entityFactory,
+            final SearchCondVisitor searchCondVisitor,
+            final AnyUtilsFactory anyUtilsFactory,
             final AnyTypeDAO anyTypeDAO,
             final RealmDAO realmDAO,
             final AnyTypeClassDAO anyTypeClassDAO,
@@ -979,14 +972,14 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    public ImplementationDataBinder implementationDataBinder() {
+    public ImplementationDataBinder implementationDataBinder(final EntityFactory entityFactory) {
         return new ImplementationDataBinderImpl(entityFactory);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public NotificationDataBinder notificationDataBinder(
+            final EntityFactory entityFactory,
             final MailTemplateDAO mailTemplateDAO,
             final AnyTypeDAO anyTypeDAO,
             final ImplementationDAO implementationDAO,
@@ -1003,14 +996,14 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    public OIDCJWKSDataBinder oidcJWKSDataBinder() {
+    public OIDCJWKSDataBinder oidcJWKSDataBinder(final EntityFactory entityFactory) {
         return new OIDCJWKSDataBinderImpl(entityFactory);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public PolicyDataBinder policyDataBinder(
+            final EntityFactory entityFactory,
             final ExternalResourceDAO resourceDAO,
             final RealmDAO realmDAO,
             final AnyTypeDAO anyTypeDAO,
@@ -1021,8 +1014,8 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public RealmDataBinder realmDataBinder(
+            final EntityFactory entityFactory,
             final AnyTypeDAO anyTypeDAO,
             final ImplementationDAO implementationDAO,
             final RealmDAO realmDAO,
@@ -1040,7 +1033,7 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    public RelationshipTypeDataBinder relationshipTypeDataBinder() {
+    public RelationshipTypeDataBinder relationshipTypeDataBinder(final EntityFactory entityFactory) {
         return new RelationshipTypeDataBinderImpl(entityFactory);
     }
 
@@ -1052,7 +1045,6 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public ReportDataBinder reportDataBinder(
             final ReportTemplateDAO reportTemplateDAO,
             final ReportExecDAO reportExecDAO,
@@ -1064,8 +1056,8 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public ResourceDataBinder resourceDataBinder(
+            final EntityFactory entityFactory,
             final AnyTypeDAO anyTypeDAO,
             final ConnInstanceDAO connInstanceDAO,
             final PolicyDAO policyDAO,
@@ -1089,8 +1081,9 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public RoleDataBinder roleDataBinder(
+            final EntityFactory entityFactory,
+            final SearchCondVisitor searchCondVisitor,
             final RealmDAO realmDAO,
             final DynRealmDAO dynRealmDAO,
             final RoleDAO roleDAO,
@@ -1101,13 +1094,13 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    public SAML2IdPEntityDataBinder saml2IdPEntityDataBinder() {
+    public SAML2IdPEntityDataBinder saml2IdPEntityDataBinder(final EntityFactory entityFactory) {
         return new SAML2IdPEntityDataBinderImpl(entityFactory);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    public SAML2SPEntityDataBinder saml2SPEntityDataBinder() {
+    public SAML2SPEntityDataBinder saml2SPEntityDataBinder(final EntityFactory entityFactory) {
         return new SAML2SPEntityDataBinderImpl(entityFactory);
     }
 
@@ -1119,8 +1112,9 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public SchemaDataBinder schemaDataBinder(
+            final EntityFactory entityFactory,
+            final AnyUtilsFactory anyUtilsFactory,
             final AnyTypeClassDAO anyTypeClassDAO,
             final PlainSchemaDAO plainSchemaDAO,
             final DerSchemaDAO derSchemaDAO,
@@ -1143,14 +1137,15 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    public SecurityQuestionDataBinder securityQuestionDataBinder() {
+    public SecurityQuestionDataBinder securityQuestionDataBinder(final EntityFactory entityFactory) {
         return new SecurityQuestionDataBinderImpl(entityFactory);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public TaskDataBinder taskDataBinder(
+            final EntityFactory entityFactory,
+            final TaskUtilsFactory taskUtilsFactory,
             final RealmDAO realmDAO,
             final ExternalResourceDAO resourceDAO,
             final TaskExecDAO taskExecDAO,
@@ -1171,8 +1166,10 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public UserDataBinder userDataBinder(
+            final EntityFactory entityFactory,
+            final AnyUtilsFactory anyUtilsFactory,
+            final SecurityProperties securityProperties,
             final AnyTypeDAO anyTypeDAO,
             final RealmDAO realmDAO,
             final AnyTypeClassDAO anyTypeClassDAO,
@@ -1226,14 +1223,13 @@ public class ProvisioningContext implements AsyncConfigurer {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
-    public WAConfigDataBinder waConfigDataBinder(final WAConfigDAO waConfigDAO) {
+    public WAConfigDataBinder waConfigDataBinder(final WAConfigDAO waConfigDAO,
+                                                 final EntityFactory entityFactory) {
         return new WAConfigDataBinderImpl(waConfigDAO, entityFactory);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public WAClientAppDataBinder waClientAppDataBinder(
             final ClientAppDataBinder clientAppDataBinder,
             final PolicyDataBinder policyDataBinder,
diff --git a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ProvisioningTestContext.java b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ProvisioningTestContext.java
index 45c35fd..5794382 100644
--- a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ProvisioningTestContext.java
+++ b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ProvisioningTestContext.java
@@ -29,7 +29,6 @@ import org.apache.syncope.core.persistence.jpa.PersistenceContext;
 import org.apache.syncope.core.persistence.jpa.StartupDomainLoader;
 import org.apache.syncope.core.spring.security.SecurityContext;
 import org.apache.syncope.core.workflow.java.WorkflowContext;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
@@ -39,11 +38,10 @@ import org.springframework.context.annotation.PropertySource;
 @PropertySource("classpath:core-test.properties")
 @Import({ ProvisioningContext.class, SecurityContext.class,
     PersistenceContext.class, MasterDomain.class, WorkflowContext.class })
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class ProvisioningTestContext {
 
     @Bean
-    @Autowired
     public TestInitializer testInitializer(
             final StartupDomainLoader domainLoader,
             final DomainHolder domainHolder,
@@ -64,7 +62,6 @@ public class ProvisioningTestContext {
     }
 
     @Bean
-    @Autowired
     public DomainOps domainOps(final DomainRegistry domainRegistry) {
         return new DummyDomainOps(domainRegistry);
     }
diff --git a/core/self-keymaster-starter/src/main/java/org/apache/syncope/core/starter/SelfKeymasterContext.java b/core/self-keymaster-starter/src/main/java/org/apache/syncope/core/starter/SelfKeymasterContext.java
index c9df1b9..fcdb84c 100644
--- a/core/self-keymaster-starter/src/main/java/org/apache/syncope/core/starter/SelfKeymasterContext.java
+++ b/core/self-keymaster-starter/src/main/java/org/apache/syncope/core/starter/SelfKeymasterContext.java
@@ -61,7 +61,6 @@ import org.apache.syncope.core.spring.security.DefaultCredentialChecker;
 import org.apache.syncope.core.spring.security.SecurityProperties;
 import org.apache.syncope.core.spring.security.UsernamePasswordAuthenticationProvider;
 import org.apache.syncope.core.spring.security.WebSecurityContext;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.AutoConfigureBefore;
 import org.springframework.boot.autoconfigure.condition.ConditionOutcome;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -75,7 +74,7 @@ import org.springframework.context.annotation.Configuration;
 import org.springframework.core.type.AnnotatedTypeMetadata;
 
 @EnableConfigurationProperties(KeymasterProperties.class)
-@Configuration
+@Configuration(proxyBeanMethods = false)
 @AutoConfigureBefore(WebSecurityContext.class)
 public class SelfKeymasterContext {
 
@@ -92,16 +91,11 @@ public class SelfKeymasterContext {
         }
     }
 
-    @Autowired
-    private Bus bus;
-
-    @Autowired
-    private ApplicationContext ctx;
-
     @Conditional(SelfKeymasterCondition.class)
     @Bean
-    @Autowired
-    public Server selfKeymasterContainer(final JacksonJsonProvider jsonProvider) {
+    public Server selfKeymasterContainer(final JacksonJsonProvider jsonProvider,
+                                         final ApplicationContext ctx,
+                                         final Bus bus) {
         SpringJAXRSServerFactoryBean selfKeymasterContainer = new SpringJAXRSServerFactoryBean();
         selfKeymasterContainer.setBus(bus);
         selfKeymasterContainer.setAddress("/keymaster");
@@ -128,7 +122,6 @@ public class SelfKeymasterContext {
 
     @Conditional(SelfKeymasterCondition.class)
     @Bean
-    @Autowired
     public UsernamePasswordAuthenticationProvider usernamePasswordAuthenticationProvider(
             final DomainOps domainOps,
             final AuthDataAccessor dataAccessor,
@@ -148,14 +141,12 @@ public class SelfKeymasterContext {
 
     @Conditional(SelfKeymasterCondition.class)
     @Bean
-    @Autowired
     public ConfParamOps internalConfParamOps(final ConfParamLogic confParamLogic, final KeymasterProperties props) {
         return new SelfKeymasterInternalConfParamOps(confParamLogic, props);
     }
 
     @Conditional(SelfKeymasterCondition.class)
     @Bean
-    @Autowired
     public ServiceOps internalServiceOps(
             final NetworkServiceLogic networkServiceLogic,
             final KeymasterProperties props) {
@@ -165,14 +156,12 @@ public class SelfKeymasterContext {
 
     @Conditional(SelfKeymasterCondition.class)
     @Bean
-    @Autowired
     public DomainOps domainOps(final DomainLogic domainLogic, final KeymasterProperties props) {
         return new SelfKeymasterInternalDomainOps(domainLogic, props);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public ConfParamLogic confParamLogic(
             final ConfParamDAO confParamDAO,
             final SelfKeymasterEntityFactory selfKeymasterEntityFactory) {
@@ -182,7 +171,6 @@ public class SelfKeymasterContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public DomainLogic domainLogic(
             final DomainDAO domainDAO,
             final SelfKeymasterEntityFactory selfKeymasterEntityFactory,
@@ -193,7 +181,6 @@ public class SelfKeymasterContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public NetworkServiceLogic networkServiceLogic(
             final NetworkServiceDAO serviceDAO,
             final SelfKeymasterEntityFactory selfKeymasterEntityFactory) {
@@ -227,21 +214,18 @@ public class SelfKeymasterContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public ConfParamService confParamService(final ConfParamLogic confParamLogic) {
         return new ConfParamServiceImpl(confParamLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public DomainService domainService(final DomainLogic domainLogic) {
         return new DomainServiceImpl(domainLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public NetworkServiceService networkServiceService(final NetworkServiceLogic networkServiceLogic) {
         return new NetworkServiceServiceImpl(networkServiceLogic);
     }
diff --git a/core/spring/src/main/java/org/apache/syncope/core/spring/security/AuthContextUtils.java b/core/spring/src/main/java/org/apache/syncope/core/spring/security/AuthContextUtils.java
index e9d6659..f489e96 100644
--- a/core/spring/src/main/java/org/apache/syncope/core/spring/security/AuthContextUtils.java
+++ b/core/spring/src/main/java/org/apache/syncope/core/spring/security/AuthContextUtils.java
@@ -143,9 +143,10 @@ public final class AuthContextUtils {
     }
 
     public static <T> T callAsAdmin(final String domain, final Callable<T> callable) {
+        SecurityProperties properties = ApplicationContextProvider.getBeanFactory().getBean(SecurityProperties.class);
         return callAs(
                 domain,
-                ApplicationContextProvider.getBeanFactory().getBean("adminUser", String.class),
+                properties.getAdminUser(),
                 EntitlementsHolder.getInstance().getValues(),
                 callable);
     }
diff --git a/core/spring/src/main/java/org/apache/syncope/core/spring/security/SecurityContext.java b/core/spring/src/main/java/org/apache/syncope/core/spring/security/SecurityContext.java
index fbde018..56f0244 100644
--- a/core/spring/src/main/java/org/apache/syncope/core/spring/security/SecurityContext.java
+++ b/core/spring/src/main/java/org/apache/syncope/core/spring/security/SecurityContext.java
@@ -29,7 +29,6 @@ import org.apache.syncope.core.spring.security.jws.AccessTokenJWSSigner;
 import org.apache.syncope.core.spring.security.jws.AccessTokenJWSVerifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.context.annotation.Bean;
@@ -37,57 +36,27 @@ import org.springframework.context.annotation.Configuration;
 import org.springframework.security.config.core.GrantedAuthorityDefaults;
 
 @EnableConfigurationProperties(SecurityProperties.class)
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class SecurityContext {
 
     private static final Logger LOG = LoggerFactory.getLogger(SecurityContext.class);
 
-    @Autowired
-    private SecurityProperties props;
-
     @Bean
-    public String adminUser() {
-        return props.getAdminUser();
-    }
-
-    @Bean
-    public String adminPassword() {
-        return props.getAdminPassword();
-    }
-
-    @Bean
-    public CipherAlgorithm adminPasswordAlgorithm() {
+    public CipherAlgorithm adminPasswordAlgorithm(final SecurityProperties props) {
         return props.getAdminPasswordAlgorithm();
     }
 
     @Bean
-    public String anonymousUser() {
-        return props.getAnonymousUser();
-    }
-
-    @Bean
-    public String anonymousKey() {
-        return props.getAnonymousKey();
-    }
-
-    @Bean
-    public String jwtIssuer() {
-        return props.getJwtIssuer();
-    }
-
-    @Bean
-    public JWSAlgorithm jwsAlgorithm() {
+    public JWSAlgorithm jwsAlgorithm(final SecurityProperties props) {
         return JWSAlgorithm.parse(props.getJwsAlgorithm().toUpperCase());
     }
 
-    @Bean
-    public String jwsKey() {
+    private static String jwsKey(final JWSAlgorithm jwsAlgorithm, final SecurityProperties props) {
         String jwsKey = props.getJwsKey();
         if (jwsKey == null) {
             throw new IllegalArgumentException("No JWS key provided");
         }
 
-        JWSAlgorithm jwsAlgorithm = jwsAlgorithm();
         if (JWSAlgorithm.Family.HMAC_SHA.contains(jwsAlgorithm)) {
             int minLength = jwsAlgorithm.equals(JWSAlgorithm.HS256)
                     ? 256 / 8
@@ -107,24 +76,28 @@ public class SecurityContext {
 
     @ConditionalOnMissingBean
     @Bean
-    public DefaultCredentialChecker credentialChecker() {
-        return new DefaultCredentialChecker(jwsKey(), adminPassword(), anonymousKey());
+    public DefaultCredentialChecker credentialChecker(final SecurityProperties props,
+                                                      final JWSAlgorithm jwsAlgorithm) {
+        return new DefaultCredentialChecker(jwsKey(jwsAlgorithm, props),
+            props.getAdminPassword(), props.getAnonymousKey());
     }
 
     @ConditionalOnMissingBean
     @Bean
-    public AccessTokenJWSVerifier accessTokenJWSVerifier()
+    public AccessTokenJWSVerifier accessTokenJWSVerifier(final JWSAlgorithm jwsAlgorithm,
+                                                         final SecurityProperties props)
             throws JOSEException, NoSuchAlgorithmException, InvalidKeySpecException {
 
-        return new AccessTokenJWSVerifier(jwsAlgorithm(), jwsKey());
+        return new AccessTokenJWSVerifier(jwsAlgorithm, jwsKey(jwsAlgorithm, props));
     }
 
     @ConditionalOnMissingBean
     @Bean
-    public AccessTokenJWSSigner accessTokenJWSSigner()
+    public AccessTokenJWSSigner accessTokenJWSSigner(final JWSAlgorithm jwsAlgorithm,
+                                                     final SecurityProperties props)
             throws KeyLengthException, NoSuchAlgorithmException, InvalidKeySpecException {
 
-        return new AccessTokenJWSSigner(jwsAlgorithm(), jwsKey());
+        return new AccessTokenJWSSigner(jwsAlgorithm, jwsKey(jwsAlgorithm, props));
     }
 
     @ConditionalOnMissingBean
diff --git a/core/spring/src/main/java/org/apache/syncope/core/spring/security/WebSecurityContext.java b/core/spring/src/main/java/org/apache/syncope/core/spring/security/WebSecurityContext.java
index 4613532..82aa27a 100644
--- a/core/spring/src/main/java/org/apache/syncope/core/spring/security/WebSecurityContext.java
+++ b/core/spring/src/main/java/org/apache/syncope/core/spring/security/WebSecurityContext.java
@@ -33,10 +33,10 @@ import org.apache.syncope.core.provisioning.api.AuditManager;
 import org.apache.syncope.core.provisioning.api.ConnectorManager;
 import org.apache.syncope.core.provisioning.api.MappingManager;
 import org.apache.syncope.core.provisioning.api.UserProvisioningManager;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
 import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
 import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
@@ -54,16 +54,10 @@ import org.springframework.security.web.firewall.HttpFirewall;
 
 @EnableWebSecurity
 @EnableGlobalMethodSecurity(prePostEnabled = true)
-public class WebSecurityContext extends WebSecurityConfigurerAdapter {
-
-    @Autowired
-    private SecurityProperties securityProperties;
-
-    @Autowired
-    private ApplicationContext ctx;
+@Configuration(proxyBeanMethods = false)
+public class WebSecurityContext {
 
     public WebSecurityContext() {
-        super(true);
         SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);
     }
 
@@ -74,15 +68,61 @@ public class WebSecurityContext extends WebSecurityConfigurerAdapter {
         return firewall;
     }
 
-    @Override
-    public void configure(final WebSecurity web) {
-        web.httpFirewall(allowUrlEncodedSlashHttpFirewall());
+    @Bean
+    public WebSecurityConfigurerAdapter webSecurityConfigurerAdapter(
+        final ApplicationContext ctx,
+        final SecurityProperties securityProperties,
+        final HttpFirewall allowUrlEncodedSlashHttpFirewall) {
+        return new WebSecurityConfigurerAdapter(true) {
+            @Override
+            public void configure(final WebSecurity web) {
+                web.httpFirewall(allowUrlEncodedSlashHttpFirewall);
+            }
+
+            @Override
+            protected void configure(final HttpSecurity http) throws Exception {
+                SyncopeBasicAuthenticationEntryPoint basicAuthenticationEntryPoint =
+                    new SyncopeBasicAuthenticationEntryPoint();
+                basicAuthenticationEntryPoint.setRealmName("Apache Syncope authentication");
+
+                SyncopeAuthenticationDetailsSource authenticationDetailsSource =
+                    new SyncopeAuthenticationDetailsSource();
+
+                JWTAuthenticationFilter jwtAuthenticationFilter = new JWTAuthenticationFilter(
+                    authenticationManager(),
+                    basicAuthenticationEntryPoint,
+                    authenticationDetailsSource,
+                    ctx.getBean(AuthDataAccessor.class),
+                    ctx.getBean(DefaultCredentialChecker.class));
+
+                http.authorizeRequests().
+                    antMatchers("/**").permitAll().and().
+                    sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().
+                    securityContext().securityContextRepository(new NullSecurityContextRepository()).and().
+                    anonymous().principal(securityProperties.getAnonymousUser()).and().
+                    httpBasic().authenticationEntryPoint(basicAuthenticationEntryPoint).
+                    authenticationDetailsSource(authenticationDetailsSource).and().
+                    exceptionHandling().accessDeniedHandler(accessDeniedHandler()).and().
+                    addFilterBefore(jwtAuthenticationFilter, BasicAuthenticationFilter.class).
+                    addFilterBefore(new MustChangePasswordFilter(), FilterSecurityInterceptor.class).
+                    headers().disable().
+                    csrf().disable();
+            }
+
+
+            @Override
+            protected void configure(final AuthenticationManagerBuilder builder) throws Exception {
+                builder.
+                    authenticationProvider(ctx.getBean(UsernamePasswordAuthenticationProvider.class)).
+                    authenticationProvider(ctx.getBean(JWTAuthenticationProvider.class));
+            }
+        };
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public UsernamePasswordAuthenticationProvider usernamePasswordAuthenticationProvider(
+            final SecurityProperties securityProperties,
             final DomainOps domainOps,
             final AuthDataAccessor dataAccessor,
             final UserProvisioningManager provisioningManager,
@@ -98,55 +138,19 @@ public class WebSecurityContext extends WebSecurityConfigurerAdapter {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public JWTAuthenticationProvider jwtAuthenticationProvider(final AuthDataAccessor authDataAccessor) {
         return new JWTAuthenticationProvider(authDataAccessor);
     }
 
-    @Override
-    protected void configure(final AuthenticationManagerBuilder builder) throws Exception {
-        builder.
-                authenticationProvider(ctx.getBean(UsernamePasswordAuthenticationProvider.class)).
-                authenticationProvider(ctx.getBean(JWTAuthenticationProvider.class));
-    }
-
     @Bean
     public AccessDeniedHandler accessDeniedHandler() {
         return new SyncopeAccessDeniedHandler();
     }
 
-    @Override
-    protected void configure(final HttpSecurity http) throws Exception {
-        SyncopeBasicAuthenticationEntryPoint basicAuthenticationEntryPoint = new SyncopeBasicAuthenticationEntryPoint();
-        basicAuthenticationEntryPoint.setRealmName("Apache Syncope authentication");
-
-        SyncopeAuthenticationDetailsSource authenticationDetailsSource = new SyncopeAuthenticationDetailsSource();
-
-        JWTAuthenticationFilter jwtAuthenticationFilter = new JWTAuthenticationFilter(
-                authenticationManager(),
-                basicAuthenticationEntryPoint,
-                authenticationDetailsSource,
-                ctx.getBean(AuthDataAccessor.class),
-                ctx.getBean(DefaultCredentialChecker.class));
-
-        http.authorizeRequests().
-                antMatchers("/**").permitAll().and().
-                sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().
-                securityContext().securityContextRepository(new NullSecurityContextRepository()).and().
-                anonymous().principal(securityProperties.getAnonymousUser()).and().
-                httpBasic().authenticationEntryPoint(basicAuthenticationEntryPoint).
-                authenticationDetailsSource(authenticationDetailsSource).and().
-                exceptionHandling().accessDeniedHandler(accessDeniedHandler()).and().
-                addFilterBefore(jwtAuthenticationFilter, BasicAuthenticationFilter.class).
-                addFilterBefore(new MustChangePasswordFilter(), FilterSecurityInterceptor.class).
-                headers().disable().
-                csrf().disable();
-    }
-
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public AuthDataAccessor authDataAccessor(
+            final SecurityProperties securityProperties,
             final RealmDAO realmDAO,
             final UserDAO userDAO,
             final GroupDAO groupDAO,
diff --git a/core/spring/src/test/java/org/apache/syncope/core/spring/SpringTestConfiguration.java b/core/spring/src/test/java/org/apache/syncope/core/spring/SpringTestConfiguration.java
index 6947097..5514eb6 100644
--- a/core/spring/src/test/java/org/apache/syncope/core/spring/SpringTestConfiguration.java
+++ b/core/spring/src/test/java/org/apache/syncope/core/spring/SpringTestConfiguration.java
@@ -24,7 +24,7 @@ import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Primary;
 
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class SpringTestConfiguration {
 
     @Bean
diff --git a/core/starter/src/main/java/org/apache/syncope/core/starter/SwaggerUIInitializer.java b/core/starter/src/main/java/org/apache/syncope/core/starter/SwaggerUIInitializer.java
index 732c644..faa387b 100644
--- a/core/starter/src/main/java/org/apache/syncope/core/starter/SwaggerUIInitializer.java
+++ b/core/starter/src/main/java/org/apache/syncope/core/starter/SwaggerUIInitializer.java
@@ -22,7 +22,7 @@ import org.springframework.context.annotation.Configuration;
 import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class SwaggerUIInitializer implements WebMvcConfigurer {
 
     @Override
diff --git a/core/starter/src/main/java/org/apache/syncope/core/starter/SyncopeCoreApplication.java b/core/starter/src/main/java/org/apache/syncope/core/starter/SyncopeCoreApplication.java
index 9e73688..3b2ff45 100644
--- a/core/starter/src/main/java/org/apache/syncope/core/starter/SyncopeCoreApplication.java
+++ b/core/starter/src/main/java/org/apache/syncope/core/starter/SyncopeCoreApplication.java
@@ -19,14 +19,53 @@
 package org.apache.syncope.core.starter;
 
 import java.util.Map;
+
 import org.apache.cxf.spring.boot.autoconfigure.openapi.OpenApiAutoConfiguration;
+import org.apache.syncope.common.keymaster.client.api.ConfParamOps;
+import org.apache.syncope.common.keymaster.client.api.ServiceOps;
 import org.apache.syncope.common.keymaster.client.api.model.NetworkService;
 import org.apache.syncope.common.keymaster.client.api.startstop.KeymasterStop;
+import org.apache.syncope.common.lib.info.SystemInfo;
+import org.apache.syncope.core.logic.LogicProperties;
 import org.apache.syncope.core.persistence.api.DomainHolder;
+import org.apache.syncope.core.persistence.api.ImplementationLookup;
+import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
+import org.apache.syncope.core.persistence.api.dao.AnySearchDAO;
+import org.apache.syncope.core.persistence.api.dao.AnyTypeClassDAO;
+import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
+import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
+import org.apache.syncope.core.persistence.api.dao.GroupDAO;
+import org.apache.syncope.core.persistence.api.dao.NotificationDAO;
+import org.apache.syncope.core.persistence.api.dao.PlainAttrDAO;
+import org.apache.syncope.core.persistence.api.dao.PlainAttrValueDAO;
+import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
+import org.apache.syncope.core.persistence.api.dao.PolicyDAO;
+import org.apache.syncope.core.persistence.api.dao.RoleDAO;
+import org.apache.syncope.core.persistence.api.dao.SecurityQuestionDAO;
+import org.apache.syncope.core.persistence.api.dao.TaskDAO;
+import org.apache.syncope.core.persistence.api.dao.UserDAO;
+import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO;
+import org.apache.syncope.core.persistence.api.entity.EntityFactory;
+import org.apache.syncope.core.persistence.jpa.PersistenceProperties;
+import org.apache.syncope.core.provisioning.api.AnyObjectProvisioningManager;
+import org.apache.syncope.core.provisioning.api.AuditManager;
+import org.apache.syncope.core.provisioning.api.ConnIdBundleManager;
+import org.apache.syncope.core.provisioning.api.GroupProvisioningManager;
+import org.apache.syncope.core.provisioning.api.UserProvisioningManager;
+import org.apache.syncope.core.provisioning.api.cache.VirAttrCache;
+import org.apache.syncope.core.provisioning.api.notification.NotificationManager;
+import org.apache.syncope.core.provisioning.api.propagation.PropagationTaskExecutor;
+import org.apache.syncope.core.provisioning.java.ProvisioningProperties;
+import org.apache.syncope.core.spring.security.PasswordGenerator;
+import org.apache.syncope.core.spring.security.SecurityProperties;
 import org.apache.syncope.core.starter.actuate.DomainsHealthIndicator;
 import org.apache.syncope.core.starter.actuate.ExternalResourcesHealthIndicator;
+import org.apache.syncope.core.starter.actuate.DefaultSyncopeCoreInfoContributor;
 import org.apache.syncope.core.starter.actuate.SyncopeCoreInfoContributor;
-import org.springframework.beans.factory.annotation.Autowired;
+import org.apache.syncope.core.workflow.api.AnyObjectWorkflowAdapter;
+import org.apache.syncope.core.workflow.api.GroupWorkflowAdapter;
+import org.apache.syncope.core.workflow.api.UserWorkflowAdapter;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.actuate.mail.MailHealthIndicator;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
@@ -39,9 +78,12 @@ import org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration;
 import org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration;
 import org.springframework.boot.builder.SpringApplicationBuilder;
 import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+import org.springframework.context.PayloadApplicationEvent;
 import org.springframework.context.annotation.Bean;
+import org.springframework.context.event.EventListener;
 import org.springframework.mail.javamail.JavaMailSender;
 import org.springframework.mail.javamail.JavaMailSenderImpl;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 
 @SpringBootApplication(exclude = {
@@ -51,7 +93,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
     DataSourceAutoConfiguration.class,
     DataSourceTransactionManagerAutoConfiguration.class,
     JdbcTemplateAutoConfiguration.class,
-    QuartzAutoConfiguration.class })
+    QuartzAutoConfiguration.class }, proxyBeanMethods = false)
 @EnableTransactionManagement
 public class SyncopeCoreApplication extends SpringBootServletInitializer {
 
@@ -61,9 +103,6 @@ public class SyncopeCoreApplication extends SpringBootServletInitializer {
                 build().run(args);
     }
 
-    @Autowired
-    protected JavaMailSender mailSender;
-
     @Override
     protected SpringApplicationBuilder configure(final SpringApplicationBuilder builder) {
         return builder.properties(Map.of("spring.config.name", "core")).sources(SyncopeCoreApplication.class);
@@ -71,8 +110,86 @@ public class SyncopeCoreApplication extends SpringBootServletInitializer {
 
     @ConditionalOnMissingBean
     @Bean
-    public SyncopeCoreInfoContributor syncopeCoreInfoContributor() {
-        return new SyncopeCoreInfoContributor();
+    public SyncopeCoreInfoContributor syncopeCoreInfoContributor(
+        final SecurityProperties securityProperties,
+        final PersistenceProperties persistenceProperties,
+        final ProvisioningProperties provisioningProperties,
+        final LogicProperties logicProperties,
+        final AnyTypeDAO anyTypeDAO,
+        final AnyTypeClassDAO anyTypeClassDAO,
+        final UserDAO userDAO,
+        final GroupDAO groupDAO,
+        final AnyObjectDAO anyObjectDAO,
+        final ExternalResourceDAO resourceDAO,
+        final ConfParamOps confParamOps,
+        final ServiceOps serviceOps,
+        final ConnIdBundleManager bundleManager,
+        final PropagationTaskExecutor propagationTaskExecutor,
+        final AnyObjectWorkflowAdapter awfAdapter,
+        final UserWorkflowAdapter uwfAdapter,
+        final GroupWorkflowAdapter gwfAdapter,
+        final AnyObjectProvisioningManager aProvisioningManager,
+        final UserProvisioningManager uProvisioningManager,
+        final GroupProvisioningManager gProvisioningManager,
+        final VirAttrCache virAttrCache,
+        final NotificationManager notificationManager,
+        final AuditManager auditManager,
+        final PasswordGenerator passwordGenerator,
+        final EntityFactory entityFactory,
+        final PlainSchemaDAO plainSchemaDAO,
+        final PlainAttrDAO plainAttrDAO,
+        final PlainAttrValueDAO plainAttrValueDAO,
+        final AnySearchDAO anySearchDAO,
+        final ImplementationLookup implLookup,
+        final PolicyDAO policyDAO,
+        final NotificationDAO notificationDAO,
+        final TaskDAO taskDAO,
+        final VirSchemaDAO virSchemaDAO,
+        final RoleDAO roleDAO,
+        final SecurityQuestionDAO securityQuestionDAO,
+        @Qualifier("asyncConnectorFacadeExecutor")
+        final ThreadPoolTaskExecutor asyncConnectorFacadeExecutor,
+        @Qualifier("propagationTaskExecutorAsyncExecutor")
+        final ThreadPoolTaskExecutor propagationTaskExecutorAsyncExecutor) {
+        
+        return new DefaultSyncopeCoreInfoContributor(securityProperties,
+            persistenceProperties,
+            provisioningProperties,
+            logicProperties,
+            anyTypeDAO,
+            anyTypeClassDAO,
+            userDAO,
+            groupDAO,
+            anyObjectDAO,
+            resourceDAO,
+            confParamOps,
+            serviceOps,
+            bundleManager,
+            propagationTaskExecutor,
+            awfAdapter,
+            uwfAdapter,
+            gwfAdapter,
+            aProvisioningManager,
+            uProvisioningManager,
+            gProvisioningManager,
+            virAttrCache,
+            notificationManager,
+            auditManager,
+            passwordGenerator,
+            entityFactory,
+            plainSchemaDAO,
+            plainAttrDAO,
+            plainAttrValueDAO,
+            anySearchDAO,
+            implLookup,
+            policyDAO,
+            notificationDAO,
+            taskDAO,
+            virSchemaDAO,
+            roleDAO,
+            securityQuestionDAO,
+            asyncConnectorFacadeExecutor,
+            propagationTaskExecutorAsyncExecutor);
     }
 
     @ConditionalOnMissingBean
@@ -83,7 +200,7 @@ public class SyncopeCoreApplication extends SpringBootServletInitializer {
 
     @ConditionalOnMissingBean
     @Bean
-    public MailHealthIndicator mailHealthIndicator() {
+    public MailHealthIndicator mailHealthIndicator(final JavaMailSender mailSender) {
         return new MailHealthIndicator((JavaMailSenderImpl) mailSender);
     }
 
@@ -96,7 +213,6 @@ public class SyncopeCoreApplication extends SpringBootServletInitializer {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public SyncopeCoreStart keymasterStart(final DomainHolder domainHolder) {
         return new SyncopeCoreStart(domainHolder);
     }
@@ -105,4 +221,31 @@ public class SyncopeCoreApplication extends SpringBootServletInitializer {
     public KeymasterStop keymasterStop() {
         return new KeymasterStop(NetworkService.Type.CORE);
     }
+
+
+    @Bean
+    public SyncopeStarterEventListener syncopeCoreEventListener(
+        @Qualifier("syncopeCoreInfoContributor")
+        final SyncopeCoreInfoContributor syncopeCoreInfoContributor) {
+        return new DefaultSyncopeStarterEventListener(syncopeCoreInfoContributor);
+    }
+
+    @FunctionalInterface
+    public interface SyncopeStarterEventListener {
+        void addLoadInstant(PayloadApplicationEvent<SystemInfo.LoadInstant> event);
+    }
+
+    public static class DefaultSyncopeStarterEventListener implements SyncopeStarterEventListener {
+        private final SyncopeCoreInfoContributor contributor;
+
+        public DefaultSyncopeStarterEventListener(final SyncopeCoreInfoContributor contributor) {
+            this.contributor = contributor;
+        }
+
+        @EventListener
+        @Override
+        public void addLoadInstant(final PayloadApplicationEvent<SystemInfo.LoadInstant> event) {
+            contributor.addLoadInstant(event);
+        }
+    }
 }
diff --git a/core/starter/src/main/java/org/apache/syncope/core/starter/actuate/SyncopeCoreInfoContributor.java b/core/starter/src/main/java/org/apache/syncope/core/starter/actuate/DefaultSyncopeCoreInfoContributor.java
similarity index 75%
copy from core/starter/src/main/java/org/apache/syncope/core/starter/actuate/SyncopeCoreInfoContributor.java
copy to core/starter/src/main/java/org/apache/syncope/core/starter/actuate/DefaultSyncopeCoreInfoContributor.java
index 2648744..23df5fa 100644
--- a/core/starter/src/main/java/org/apache/syncope/core/starter/actuate/SyncopeCoreInfoContributor.java
+++ b/core/starter/src/main/java/org/apache/syncope/core/starter/actuate/DefaultSyncopeCoreInfoContributor.java
@@ -18,19 +18,6 @@
  */
 package org.apache.syncope.core.starter.actuate;
 
-import java.lang.management.ManagementFactory;
-import java.lang.management.OperatingSystemMXBean;
-import java.lang.management.RuntimeMXBean;
-import java.net.InetAddress;
-import java.net.URI;
-import java.net.UnknownHostException;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-import javax.annotation.Resource;
 import org.apache.syncope.common.keymaster.client.api.ConfParamOps;
 import org.apache.syncope.common.keymaster.client.api.ServiceOps;
 import org.apache.syncope.common.lib.info.JavaImplInfo;
@@ -82,18 +69,29 @@ import org.apache.syncope.core.workflow.api.UserWorkflowAdapter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.aop.support.AopUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.actuate.info.Info;
 import org.springframework.boot.actuate.info.InfoContributor;
 import org.springframework.context.PayloadApplicationEvent;
-import org.springframework.context.event.EventListener;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.transaction.annotation.Transactional;
 
-public class SyncopeCoreInfoContributor implements InfoContributor {
+import java.lang.management.ManagementFactory;
+import java.lang.management.OperatingSystemMXBean;
+import java.lang.management.RuntimeMXBean;
+import java.net.InetAddress;
+import java.net.URI;
+import java.net.UnknownHostException;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+public class DefaultSyncopeCoreInfoContributor implements SyncopeCoreInfoContributor, InfoContributor {
 
-    protected static final Logger LOG = LoggerFactory.getLogger(SyncopeCoreInfoContributor.class);
+    protected static final Logger LOG = LoggerFactory.getLogger(DefaultSyncopeCoreInfoContributor.class);
 
     protected static final Object MONITOR = new Object();
 
@@ -157,127 +155,161 @@ public class SyncopeCoreInfoContributor implements InfoContributor {
         }
     }
 
-    @EventListener
-    public void addLoadInstant(final PayloadApplicationEvent<SystemInfo.LoadInstant> event) {
-        synchronized (MONITOR) {
-            initSystemInfo();
-            SYSTEM_INFO.getLoad().add(event.getPayload());
-        }
-    }
+    private final SecurityProperties securityProperties;
 
-    @Autowired
-    protected SecurityProperties securityProperties;
+    private final PersistenceProperties persistenceProperties;
 
-    @Autowired
-    protected PersistenceProperties persistenceProperties;
+    private final ProvisioningProperties provisioningProperties;
 
-    @Autowired
-    protected ProvisioningProperties provisioningProperties;
+    private final LogicProperties logicProperties;
 
-    @Autowired
-    protected LogicProperties logicProperties;
+    private final AnyTypeDAO anyTypeDAO;
 
-    @Autowired
-    protected AnyTypeDAO anyTypeDAO;
+    private final AnyTypeClassDAO anyTypeClassDAO;
 
-    @Autowired
-    protected AnyTypeClassDAO anyTypeClassDAO;
+    private final UserDAO userDAO;
 
-    @Autowired
-    protected UserDAO userDAO;
+    private final GroupDAO groupDAO;
 
-    @Autowired
-    protected GroupDAO groupDAO;
+    private final AnyObjectDAO anyObjectDAO;
 
-    @Autowired
-    protected AnyObjectDAO anyObjectDAO;
+    private final ExternalResourceDAO resourceDAO;
 
-    @Autowired
-    protected ExternalResourceDAO resourceDAO;
+    private final ConfParamOps confParamOps;
 
-    @Autowired
-    protected ConfParamOps confParamOps;
+    private final ServiceOps serviceOps;
 
-    @Autowired
-    protected ServiceOps serviceOps;
+    private final ConnIdBundleManager bundleManager;
 
-    @Autowired
-    protected ConnIdBundleManager bundleManager;
+    private final PropagationTaskExecutor propagationTaskExecutor;
 
-    @Autowired
-    protected PropagationTaskExecutor propagationTaskExecutor;
+    private final AnyObjectWorkflowAdapter awfAdapter;
 
-    @Autowired
-    protected AnyObjectWorkflowAdapter awfAdapter;
+    private final UserWorkflowAdapter uwfAdapter;
 
-    @Autowired
-    protected UserWorkflowAdapter uwfAdapter;
+    private final GroupWorkflowAdapter gwfAdapter;
 
-    @Autowired
-    protected GroupWorkflowAdapter gwfAdapter;
+    private final AnyObjectProvisioningManager aProvisioningManager;
 
-    @Autowired
-    protected AnyObjectProvisioningManager aProvisioningManager;
+    private final UserProvisioningManager uProvisioningManager;
 
-    @Autowired
-    protected UserProvisioningManager uProvisioningManager;
+    private final GroupProvisioningManager gProvisioningManager;
 
-    @Autowired
-    protected GroupProvisioningManager gProvisioningManager;
+    private final VirAttrCache virAttrCache;
 
-    @Autowired
-    protected VirAttrCache virAttrCache;
+    private final NotificationManager notificationManager;
 
-    @Autowired
-    protected NotificationManager notificationManager;
+    private final AuditManager auditManager;
 
-    @Autowired
-    protected AuditManager auditManager;
+    private final PasswordGenerator passwordGenerator;
 
-    @Autowired
-    protected PasswordGenerator passwordGenerator;
+    private final EntityFactory entityFactory;
 
-    @Autowired
-    protected EntityFactory entityFactory;
+    private final PlainSchemaDAO plainSchemaDAO;
 
-    @Autowired
-    protected PlainSchemaDAO plainSchemaDAO;
+    private final PlainAttrDAO plainAttrDAO;
 
-    @Autowired
-    protected PlainAttrDAO plainAttrDAO;
+    private final PlainAttrValueDAO plainAttrValueDAO;
 
-    @Autowired
-    protected PlainAttrValueDAO plainAttrValueDAO;
+    private final AnySearchDAO anySearchDAO;
 
-    @Autowired
-    protected AnySearchDAO anySearchDAO;
+    private final ImplementationLookup implLookup;
 
-    @Autowired
-    protected ImplementationLookup implLookup;
+    private final PolicyDAO policyDAO;
 
-    @Autowired
-    protected PolicyDAO policyDAO;
+    private final NotificationDAO notificationDAO;
 
-    @Autowired
-    protected NotificationDAO notificationDAO;
+    private final TaskDAO taskDAO;
 
-    @Autowired
-    protected TaskDAO taskDAO;
+    private final VirSchemaDAO virSchemaDAO;
 
-    @Autowired
-    protected VirSchemaDAO virSchemaDAO;
+    private final RoleDAO roleDAO;
 
-    @Autowired
-    protected RoleDAO roleDAO;
+    private final SecurityQuestionDAO securityQuestionDAO;
 
-    @Autowired
-    protected SecurityQuestionDAO securityQuestionDAO;
+    private final ThreadPoolTaskExecutor asyncConnectorFacadeExecutor;
 
-    @Resource(name = "asyncConnectorFacadeExecutor")
-    protected ThreadPoolTaskExecutor asyncConnectorFacadeExecutor;
+    private final ThreadPoolTaskExecutor propagationTaskExecutorAsyncExecutor;
 
-    @Resource(name = "propagationTaskExecutorAsyncExecutor")
-    protected ThreadPoolTaskExecutor propagationTaskExecutorAsyncExecutor;
+    public DefaultSyncopeCoreInfoContributor(
+        final SecurityProperties securityProperties,
+        final PersistenceProperties persistenceProperties,
+        final ProvisioningProperties provisioningProperties,
+        final LogicProperties logicProperties,
+        final AnyTypeDAO anyTypeDAO,
+        final AnyTypeClassDAO anyTypeClassDAO,
+        final UserDAO userDAO,
+        final GroupDAO groupDAO,
+        final AnyObjectDAO anyObjectDAO,
+        final ExternalResourceDAO resourceDAO,
+        final ConfParamOps confParamOps,
+        final ServiceOps serviceOps,
+        final ConnIdBundleManager bundleManager,
+        final PropagationTaskExecutor propagationTaskExecutor,
+        final AnyObjectWorkflowAdapter awfAdapter,
+        final UserWorkflowAdapter uwfAdapter,
+        final GroupWorkflowAdapter gwfAdapter,
+        final AnyObjectProvisioningManager aProvisioningManager,
+        final UserProvisioningManager uProvisioningManager,
+        final GroupProvisioningManager gProvisioningManager,
+        final VirAttrCache virAttrCache,
+        final NotificationManager notificationManager,
+        final AuditManager auditManager,
+        final PasswordGenerator passwordGenerator,
+        final EntityFactory entityFactory,
+        final PlainSchemaDAO plainSchemaDAO,
+        final PlainAttrDAO plainAttrDAO,
+        final PlainAttrValueDAO plainAttrValueDAO,
+        final AnySearchDAO anySearchDAO,
+        final ImplementationLookup implLookup,
+        final PolicyDAO policyDAO,
+        final NotificationDAO notificationDAO,
+        final TaskDAO taskDAO,
+        final VirSchemaDAO virSchemaDAO,
+        final RoleDAO roleDAO,
+        final SecurityQuestionDAO securityQuestionDAO,
+        final ThreadPoolTaskExecutor asyncConnectorFacadeExecutor,
+        final ThreadPoolTaskExecutor propagationTaskExecutorAsyncExecutor) {
+
+        this.securityProperties = securityProperties;
+        this.persistenceProperties = persistenceProperties;
+        this.provisioningProperties = provisioningProperties;
+        this.logicProperties = logicProperties;
+        this.anyTypeDAO = anyTypeDAO;
+        this.anyTypeClassDAO = anyTypeClassDAO;
+        this.userDAO = userDAO;
+        this.groupDAO = groupDAO;
+        this.anyObjectDAO = anyObjectDAO;
+        this.resourceDAO = resourceDAO;
+        this.confParamOps = confParamOps;
+        this.serviceOps = serviceOps;
+        this.bundleManager = bundleManager;
+        this.propagationTaskExecutor = propagationTaskExecutor;
+        this.awfAdapter = awfAdapter;
+        this.uwfAdapter = uwfAdapter;
+        this.gwfAdapter = gwfAdapter;
+        this.aProvisioningManager = aProvisioningManager;
+        this.uProvisioningManager = uProvisioningManager;
+        this.gProvisioningManager = gProvisioningManager;
+        this.virAttrCache = virAttrCache;
+        this.notificationManager = notificationManager;
+        this.auditManager = auditManager;
+        this.passwordGenerator = passwordGenerator;
+        this.entityFactory = entityFactory;
+        this.plainSchemaDAO = plainSchemaDAO;
+        this.plainAttrDAO = plainAttrDAO;
+        this.plainAttrValueDAO = plainAttrValueDAO;
+        this.anySearchDAO = anySearchDAO;
+        this.implLookup = implLookup;
+        this.policyDAO = policyDAO;
+        this.notificationDAO = notificationDAO;
+        this.taskDAO = taskDAO;
+        this.virSchemaDAO = virSchemaDAO;
+        this.roleDAO = roleDAO;
+        this.securityQuestionDAO = securityQuestionDAO;
+        this.asyncConnectorFacadeExecutor = asyncConnectorFacadeExecutor;
+        this.propagationTaskExecutorAsyncExecutor = propagationTaskExecutorAsyncExecutor;
+    }
 
     protected boolean isSelfRegAllowed() {
         return confParamOps.get(AuthContextUtils.getDomain(), "selfRegistration.allowed", false, Boolean.class);
@@ -468,4 +500,12 @@ public class SyncopeCoreInfoContributor implements InfoContributor {
         builder.withDetail("provisioningProperties", provisioningProperties);
         builder.withDetail("logicProperties", logicProperties);
     }
+
+    @Override
+    public void addLoadInstant(final PayloadApplicationEvent<SystemInfo.LoadInstant> event) {
+        synchronized (MONITOR) {
+            initSystemInfo();
+            SYSTEM_INFO.getLoad().add(event.getPayload());
+        }
+    }
 }
diff --git a/core/starter/src/main/java/org/apache/syncope/core/starter/actuate/SyncopeCoreInfoContributor.java b/core/starter/src/main/java/org/apache/syncope/core/starter/actuate/SyncopeCoreInfoContributor.java
index 2648744..ad97624 100644
--- a/core/starter/src/main/java/org/apache/syncope/core/starter/actuate/SyncopeCoreInfoContributor.java
+++ b/core/starter/src/main/java/org/apache/syncope/core/starter/actuate/SyncopeCoreInfoContributor.java
@@ -16,456 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 package org.apache.syncope.core.starter.actuate;
 
-import java.lang.management.ManagementFactory;
-import java.lang.management.OperatingSystemMXBean;
-import java.lang.management.RuntimeMXBean;
-import java.net.InetAddress;
-import java.net.URI;
-import java.net.UnknownHostException;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-import javax.annotation.Resource;
-import org.apache.syncope.common.keymaster.client.api.ConfParamOps;
-import org.apache.syncope.common.keymaster.client.api.ServiceOps;
-import org.apache.syncope.common.lib.info.JavaImplInfo;
-import org.apache.syncope.common.lib.info.NumbersInfo;
-import org.apache.syncope.common.lib.info.PlatformInfo;
 import org.apache.syncope.common.lib.info.SystemInfo;
-import org.apache.syncope.common.lib.types.EntitlementsHolder;
-import org.apache.syncope.common.lib.types.ImplementationTypesHolder;
-import org.apache.syncope.common.lib.types.TaskType;
-import org.apache.syncope.core.logic.LogicProperties;
-import org.apache.syncope.core.persistence.api.ImplementationLookup;
-import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
-import org.apache.syncope.core.persistence.api.dao.AnySearchDAO;
-import org.apache.syncope.core.persistence.api.dao.AnyTypeClassDAO;
-import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
-import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
-import org.apache.syncope.core.persistence.api.dao.GroupDAO;
-import org.apache.syncope.core.persistence.api.dao.NotificationDAO;
-import org.apache.syncope.core.persistence.api.dao.PlainAttrDAO;
-import org.apache.syncope.core.persistence.api.dao.PlainAttrValueDAO;
-import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
-import org.apache.syncope.core.persistence.api.dao.PolicyDAO;
-import org.apache.syncope.core.persistence.api.dao.RoleDAO;
-import org.apache.syncope.core.persistence.api.dao.SecurityQuestionDAO;
-import org.apache.syncope.core.persistence.api.dao.TaskDAO;
-import org.apache.syncope.core.persistence.api.dao.UserDAO;
-import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO;
-import org.apache.syncope.core.persistence.api.entity.AnyType;
-import org.apache.syncope.core.persistence.api.entity.Entity;
-import org.apache.syncope.core.persistence.api.entity.EntityFactory;
-import org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy;
-import org.apache.syncope.core.persistence.api.entity.policy.PasswordPolicy;
-import org.apache.syncope.core.persistence.jpa.PersistenceProperties;
-import org.apache.syncope.core.provisioning.api.AnyObjectProvisioningManager;
-import org.apache.syncope.core.provisioning.api.AuditManager;
-import org.apache.syncope.core.provisioning.api.ConnIdBundleManager;
-import org.apache.syncope.core.provisioning.api.GroupProvisioningManager;
-import org.apache.syncope.core.provisioning.api.UserProvisioningManager;
-import org.apache.syncope.core.provisioning.api.cache.VirAttrCache;
-import org.apache.syncope.core.provisioning.api.notification.NotificationManager;
-import org.apache.syncope.core.provisioning.api.propagation.PropagationTaskExecutor;
-import org.apache.syncope.core.provisioning.java.ProvisioningProperties;
-import org.apache.syncope.core.spring.security.AuthContextUtils;
-import org.apache.syncope.core.spring.security.PasswordGenerator;
-import org.apache.syncope.core.spring.security.SecurityProperties;
-import org.apache.syncope.core.workflow.api.AnyObjectWorkflowAdapter;
-import org.apache.syncope.core.workflow.api.GroupWorkflowAdapter;
-import org.apache.syncope.core.workflow.api.UserWorkflowAdapter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.aop.support.AopUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.boot.actuate.info.Info;
-import org.springframework.boot.actuate.info.InfoContributor;
 import org.springframework.context.PayloadApplicationEvent;
-import org.springframework.context.event.EventListener;
-import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.transaction.annotation.Transactional;
-
-public class SyncopeCoreInfoContributor implements InfoContributor {
-
-    protected static final Logger LOG = LoggerFactory.getLogger(SyncopeCoreInfoContributor.class);
-
-    protected static final Object MONITOR = new Object();
-
-    protected static PlatformInfo PLATFORM_INFO;
-
-    protected static SystemInfo SYSTEM_INFO;
-
-    protected static final Pattern THREADPOOLTASKEXECUTOR_PATTERN = Pattern.compile(
-            ".*, pool size = ([0-9]+), "
-            + "active threads = ([0-9]+), "
-            + "queued tasks = ([0-9]+), "
-            + "completed tasks = ([0-9]+).*");
-
-    protected static void setTaskExecutorInfo(final String toString, final NumbersInfo.TaskExecutorInfo info) {
-        Matcher matcher = THREADPOOLTASKEXECUTOR_PATTERN.matcher(toString);
-        if (matcher.matches() && matcher.groupCount() == 4) {
-            try {
-                info.setSize(Integer.valueOf(matcher.group(1)));
-            } catch (NumberFormatException e) {
-                LOG.error("While parsing thread pool size", e);
-            }
-            try {
-                info.setActive(Integer.valueOf(matcher.group(2)));
-            } catch (NumberFormatException e) {
-                LOG.error("While parsing active threads #", e);
-            }
-            try {
-                info.setQueued(Integer.valueOf(matcher.group(3)));
-            } catch (NumberFormatException e) {
-                LOG.error("While parsing queued threads #", e);
-            }
-            try {
-                info.setCompleted(Integer.valueOf(matcher.group(4)));
-            } catch (NumberFormatException e) {
-                LOG.error("While parsing completed threads #", e);
-            }
-        }
-    }
-
-    protected static void initSystemInfo() {
-        if (SYSTEM_INFO == null) {
-            OperatingSystemMXBean operatingSystemMXBean = ManagementFactory.getOperatingSystemMXBean();
-            RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
-
-            SYSTEM_INFO = new SystemInfo();
-            try {
-                SYSTEM_INFO.setHostname(InetAddress.getLocalHost().getHostName());
-            } catch (UnknownHostException e) {
-                LOG.error("Could not get host name", e);
-            }
-
-            SYSTEM_INFO.setOs(operatingSystemMXBean.getName()
-                    + ' ' + operatingSystemMXBean.getVersion()
-                    + ' ' + operatingSystemMXBean.getArch());
-            SYSTEM_INFO.setAvailableProcessors(operatingSystemMXBean.getAvailableProcessors());
-            SYSTEM_INFO.setJvm(
-                    runtimeMXBean.getVmName()
-                    + ' ' + System.getProperty("java.version")
-                    + ' ' + runtimeMXBean.getVmVendor());
-            SYSTEM_INFO.setStartTime(runtimeMXBean.getStartTime());
-        }
-    }
-
-    @EventListener
-    public void addLoadInstant(final PayloadApplicationEvent<SystemInfo.LoadInstant> event) {
-        synchronized (MONITOR) {
-            initSystemInfo();
-            SYSTEM_INFO.getLoad().add(event.getPayload());
-        }
-    }
-
-    @Autowired
-    protected SecurityProperties securityProperties;
-
-    @Autowired
-    protected PersistenceProperties persistenceProperties;
-
-    @Autowired
-    protected ProvisioningProperties provisioningProperties;
-
-    @Autowired
-    protected LogicProperties logicProperties;
-
-    @Autowired
-    protected AnyTypeDAO anyTypeDAO;
-
-    @Autowired
-    protected AnyTypeClassDAO anyTypeClassDAO;
-
-    @Autowired
-    protected UserDAO userDAO;
-
-    @Autowired
-    protected GroupDAO groupDAO;
-
-    @Autowired
-    protected AnyObjectDAO anyObjectDAO;
-
-    @Autowired
-    protected ExternalResourceDAO resourceDAO;
-
-    @Autowired
-    protected ConfParamOps confParamOps;
-
-    @Autowired
-    protected ServiceOps serviceOps;
-
-    @Autowired
-    protected ConnIdBundleManager bundleManager;
-
-    @Autowired
-    protected PropagationTaskExecutor propagationTaskExecutor;
-
-    @Autowired
-    protected AnyObjectWorkflowAdapter awfAdapter;
-
-    @Autowired
-    protected UserWorkflowAdapter uwfAdapter;
-
-    @Autowired
-    protected GroupWorkflowAdapter gwfAdapter;
-
-    @Autowired
-    protected AnyObjectProvisioningManager aProvisioningManager;
-
-    @Autowired
-    protected UserProvisioningManager uProvisioningManager;
-
-    @Autowired
-    protected GroupProvisioningManager gProvisioningManager;
-
-    @Autowired
-    protected VirAttrCache virAttrCache;
-
-    @Autowired
-    protected NotificationManager notificationManager;
-
-    @Autowired
-    protected AuditManager auditManager;
-
-    @Autowired
-    protected PasswordGenerator passwordGenerator;
-
-    @Autowired
-    protected EntityFactory entityFactory;
-
-    @Autowired
-    protected PlainSchemaDAO plainSchemaDAO;
-
-    @Autowired
-    protected PlainAttrDAO plainAttrDAO;
-
-    @Autowired
-    protected PlainAttrValueDAO plainAttrValueDAO;
-
-    @Autowired
-    protected AnySearchDAO anySearchDAO;
-
-    @Autowired
-    protected ImplementationLookup implLookup;
-
-    @Autowired
-    protected PolicyDAO policyDAO;
-
-    @Autowired
-    protected NotificationDAO notificationDAO;
-
-    @Autowired
-    protected TaskDAO taskDAO;
-
-    @Autowired
-    protected VirSchemaDAO virSchemaDAO;
-
-    @Autowired
-    protected RoleDAO roleDAO;
-
-    @Autowired
-    protected SecurityQuestionDAO securityQuestionDAO;
-
-    @Resource(name = "asyncConnectorFacadeExecutor")
-    protected ThreadPoolTaskExecutor asyncConnectorFacadeExecutor;
-
-    @Resource(name = "propagationTaskExecutorAsyncExecutor")
-    protected ThreadPoolTaskExecutor propagationTaskExecutorAsyncExecutor;
-
-    protected boolean isSelfRegAllowed() {
-        return confParamOps.get(AuthContextUtils.getDomain(), "selfRegistration.allowed", false, Boolean.class);
-    }
-
-    protected boolean isPwdResetAllowed() {
-        return confParamOps.get(AuthContextUtils.getDomain(), "passwordReset.allowed", false, Boolean.class);
-    }
-
-    protected boolean isPwdResetRequiringSecurityQuestions() {
-        return confParamOps.get(AuthContextUtils.getDomain(), "passwordReset.securityQuestion", true, Boolean.class);
-    }
-
-    protected void buildPlatform() {
-        synchronized (this) {
-            if (PLATFORM_INFO == null) {
-                PLATFORM_INFO = new PlatformInfo();
-                PLATFORM_INFO.setKeymasterConfParamOps(AopUtils.getTargetClass(confParamOps).getName());
-                PLATFORM_INFO.setKeymasterServiceOps(AopUtils.getTargetClass(serviceOps).getName());
-
-                PLATFORM_INFO.getConnIdLocations().addAll(bundleManager.getLocations().stream().
-                        map(URI::toASCIIString).collect(Collectors.toList()));
-
-                PLATFORM_INFO.getWorkflowInfo().
-                        setAnyObjectWorkflowAdapter(AopUtils.getTargetClass(awfAdapter).getName());
-                PLATFORM_INFO.getWorkflowInfo().
-                        setUserWorkflowAdapter(AopUtils.getTargetClass(uwfAdapter).getName());
-                PLATFORM_INFO.getWorkflowInfo().
-                        setGroupWorkflowAdapter(AopUtils.getTargetClass(gwfAdapter).getName());
-
-                PLATFORM_INFO.getProvisioningInfo().
-                        setAnyObjectProvisioningManager(AopUtils.getTargetClass(aProvisioningManager).getName());
-                PLATFORM_INFO.getProvisioningInfo().
-                        setUserProvisioningManager(AopUtils.getTargetClass(uProvisioningManager).getName());
-                PLATFORM_INFO.getProvisioningInfo().
-                        setGroupProvisioningManager(AopUtils.getTargetClass(gProvisioningManager).getName());
-                PLATFORM_INFO.getProvisioningInfo().
-                        setPropagationTaskExecutor(AopUtils.getTargetClass(propagationTaskExecutor).getName());
-                PLATFORM_INFO.getProvisioningInfo().
-                        setVirAttrCache(AopUtils.getTargetClass(virAttrCache).getName());
-                PLATFORM_INFO.getProvisioningInfo().
-                        setNotificationManager(AopUtils.getTargetClass(notificationManager).getName());
-                PLATFORM_INFO.getProvisioningInfo().
-                        setAuditManager(AopUtils.getTargetClass(auditManager).getName());
-
-                PLATFORM_INFO.setPasswordGenerator(AopUtils.getTargetClass(passwordGenerator).getName());
-
-                PLATFORM_INFO.getPersistenceInfo().
-                        setEntityFactory(AopUtils.getTargetClass(entityFactory).getName());
-                PLATFORM_INFO.getPersistenceInfo().
-                        setPlainSchemaDAO(AopUtils.getTargetClass(plainSchemaDAO).getName());
-                PLATFORM_INFO.getPersistenceInfo().
-                        setPlainAttrDAO(AopUtils.getTargetClass(plainAttrDAO).getName());
-                PLATFORM_INFO.getPersistenceInfo().
-                        setPlainAttrValueDAO(AopUtils.getTargetClass(plainAttrValueDAO).getName());
-                PLATFORM_INFO.getPersistenceInfo().
-                        setAnySearchDAO(AopUtils.getTargetClass(anySearchDAO).getName());
-                PLATFORM_INFO.getPersistenceInfo().
-                        setUserDAO(AopUtils.getTargetClass(userDAO).getName());
-                PLATFORM_INFO.getPersistenceInfo().
-                        setGroupDAO(AopUtils.getTargetClass(groupDAO).getName());
-                PLATFORM_INFO.getPersistenceInfo().
-                        setAnyObjectDAO(AopUtils.getTargetClass(anyObjectDAO).getName());
-
-                ImplementationTypesHolder.getInstance().getValues().forEach((typeName, typeInterface) -> {
-                    Set<String> classNames = implLookup.getClassNames(typeName);
-                    if (classNames != null) {
-                        JavaImplInfo javaImplInfo = new JavaImplInfo();
-                        javaImplInfo.setType(typeName);
-                        javaImplInfo.getClasses().addAll(classNames);
-
-                        PLATFORM_INFO.getJavaImplInfos().add(javaImplInfo);
-                    }
-                });
-            }
-
-            PLATFORM_INFO.setSelfRegAllowed(isSelfRegAllowed());
-            PLATFORM_INFO.setPwdResetAllowed(isPwdResetAllowed());
-            PLATFORM_INFO.setPwdResetRequiringSecurityQuestions(isPwdResetRequiringSecurityQuestions());
-
-            PLATFORM_INFO.getEntitlements().clear();
-            PLATFORM_INFO.getEntitlements().addAll(EntitlementsHolder.getInstance().getValues());
-
-            PLATFORM_INFO.getImplementationTypes().clear();
-            PLATFORM_INFO.getImplementationTypes().addAll(ImplementationTypesHolder.getInstance().getValues().keySet());
-
-            AuthContextUtils.callAsAdmin(AuthContextUtils.getDomain(), () -> {
-                PLATFORM_INFO.getAnyTypes().clear();
-                PLATFORM_INFO.getAnyTypes().addAll(anyTypeDAO.findAll().stream().
-                        map(Entity::getKey).collect(Collectors.toList()));
-
-                PLATFORM_INFO.getUserClasses().clear();
-                PLATFORM_INFO.getUserClasses().addAll(anyTypeDAO.findUser().getClasses().stream().
-                        map(Entity::getKey).collect(Collectors.toList()));
-
-                PLATFORM_INFO.getAnyTypeClasses().clear();
-                PLATFORM_INFO.getAnyTypeClasses().addAll(anyTypeClassDAO.findAll().stream().
-                        map(Entity::getKey).collect(Collectors.toList()));
-
-                PLATFORM_INFO.getResources().clear();
-                PLATFORM_INFO.getResources().addAll(resourceDAO.findAll().stream().
-                        map(Entity::getKey).collect(Collectors.toList()));
-                return null;
-            });
-        }
-    }
-
-    protected NumbersInfo buildNumbers() {
-        NumbersInfo numbersInfo = new NumbersInfo();
-
-        numbersInfo.setTotalUsers(userDAO.count());
-        numbersInfo.getUsersByRealm().putAll(userDAO.countByRealm());
-        numbersInfo.getUsersByStatus().putAll(userDAO.countByStatus());
-
-        numbersInfo.setTotalGroups(groupDAO.count());
-        numbersInfo.getGroupsByRealm().putAll(groupDAO.countByRealm());
-
-        Map<AnyType, Integer> anyObjectNumbers = anyObjectDAO.countByType();
-        int i = 0;
-        for (Iterator<Map.Entry<AnyType, Integer>> itor = anyObjectNumbers.entrySet().iterator();
-                i < 2 && itor.hasNext(); i++) {
-
-            Map.Entry<AnyType, Integer> entry = itor.next();
-            if (i == 0) {
-                numbersInfo.setAnyType1(entry.getKey().getKey());
-                numbersInfo.setTotalAny1(entry.getValue());
-                numbersInfo.getAny1ByRealm().putAll(anyObjectDAO.countByRealm(entry.getKey()));
-            } else {
-                numbersInfo.setAnyType2(entry.getKey().getKey());
-                numbersInfo.setTotalAny2(entry.getValue());
-                numbersInfo.getAny2ByRealm().putAll(anyObjectDAO.countByRealm(entry.getKey()));
-            }
-        }
-
-        numbersInfo.setTotalResources(resourceDAO.count());
-
-        numbersInfo.setTotalRoles(roleDAO.count());
-
-        numbersInfo.getConfCompleteness().put(
-                NumbersInfo.ConfItem.RESOURCE.name(), numbersInfo.getTotalResources() > 0);
-        numbersInfo.getConfCompleteness().put(
-                NumbersInfo.ConfItem.ACCOUNT_POLICY.name(), !policyDAO.find(AccountPolicy.class).isEmpty());
-        numbersInfo.getConfCompleteness().put(
-                NumbersInfo.ConfItem.PASSWORD_POLICY.name(), !policyDAO.find(PasswordPolicy.class).isEmpty());
-        numbersInfo.getConfCompleteness().put(
-                NumbersInfo.ConfItem.NOTIFICATION.name(), !notificationDAO.findAll().isEmpty());
-        numbersInfo.getConfCompleteness().put(
-                NumbersInfo.ConfItem.PULL_TASK.name(), !taskDAO.findAll(TaskType.PULL).isEmpty());
-        numbersInfo.getConfCompleteness().put(
-                NumbersInfo.ConfItem.VIR_SCHEMA.name(), !virSchemaDAO.findAll().isEmpty());
-        numbersInfo.getConfCompleteness().put(
-                NumbersInfo.ConfItem.ANY_TYPE.name(), !anyObjectNumbers.isEmpty());
-        numbersInfo.getConfCompleteness().put(
-                NumbersInfo.ConfItem.SECURITY_QUESTION.name(), !securityQuestionDAO.findAll().isEmpty());
-        numbersInfo.getConfCompleteness().put(
-                NumbersInfo.ConfItem.ROLE.name(), numbersInfo.getTotalRoles() > 0);
-
-        setTaskExecutorInfo(
-                asyncConnectorFacadeExecutor.getThreadPoolExecutor().toString(),
-                numbersInfo.getAsyncConnectorExecutor());
-        setTaskExecutorInfo(
-                propagationTaskExecutorAsyncExecutor.getThreadPoolExecutor().toString(),
-                numbersInfo.getPropagationTaskExecutor());
-
-        return numbersInfo;
-    }
-
-    protected void buildSystem() {
-        synchronized (MONITOR) {
-            initSystemInfo();
-        }
-    }
-
-    @PreAuthorize("isAuthenticated()")
-    @Transactional(readOnly = true)
-    @Override
-    public void contribute(final Info.Builder builder) {
-        buildPlatform();
-        builder.withDetail("platform", PLATFORM_INFO);
-
-        builder.withDetail("numbers", buildNumbers());
-
-        buildSystem();
-        builder.withDetail("system", SYSTEM_INFO);
 
-        builder.withDetail("securityProperties", securityProperties);
-        builder.withDetail("persistenceProperties", persistenceProperties);
-        builder.withDetail("provisioningProperties", provisioningProperties);
-        builder.withDetail("logicProperties", logicProperties);
-    }
+@FunctionalInterface
+public interface SyncopeCoreInfoContributor {
+    void addLoadInstant(PayloadApplicationEvent<SystemInfo.LoadInstant> event);
 }
diff --git a/core/starter/src/main/resources/core.properties b/core/starter/src/main/resources/core.properties
index 73c6364..adac19e 100644
--- a/core/starter/src/main/resources/core.properties
+++ b/core/starter/src/main/resources/core.properties
@@ -111,3 +111,9 @@ security.digester.useLenientSaltSizeCheck=true
 #########
 
 logic.enableJDBCAuditAppender=true
+
+#########
+# Disable CGLib Proxies #
+#########
+spring.aop.auto=true
+spring.aop.proxy-target-class=false
diff --git a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/WorkflowContext.java b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/WorkflowContext.java
index 8ebc4ca..f51a0f2 100644
--- a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/WorkflowContext.java
+++ b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/WorkflowContext.java
@@ -29,17 +29,15 @@ import org.apache.syncope.core.provisioning.api.data.UserDataBinder;
 import org.apache.syncope.core.workflow.api.AnyObjectWorkflowAdapter;
 import org.apache.syncope.core.workflow.api.GroupWorkflowAdapter;
 import org.apache.syncope.core.workflow.api.UserWorkflowAdapter;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class WorkflowContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public UserWorkflowAdapter uwfAdapter(
             final UserDataBinder userDataBinder,
             final UserDAO userDAO,
@@ -51,7 +49,6 @@ public class WorkflowContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public GroupWorkflowAdapter gwfAdapter(
             final GroupDataBinder groupDataBinder,
             final GroupDAO groupDAO,
@@ -62,7 +59,6 @@ public class WorkflowContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public AnyObjectWorkflowAdapter awfAdapter(
             final AnyObjectDataBinder anyObjectDataBinder,
             final AnyObjectDAO anyObjectDAO,
diff --git a/ext/camel/logic/src/main/java/org/apache/syncope/core/logic/CamelLogicContext.java b/ext/camel/logic/src/main/java/org/apache/syncope/core/logic/CamelLogicContext.java
index 2ac7bf5..8c46d0b 100644
--- a/ext/camel/logic/src/main/java/org/apache/syncope/core/logic/CamelLogicContext.java
+++ b/ext/camel/logic/src/main/java/org/apache/syncope/core/logic/CamelLogicContext.java
@@ -22,33 +22,26 @@ import org.apache.syncope.core.logic.init.CamelRouteLoader;
 import org.apache.syncope.core.persistence.api.dao.CamelRouteDAO;
 import org.apache.syncope.core.provisioning.api.data.CamelRouteDataBinder;
 import org.apache.syncope.core.provisioning.camel.SyncopeCamelContext;
-import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.core.io.Resource;
 
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class CamelLogicContext {
 
-    @javax.annotation.Resource(name = "userRoutes")
-    private Resource userRoutes;
-
-    @javax.annotation.Resource(name = "groupRoutes")
-    private Resource groupRoutes;
-
-    @javax.annotation.Resource(name = "anyObjectRoutes")
-    private Resource anyObjectRoutes;
-
     @ConditionalOnMissingBean
     @Bean
-    public CamelRouteLoader camelRouteLoader() {
+    public CamelRouteLoader camelRouteLoader(
+        @Qualifier("anyObjectRoutes") final Resource anyObjectRoutes,
+        @Qualifier("groupRoutes") final Resource groupRoutes,
+        @Qualifier("userRoutes") final Resource userRoutes) {
         return new CamelRouteLoader(userRoutes, groupRoutes, anyObjectRoutes);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public CamelRouteLogic camelRouteLogic(
             final CamelRouteDAO routeDAO,
             final CamelRouteDataBinder binder,
diff --git a/ext/camel/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/CamelPersistenceContext.java b/ext/camel/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/CamelPersistenceContext.java
index c39d33c..900f759 100644
--- a/ext/camel/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/CamelPersistenceContext.java
+++ b/ext/camel/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/CamelPersistenceContext.java
@@ -26,7 +26,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class CamelPersistenceContext {
 
     @ConditionalOnMissingBean
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelProvisioningContext.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelProvisioningContext.java
index ac5d5ef..35b3233 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelProvisioningContext.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelProvisioningContext.java
@@ -24,14 +24,13 @@ import org.apache.syncope.core.provisioning.api.GroupProvisioningManager;
 import org.apache.syncope.core.provisioning.api.UserProvisioningManager;
 import org.apache.syncope.core.provisioning.api.data.CamelRouteDataBinder;
 import org.apache.syncope.core.provisioning.camel.data.CamelRouteDataBinderImpl;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.core.io.Resource;
 
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class CamelProvisioningContext {
 
     @Bean
@@ -51,13 +50,11 @@ public class CamelProvisioningContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public SyncopeCamelContext syncopeCamelContext(final CamelRouteDAO routeDAO) {
         return new SyncopeCamelContext(routeDAO);
     }
 
     @Bean
-    @Autowired
     public UserProvisioningManager userProvisioningManager(
             final CamelRouteDAO routeDAO,
             final SyncopeCamelContext contextFactory) {
@@ -66,7 +63,6 @@ public class CamelProvisioningContext {
     }
 
     @Bean
-    @Autowired
     public GroupProvisioningManager groupProvisioningManager(
             final CamelRouteDAO routeDAO,
             final SyncopeCamelContext contextFactory) {
@@ -75,7 +71,6 @@ public class CamelProvisioningContext {
     }
 
     @Bean
-    @Autowired
     public AnyObjectProvisioningManager anyObjectProvisioningManager(
             final CamelRouteDAO routeDAO,
             final SyncopeCamelContext contextFactory) {
@@ -85,7 +80,6 @@ public class CamelProvisioningContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public CamelRouteDataBinder camelRouteDataBinder(final CamelRouteDAO routeDAO) {
         return new CamelRouteDataBinderImpl(routeDAO);
     }
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/component/PropagateComponent.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/component/PropagateComponent.java
index 93274ed..ce00b0f 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/component/PropagateComponent.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/component/PropagateComponent.java
@@ -19,7 +19,6 @@
 package org.apache.syncope.core.provisioning.camel.component;
 
 import java.util.Map;
-import javax.annotation.Resource;
 import org.apache.camel.Endpoint;
 import org.apache.camel.support.DefaultComponent;
 import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
@@ -28,6 +27,7 @@ import org.apache.syncope.core.persistence.api.dao.UserDAO;
 import org.apache.syncope.core.provisioning.api.data.GroupDataBinder;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationManager;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationTaskExecutor;
+import org.apache.syncope.core.spring.security.SecurityProperties;
 import org.apache.syncope.core.workflow.api.UserWorkflowAdapter;
 import org.springframework.beans.factory.annotation.Autowired;
 
@@ -54,8 +54,8 @@ public class PropagateComponent extends DefaultComponent {
     @Autowired
     protected UserWorkflowAdapter uwfAdapter;
 
-    @Resource(name = "adminUser")
-    protected String adminUser;
+    @Autowired
+    protected SecurityProperties props;
 
     @Override
     protected Endpoint createEndpoint(
@@ -82,7 +82,7 @@ public class PropagateComponent extends DefaultComponent {
             executor = (String) parameters.get("eraser");
         }
         if (executor == null) {
-            executor = adminUser;
+            executor = props.getAdminUser();
         }
         endpoint.setExecutor(executor);
 
diff --git a/ext/camel/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/CamelRESTCXFContext.java b/ext/camel/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/CamelRESTCXFContext.java
index e29441b..1437d0d 100644
--- a/ext/camel/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/CamelRESTCXFContext.java
+++ b/ext/camel/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/CamelRESTCXFContext.java
@@ -21,17 +21,15 @@ package org.apache.syncope.core.rest.cxf;
 import org.apache.syncope.common.rest.api.service.CamelRouteService;
 import org.apache.syncope.core.logic.CamelRouteLogic;
 import org.apache.syncope.core.rest.cxf.service.CamelRouteServiceImpl;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class CamelRESTCXFContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public CamelRouteService camelRouteService(final CamelRouteLogic camelRouteLogic) {
         return new CamelRouteServiceImpl(camelRouteLogic);
     }
diff --git a/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchClientContext.java b/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchClientContext.java
index dbacb5e..babd0d7 100644
--- a/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchClientContext.java
+++ b/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchClientContext.java
@@ -24,13 +24,12 @@ import org.apache.http.HttpHost;
 import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
 import org.apache.syncope.core.persistence.api.dao.GroupDAO;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Lazy;
 
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class ElasticsearchClientContext {
 
     @ConditionalOnMissingBean
@@ -42,7 +41,6 @@ public class ElasticsearchClientContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public ElasticsearchUtils elasticsearchUtils(
             final @Lazy UserDAO userDAO,
             final @Lazy GroupDAO groupDAO,
@@ -58,7 +56,6 @@ public class ElasticsearchClientContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public ElasticsearchIndexManager elasticsearchIndexManager(
             final ElasticsearchClient client,
             final ElasticsearchUtils elasticsearchUtils) {
diff --git a/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/ElasticsearchPersistenceContext.java b/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/ElasticsearchPersistenceContext.java
index ccc8421..d2232d3 100644
--- a/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/ElasticsearchPersistenceContext.java
+++ b/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/ElasticsearchPersistenceContext.java
@@ -31,25 +31,22 @@ import org.apache.syncope.core.persistence.jpa.dao.ElasticsearchAnySearchDAO;
 import org.apache.syncope.ext.elasticsearch.client.ElasticsearchIndexManager;
 import org.apache.syncope.ext.elasticsearch.client.ElasticsearchUtils;
 import co.elastic.clients.elasticsearch.ElasticsearchClient;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Lazy;
 
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class ElasticsearchPersistenceContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public DomainIndexLoader domainIndexLoader(final ElasticsearchIndexManager indexManager) {
         return new DomainIndexLoader(indexManager);
     }
 
     @ConditionalOnMissingBean(name = "elasticsearchAnySearchDAO")
     @Bean
-    @Autowired
     public AnySearchDAO anySearchDAO(
             final RealmDAO realmDAO,
             final @Lazy DynRealmDAO dynRealmDAO,
diff --git a/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/FlowableWorkflowContext.java b/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/FlowableWorkflowContext.java
index 378ebd5..e23ac76 100644
--- a/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/FlowableWorkflowContext.java
+++ b/ext/flowable/flowable-bpmn/src/main/java/org/apache/syncope/core/flowable/FlowableWorkflowContext.java
@@ -52,7 +52,6 @@ import org.flowable.common.engine.impl.persistence.StrongUuidGenerator;
 import org.flowable.idm.spring.SpringIdmEngineConfiguration;
 import org.flowable.idm.spring.configurator.SpringIdmEngineConfigurator;
 import org.flowable.spring.SpringProcessEngineConfiguration;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.context.ConfigurableApplicationContext;
@@ -63,24 +62,12 @@ import org.springframework.core.io.Resource;
 import org.springframework.core.io.ResourceLoader;
 
 @EnableConfigurationProperties(WorkflowFlowableProperties.class)
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class FlowableWorkflowContext {
 
-    @Autowired
-    private WorkflowFlowableProperties props;
-
-    @Autowired
-    private ResourceLoader resourceLoader;
-
-    @Autowired
-    private ConfigurableApplicationContext ctx;
-
-    @Autowired
-    private SecurityProperties securityProperties;
-
     @ConditionalOnMissingBean
     @Bean
-    public SpringIdmEngineConfiguration syncopeIdmEngineConfiguration() {
+    public SpringIdmEngineConfiguration syncopeIdmEngineConfiguration(final ConfigurableApplicationContext ctx) {
         SpringIdmEngineConfiguration conf = new SpringIdmEngineConfiguration();
         conf.setIdmIdentityService(new SyncopeIdmIdentityService(conf, ctx));
         return conf;
@@ -88,9 +75,10 @@ public class FlowableWorkflowContext {
 
     @ConditionalOnMissingBean
     @Bean
-    public SpringIdmEngineConfigurator syncopeIdmEngineConfigurator() {
+    public SpringIdmEngineConfigurator syncopeIdmEngineConfigurator(
+        final SpringIdmEngineConfiguration syncopeIdmEngineConfiguration) {
         SpringIdmEngineConfigurator configurator = new SpringIdmEngineConfigurator();
-        configurator.setIdmEngineConfiguration(syncopeIdmEngineConfiguration());
+        configurator.setIdmEngineConfiguration(syncopeIdmEngineConfiguration);
         return configurator;
     }
 
@@ -102,15 +90,14 @@ public class FlowableWorkflowContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public FlowableBpmnProcessManager bpmnProcessManager(final DomainProcessEngine engine) {
         return new FlowableBpmnProcessManager(engine);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public FlowableUserRequestHandler userRequestHandler(
+            final SecurityProperties securityProperties,
             final UserDataBinder userDataBinder,
             final DomainProcessEngine engine,
             final UserDAO userDAO,
@@ -126,7 +113,6 @@ public class FlowableWorkflowContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public FlowableWorkflowUtils flowableUtils(final DomainProcessEngine engine) {
         return new FlowableWorkflowUtils(engine);
     }
@@ -146,34 +132,39 @@ public class FlowableWorkflowContext {
     @ConditionalOnMissingBean
     @Bean
     @Scope("prototype")
-    public SpringProcessEngineConfiguration processEngineConfiguration() {
+    public SpringProcessEngineConfiguration processEngineConfiguration(
+        final WorkflowFlowableProperties props,
+        final SpringIdmEngineConfigurator syncopeIdmEngineConfigurator,
+        final IdGenerator idGenerator,
+        final SyncopeEntitiesVariableType syncopeEntitiesVariableType,
+        final SyncopeFormHandlerHelper syncopeFormHandlerHelper) {
         SpringProcessEngineConfiguration conf = new SpringProcessEngineConfiguration();
         conf.setDatabaseSchemaUpdate(AbstractEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
         conf.setJpaHandleTransaction(true);
         conf.setJpaCloseEntityManager(false);
         conf.setHistoryLevel(props.getHistoryLevel());
-        conf.setIdmEngineConfigurator(syncopeIdmEngineConfigurator());
-        conf.setCustomPreVariableTypes(List.of(syncopeEntitiesVariableType()));
-        conf.setFormHandlerHelper(syncopeFormHandlerHelper());
-        conf.setIdGenerator(idGenerator());
+        conf.setIdmEngineConfigurator(syncopeIdmEngineConfigurator);
+        conf.setCustomPreVariableTypes(List.of(syncopeEntitiesVariableType));
+        conf.setFormHandlerHelper(syncopeFormHandlerHelper);
+        conf.setIdGenerator(idGenerator);
         conf.setPreBpmnParseHandlers(List.of(new ShellServiceTaskDisablingBpmnParseHandler()));
         return conf;
     }
 
     @ConditionalOnMissingBean
     @Bean
-    public DomainProcessEngineFactoryBean domainProcessEngineFactoryBean() {
+    public DomainProcessEngineFactoryBean domainProcessEngineFactoryBean(final ConfigurableApplicationContext ctx) {
         return new DomainProcessEngineFactoryBean(ctx);
     }
 
     @Bean
-    public Resource userWorkflowDef() {
+    public Resource userWorkflowDef(final WorkflowFlowableProperties props,
+                                    final ResourceLoader resourceLoader) {
         return resourceLoader.getResource(props.getUserWorkflowDef());
     }
 
     @ConditionalOnMissingBean(name = "flowableUWFAdapter")
     @Bean
-    @Autowired
     public UserWorkflowAdapter uwfAdapter(
             final UserDataBinder userDataBinder,
             final UserDAO userDAO,
@@ -191,14 +182,12 @@ public class FlowableWorkflowContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public AutoActivate autoActivate(final UserDataBinder userDataBinder, final UserDAO userDAO) {
         return new AutoActivate(userDataBinder, userDAO);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public Create create(final UserDataBinder userDataBinder, final EntityFactory entityFactory) {
         return new Create(userDataBinder, entityFactory);
     }
@@ -211,21 +200,18 @@ public class FlowableWorkflowContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public GenerateToken generateToken(final ConfParamOps confParamOps) {
         return new GenerateToken(confParamOps);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public Notify notify(final NotificationManager notificationManager) {
         return new Notify(notificationManager);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public PasswordReset passwordReset(final UserDataBinder userDataBinder, final UserDAO userDAO) {
         return new PasswordReset(userDataBinder, userDAO);
     }
@@ -244,7 +230,6 @@ public class FlowableWorkflowContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public Update update(final UserDataBinder userDataBinder, final UserDAO userDAO) {
         return new Update(userDataBinder, userDAO);
     }
diff --git a/ext/flowable/logic/src/main/java/org/apache/syncope/core/logic/FlowableLogicContext.java b/ext/flowable/logic/src/main/java/org/apache/syncope/core/logic/FlowableLogicContext.java
index 8f091dd..884e0d3 100644
--- a/ext/flowable/logic/src/main/java/org/apache/syncope/core/logic/FlowableLogicContext.java
+++ b/ext/flowable/logic/src/main/java/org/apache/syncope/core/logic/FlowableLogicContext.java
@@ -27,50 +27,37 @@ import org.apache.syncope.core.persistence.api.dao.UserDAO;
 import org.apache.syncope.core.provisioning.api.data.UserDataBinder;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationManager;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationTaskExecutor;
-import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.core.io.Resource;
 
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class FlowableLogicContext {
 
-    @javax.annotation.Resource(name = "userWorkflowDef")
-    private Resource userWorkflowDef;
-
-    @Autowired
-    private BpmnProcessManager bpmnProcessManager;
-
-    @Autowired
-    private PropagationManager propagationManager;
-
-    @Autowired
-    private PropagationTaskExecutor taskExecutor;
-
-    @Autowired
-    private UserDataBinder binder;
-
-    @Autowired
-    private UserDAO userDAO;
-
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
-    public FlowableLoader flowableLoader(final DomainProcessEngine engine) {
+    public FlowableLoader flowableLoader(final DomainProcessEngine engine,
+                                         @Qualifier("userWorkflowDef")
+                                         final Resource userWorkflowDef) {
         return new FlowableLoader(userWorkflowDef, engine);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    public BpmnProcessLogic bpmnProcessLogic() {
+    public BpmnProcessLogic bpmnProcessLogic(final BpmnProcessManager bpmnProcessManager) {
         return new BpmnProcessLogic(bpmnProcessManager);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
-    public UserRequestLogic userRequestLogic(final UserRequestHandler userRequestHandler) {
+    public UserRequestLogic userRequestLogic(final UserRequestHandler userRequestHandler,
+                                             final UserDataBinder binder,
+                                             final BpmnProcessManager bpmnProcessManager,
+                                             final PropagationTaskExecutor taskExecutor,
+                                             final UserDAO userDAO,
+                                             final PropagationManager propagationManager) {
         return new UserRequestLogic(
                 bpmnProcessManager,
                 userRequestHandler,
@@ -82,8 +69,11 @@ public class FlowableLogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
-    public UserWorkflowTaskLogic userWorkflowTaskLogic(final WorkflowTaskManager wfTaskManager) {
+    public UserWorkflowTaskLogic userWorkflowTaskLogic(final WorkflowTaskManager wfTaskManager,
+                                                       final UserDataBinder binder,
+                                                       final UserDAO userDAO,
+                                                       final PropagationTaskExecutor taskExecutor,
+                                                       final PropagationManager propagationManager) {
         return new UserWorkflowTaskLogic(wfTaskManager, propagationManager, taskExecutor, binder, userDAO);
     }
 }
diff --git a/ext/flowable/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/FlowableRESTCXFContext.java b/ext/flowable/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/FlowableRESTCXFContext.java
index 069dfa6..e2f3f79 100644
--- a/ext/flowable/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/FlowableRESTCXFContext.java
+++ b/ext/flowable/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/FlowableRESTCXFContext.java
@@ -28,31 +28,27 @@ import org.apache.syncope.core.persistence.api.dao.UserDAO;
 import org.apache.syncope.core.rest.cxf.service.BpmnProcessServiceImpl;
 import org.apache.syncope.core.rest.cxf.service.UserRequestServiceImpl;
 import org.apache.syncope.core.rest.cxf.service.UserWorkflowTaskServiceImpl;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class FlowableRESTCXFContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public BpmnProcessService bpmnProcessService(final BpmnProcessLogic bpmnProcessLogic) {
         return new BpmnProcessServiceImpl(bpmnProcessLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public UserRequestService userRequestService(final UserRequestLogic userRequestLogic, final UserDAO userDAO) {
         return new UserRequestServiceImpl(userRequestLogic, userDAO);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public UserWorkflowTaskService userWorkflowTaskService(final UserWorkflowTaskLogic userWorkflowTaskLogic) {
         return new UserWorkflowTaskServiceImpl(userWorkflowTaskLogic);
     }
diff --git a/ext/oidcc4ui/logic/src/main/java/org/apache/syncope/core/logic/OIDCC4UILogicContext.java b/ext/oidcc4ui/logic/src/main/java/org/apache/syncope/core/logic/OIDCC4UILogicContext.java
index 7746a0d..5dd2034 100644
--- a/ext/oidcc4ui/logic/src/main/java/org/apache/syncope/core/logic/OIDCC4UILogicContext.java
+++ b/ext/oidcc4ui/logic/src/main/java/org/apache/syncope/core/logic/OIDCC4UILogicContext.java
@@ -31,17 +31,13 @@ import org.apache.syncope.core.provisioning.api.data.UserDataBinder;
 import org.apache.syncope.core.provisioning.java.pushpull.InboundMatcher;
 import org.apache.syncope.core.provisioning.java.utils.TemplateUtils;
 import org.apache.syncope.core.spring.security.AuthDataAccessor;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class OIDCC4UILogicContext {
 
-    @Autowired
-    private OIDCC4UIProviderDAO opDAO;
-
     @ConditionalOnMissingBean
     @Bean
     public OIDCClientCache oidcClientCache() {
@@ -56,7 +52,6 @@ public class OIDCC4UILogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public OIDCUserManager oidcUserManager(
             final InboundMatcher inboundMatcher,
             final UserDAO userDAO,
@@ -76,20 +71,21 @@ public class OIDCC4UILogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public OIDCC4UILogic oidcc4UILogic(
+            final OIDCC4UIProviderDAO opDAO,
             final OIDCClientCache oidcClientCache,
             final AuthDataAccessor authDataAccessor,
             final AccessTokenDataBinder accessTokenDataBinder,
             final OIDCUserManager userManager) {
 
-        return new OIDCC4UILogic(oidcClientCache, authDataAccessor, accessTokenDataBinder, opDAO, userManager);
+        return new OIDCC4UILogic(oidcClientCache, authDataAccessor,
+            accessTokenDataBinder, opDAO, userManager);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public OIDCC4UIProviderLogic oidcc4UIProviderLogic(
+            final OIDCC4UIProviderDAO opDAO,
             final OIDCClientCache oidcClientCache,
             final OIDCC4UIProviderDataBinder binder) {
 
diff --git a/ext/oidcc4ui/logic/src/main/java/org/apache/syncope/core/logic/OIDCC4UIProviderLogic.java b/ext/oidcc4ui/logic/src/main/java/org/apache/syncope/core/logic/OIDCC4UIProviderLogic.java
index 64d418b..6949732 100644
--- a/ext/oidcc4ui/logic/src/main/java/org/apache/syncope/core/logic/OIDCC4UIProviderLogic.java
+++ b/ext/oidcc4ui/logic/src/main/java/org/apache/syncope/core/logic/OIDCC4UIProviderLogic.java
@@ -141,7 +141,7 @@ public class OIDCC4UIProviderLogic extends AbstractTransactionalLogic<OIDCC4UIPr
         if (key != null) {
             try {
                 return binder.getOIDCProviderTO(opDAO.find(key));
-            } catch (Throwable ignore) {
+            } catch (final Throwable ignore) {
                 LOG.debug("Unresolved reference", ignore);
                 throw new UnresolvedReferenceException(ignore);
             }
diff --git a/ext/oidcc4ui/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/OIDCC4UIPersistenceContext.java b/ext/oidcc4ui/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/OIDCC4UIPersistenceContext.java
index 746f539..0fd0b0a 100644
--- a/ext/oidcc4ui/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/OIDCC4UIPersistenceContext.java
+++ b/ext/oidcc4ui/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/OIDCC4UIPersistenceContext.java
@@ -26,7 +26,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class OIDCC4UIPersistenceContext {
 
     @ConditionalOnMissingBean
diff --git a/ext/oidcc4ui/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/OIDCC4UIProvisioningContext.java b/ext/oidcc4ui/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/OIDCC4UIProvisioningContext.java
index 02b49d2..844584a 100644
--- a/ext/oidcc4ui/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/OIDCC4UIProvisioningContext.java
+++ b/ext/oidcc4ui/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/OIDCC4UIProvisioningContext.java
@@ -24,17 +24,15 @@ import org.apache.syncope.core.persistence.api.dao.OIDCC4UIProviderDAO;
 import org.apache.syncope.core.persistence.api.entity.OIDCC4UIEntityFactory;
 import org.apache.syncope.core.provisioning.api.IntAttrNameParser;
 import org.apache.syncope.core.provisioning.api.data.OIDCC4UIProviderDataBinder;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class OIDCC4UIProvisioningContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public OIDCC4UIProviderDataBinder oidcc4UIProviderDataBinder(
             final AnyTypeDAO anyTypeDAO,
             final OIDCC4UIProviderDAO oidcOPDAO,
diff --git a/ext/oidcc4ui/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/OIDCC4UIRESTCXFContext.java b/ext/oidcc4ui/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/OIDCC4UIRESTCXFContext.java
index 71e97f2..9c0f12e 100644
--- a/ext/oidcc4ui/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/OIDCC4UIRESTCXFContext.java
+++ b/ext/oidcc4ui/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/OIDCC4UIRESTCXFContext.java
@@ -24,24 +24,21 @@ import org.apache.syncope.core.logic.OIDCC4UILogic;
 import org.apache.syncope.core.logic.OIDCC4UIProviderLogic;
 import org.apache.syncope.core.rest.cxf.service.OIDCC4UIProviderServiceImpl;
 import org.apache.syncope.core.rest.cxf.service.OIDCC4UIServiceImpl;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class OIDCC4UIRESTCXFContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public OIDCC4UIService oidcc4UIService(final OIDCC4UILogic oidcc4UILogic) {
         return new OIDCC4UIServiceImpl(oidcc4UILogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public OIDCC4UIProviderService oidcc4UIProviderService(final OIDCC4UIProviderLogic oidcc4UIProviderLogic) {
         return new OIDCC4UIProviderServiceImpl(oidcc4UIProviderLogic);
     }
diff --git a/ext/saml2sp4ui/logic/src/main/java/org/apache/syncope/core/logic/SAML2SP4UILogicContext.java b/ext/saml2sp4ui/logic/src/main/java/org/apache/syncope/core/logic/SAML2SP4UILogicContext.java
index 31ab904..5b1e86b 100644
--- a/ext/saml2sp4ui/logic/src/main/java/org/apache/syncope/core/logic/SAML2SP4UILogicContext.java
+++ b/ext/saml2sp4ui/logic/src/main/java/org/apache/syncope/core/logic/SAML2SP4UILogicContext.java
@@ -31,7 +31,6 @@ import org.apache.syncope.core.provisioning.api.data.UserDataBinder;
 import org.apache.syncope.core.provisioning.java.pushpull.InboundMatcher;
 import org.apache.syncope.core.provisioning.java.utils.TemplateUtils;
 import org.apache.syncope.core.spring.security.AuthDataAccessor;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.context.annotation.Bean;
@@ -39,15 +38,9 @@ import org.springframework.context.annotation.Configuration;
 import org.springframework.core.io.support.ResourcePatternResolver;
 
 @EnableConfigurationProperties(SAML2SP4UIProperties.class)
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class SAML2SP4UILogicContext {
 
-    @Autowired
-    private SAML2SP4UIProperties props;
-
-    @Autowired
-    private SAML2SP4UIIdPDAO idpDAO;
-
     @ConditionalOnMissingBean
     @Bean
     public SAML2ClientCache saml2ClientCache() {
@@ -56,15 +49,15 @@ public class SAML2SP4UILogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
-    public SAML2SP4UILoader saml2SP4UILoader(final ResourcePatternResolver resourceResolver) {
+    public SAML2SP4UILoader saml2SP4UILoader(final ResourcePatternResolver resourceResolver,
+                                             final SAML2SP4UIProperties props) {
         return new SAML2SP4UILoader(props, resourceResolver);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public SAML2SP4UIIdPLogic saml2SP4UIIdPLogic(
+            final SAML2SP4UIIdPDAO idpDAO,
             final SAML2ClientCache saml2ClientCache,
             final SAML2SP4UILoader loader,
             final SAML2SP4UIIdPDataBinder binder) {
@@ -74,8 +67,8 @@ public class SAML2SP4UILogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public SAML2SP4UIUserManager saml2SP4UIUserManager(
+            final SAML2SP4UIIdPDAO idpDAO,
             final InboundMatcher inboundMatcher,
             final UserDAO userDAO,
             final IntAttrNameParser intAttrNameParser,
@@ -95,8 +88,8 @@ public class SAML2SP4UILogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public SAML2SP4UILogic saml2SP4UILogic(
+            final SAML2SP4UIIdPDAO idpDAO,
             final SAML2ClientCache saml2ClientCache,
             final SAML2SP4UILoader loader,
             final AccessTokenDataBinder accessTokenDataBinder,
diff --git a/ext/saml2sp4ui/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/SAML2SP4UIPersistenceContext.java b/ext/saml2sp4ui/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/SAML2SP4UIPersistenceContext.java
index 1098af2..9c4816d 100644
--- a/ext/saml2sp4ui/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/SAML2SP4UIPersistenceContext.java
+++ b/ext/saml2sp4ui/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/SAML2SP4UIPersistenceContext.java
@@ -26,7 +26,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class SAML2SP4UIPersistenceContext {
 
     @ConditionalOnMissingBean
diff --git a/ext/saml2sp4ui/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/SAML2SP4UIProvisioningContext.java b/ext/saml2sp4ui/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/SAML2SP4UIProvisioningContext.java
index e092568..47296eb 100644
--- a/ext/saml2sp4ui/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/SAML2SP4UIProvisioningContext.java
+++ b/ext/saml2sp4ui/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/SAML2SP4UIProvisioningContext.java
@@ -25,17 +25,15 @@ import org.apache.syncope.core.persistence.api.entity.SAML2SP4UIEntityFactory;
 import org.apache.syncope.core.provisioning.api.IntAttrNameParser;
 import org.apache.syncope.core.provisioning.api.data.SAML2SP4UIIdPDataBinder;
 import org.apache.syncope.core.provisioning.java.data.SAML2SP4UIIdPDataBinderImpl;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class SAML2SP4UIProvisioningContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public SAML2SP4UIIdPDataBinder saml2SP4UIIdPDataBinder(
             final AnyTypeDAO anyTypeDAO,
             final SAML2SP4UIIdPDAO idapDAO,
diff --git a/ext/saml2sp4ui/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/SAML2SP4UIRESTCXFContext.java b/ext/saml2sp4ui/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/SAML2SP4UIRESTCXFContext.java
index 427ca34..a608dfe 100644
--- a/ext/saml2sp4ui/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/SAML2SP4UIRESTCXFContext.java
+++ b/ext/saml2sp4ui/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/SAML2SP4UIRESTCXFContext.java
@@ -24,24 +24,21 @@ import org.apache.syncope.core.logic.SAML2SP4UIIdPLogic;
 import org.apache.syncope.core.logic.SAML2SP4UILogic;
 import org.apache.syncope.core.rest.cxf.service.SAML2SP4UIIdPServiceImpl;
 import org.apache.syncope.core.rest.cxf.service.SAML2SP4UIServiceImpl;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class SAML2SP4UIRESTCXFContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public SAML2SP4UIService saml2SP4UIService(final SAML2SP4UILogic saml2SP4UIService) {
         return new SAML2SP4UIServiceImpl(saml2SP4UIService);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public SAML2SP4UIIdPService saml2SP4UIIdPService(final SAML2SP4UIIdPLogic saml2SP4UIIdPLogic) {
         return new SAML2SP4UIIdPServiceImpl(saml2SP4UIIdPLogic);
     }
diff --git a/ext/scimv2/logic/src/main/java/org/apache/syncope/core/logic/SCIMLogicContext.java b/ext/scimv2/logic/src/main/java/org/apache/syncope/core/logic/SCIMLogicContext.java
index e48748f..559146e 100644
--- a/ext/scimv2/logic/src/main/java/org/apache/syncope/core/logic/SCIMLogicContext.java
+++ b/ext/scimv2/logic/src/main/java/org/apache/syncope/core/logic/SCIMLogicContext.java
@@ -22,12 +22,11 @@ import org.apache.syncope.common.keymaster.client.api.ConfParamOps;
 import org.apache.syncope.core.logic.init.SCIMLoader;
 import org.apache.syncope.core.logic.scim.SCIMConfManager;
 import org.apache.syncope.core.spring.security.AuthDataAccessor;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class SCIMLogicContext {
 
     @ConditionalOnMissingBean
@@ -38,14 +37,12 @@ public class SCIMLogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public SCIMConfManager scimConfManager(final ConfParamOps confParamOps, final SchemaLogic schemaLogic) {
         return new SCIMConfManager(confParamOps, schemaLogic);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public SCIMDataBinder scimDataBinder(
             final SCIMConfManager confManager,
             final UserLogic userLogic,
@@ -56,7 +53,6 @@ public class SCIMLogicContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public SCIMLogic scimLogic(final SCIMConfManager confManager) {
         return new SCIMLogic(confManager);
     }
diff --git a/ext/scimv2/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/SCIMRESTCXFContext.java b/ext/scimv2/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/SCIMRESTCXFContext.java
index 7570bd5..e94a747 100644
--- a/ext/scimv2/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/SCIMRESTCXFContext.java
+++ b/ext/scimv2/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/SCIMRESTCXFContext.java
@@ -21,17 +21,15 @@ package org.apache.syncope.core.rest.cxf;
 import org.apache.syncope.common.rest.api.service.SCIMConfService;
 import org.apache.syncope.core.logic.scim.SCIMConfManager;
 import org.apache.syncope.core.rest.cxf.service.SCIMConfServiceImpl;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class SCIMRESTCXFContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public SCIMConfService scimConfService(final SCIMConfManager scimConfManager) {
         return new SCIMConfServiceImpl(scimConfManager);
     }
diff --git a/ext/scimv2/scim-rest-cxf/src/main/java/org/apache/syncope/ext/scimv2/cxf/SCIMv2RESTCXFContext.java b/ext/scimv2/scim-rest-cxf/src/main/java/org/apache/syncope/ext/scimv2/cxf/SCIMv2RESTCXFContext.java
index 1046020..abc84e0 100644
--- a/ext/scimv2/scim-rest-cxf/src/main/java/org/apache/syncope/ext/scimv2/cxf/SCIMv2RESTCXFContext.java
+++ b/ext/scimv2/scim-rest-cxf/src/main/java/org/apache/syncope/ext/scimv2/cxf/SCIMv2RESTCXFContext.java
@@ -40,21 +40,14 @@ import org.apache.syncope.ext.scimv2.api.service.UserService;
 import org.apache.syncope.ext.scimv2.cxf.service.GroupServiceImpl;
 import org.apache.syncope.ext.scimv2.cxf.service.SCIMServiceImpl;
 import org.apache.syncope.ext.scimv2.cxf.service.UserServiceImpl;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class SCIMv2RESTCXFContext {
 
-    @Autowired
-    private Bus bus;
-
-    @Autowired
-    private ApplicationContext ctx;
-
     @ConditionalOnMissingBean
     @Bean
     public SCIMJacksonJsonProvider scimJacksonJsonProvider() {
@@ -75,7 +68,10 @@ public class SCIMv2RESTCXFContext {
 
     @ConditionalOnMissingBean(name = "scimv2Container")
     @Bean
-    public Server scimv2Container() {
+    public Server scimv2Container(final ApplicationContext ctx, final Bus bus,
+                                  final SCIMJacksonJsonProvider scimJacksonJsonProvider,
+                                  final SCIMExceptionMapper scimExceptionMapper,
+                                  final AddETagFilter scimAddETagFilter) {
         SpringJAXRSServerFactoryBean scimv2Container = new SpringJAXRSServerFactoryBean();
         scimv2Container.setBus(bus);
         scimv2Container.setAddress("/scim");
@@ -93,9 +89,9 @@ public class SCIMv2RESTCXFContext {
                 ctx.getBean(GZIPOutInterceptor.class)));
 
         scimv2Container.setProviders(List.of(
-                scimJacksonJsonProvider(),
-                scimExceptionMapper(),
-                scimAddETagFilter()));
+                scimJacksonJsonProvider,
+                scimExceptionMapper,
+                scimAddETagFilter));
 
         scimv2Container.setApplicationContext(ctx);
         return scimv2Container.create();
@@ -103,7 +99,6 @@ public class SCIMv2RESTCXFContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public SCIMService scimService(
             final UserDAO userDAO,
             final GroupDAO groupDAO,
@@ -118,7 +113,6 @@ public class SCIMv2RESTCXFContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public GroupService scimv2GroupService(
             final UserDAO userDAO,
             final GroupDAO groupDAO,
@@ -132,7 +126,6 @@ public class SCIMv2RESTCXFContext {
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public UserService scimv2UserService(
             final UserDAO userDAO,
             final GroupDAO groupDAO,
diff --git a/fit/build-tools/src/main/java/org/apache/syncope/fit/buildtools/SyncopeBuildToolsApplication.java b/fit/build-tools/src/main/java/org/apache/syncope/fit/buildtools/SyncopeBuildToolsApplication.java
index 55ee22b..ec1ea72 100644
--- a/fit/build-tools/src/main/java/org/apache/syncope/fit/buildtools/SyncopeBuildToolsApplication.java
+++ b/fit/build-tools/src/main/java/org/apache/syncope/fit/buildtools/SyncopeBuildToolsApplication.java
@@ -34,7 +34,6 @@ import org.apache.syncope.fit.buildtools.cxf.DateParamConverterProvider;
 import org.apache.syncope.fit.buildtools.cxf.GreenMailService;
 import org.apache.syncope.fit.buildtools.cxf.ProvisioningImpl;
 import org.apache.syncope.fit.buildtools.cxf.UserService;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.SpringApplication;
@@ -50,7 +49,7 @@ import org.springframework.jdbc.datasource.DriverManagerDataSource;
 @SpringBootApplication(exclude = {
     ErrorMvcAutoConfiguration.class,
     WebMvcAutoConfiguration.class,
-    HttpMessageConvertersAutoConfiguration.class })
+    HttpMessageConvertersAutoConfiguration.class }, proxyBeanMethods = false)
 public class SyncopeBuildToolsApplication extends SpringBootServletInitializer {
 
     public static void main(final String[] args) {
@@ -69,12 +68,6 @@ public class SyncopeBuildToolsApplication extends SpringBootServletInitializer {
     @Value("${testdb.password}")
     private String testDbPassword;
 
-    @Autowired
-    private Bus bus;
-
-    @Autowired
-    private ApplicationContext ctx;
-
     @Bean
     public DriverManagerDataSource testDataSource() {
         DriverManagerDataSource testDataSource = new DriverManagerDataSource(testDbUrl, testDbUsername, testDbPassword);
@@ -83,14 +76,13 @@ public class SyncopeBuildToolsApplication extends SpringBootServletInitializer {
     }
 
     @Bean
-    @Autowired
     public Provisioning provisioningImpl(@Qualifier("testDataSource") final DataSource dataSource) {
         return new ProvisioningImpl(dataSource);
     }
 
     @Bean
-    @Autowired
-    public Endpoint soapProvisioning(final Provisioning provisioning) {
+    public Endpoint soapProvisioning(final Provisioning provisioning,
+                                     final Bus bus) {
         EndpointImpl soapProvisioning = new EndpointImpl(provisioning);
         soapProvisioning.setBus(bus);
         soapProvisioning.publish("/soap");
@@ -108,8 +100,8 @@ public class SyncopeBuildToolsApplication extends SpringBootServletInitializer {
     }
 
     @Bean
-    @Autowired
-    public Server restProvisioning(final GreenMailService greenMailService, final UserService userService) {
+    public Server restProvisioning(final GreenMailService greenMailService, final UserService userService,
+                                   final ApplicationContext ctx, final Bus bus) {
         SpringJAXRSServerFactoryBean restProvisioning = new SpringJAXRSServerFactoryBean();
         restProvisioning.setApplicationContext(ctx);
         restProvisioning.setBus(bus);
diff --git a/fit/core-reference/src/main/java-all/org/apache/syncope/fit/core/reference/flowable/AssignDirectorGroup.java b/fit/core-reference/src/main/java-all/org/apache/syncope/fit/core/reference/flowable/AssignDirectorGroup.java
index 7ed5bd5..523385c 100644
--- a/fit/core-reference/src/main/java-all/org/apache/syncope/fit/core/reference/flowable/AssignDirectorGroup.java
+++ b/fit/core-reference/src/main/java-all/org/apache/syncope/fit/core/reference/flowable/AssignDirectorGroup.java
@@ -28,17 +28,15 @@ import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.core.provisioning.api.data.UserDataBinder;
 import org.flowable.engine.delegate.DelegateExecution;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
 
-@Component
 public class AssignDirectorGroup extends FlowableServiceTask {
+    private final UserDataBinder dataBinder;
+    private final UserDAO userDAO;
 
-    @Autowired
-    private UserDataBinder dataBinder;
-
-    @Autowired
-    private UserDAO userDAO;
+    public AssignDirectorGroup(final UserDataBinder dataBinder, final UserDAO userDAO) {
+        this.dataBinder = dataBinder;
+        this.userDAO = userDAO;
+    }
 
     @Override
     protected void doExecute(final DelegateExecution execution) {
diff --git a/fit/core-reference/src/main/java-all/org/apache/syncope/fit/core/reference/flowable/CreateARelationship.java b/fit/core-reference/src/main/java-all/org/apache/syncope/fit/core/reference/flowable/CreateARelationship.java
index 1ca0940..e781bf4 100644
--- a/fit/core-reference/src/main/java-all/org/apache/syncope/fit/core/reference/flowable/CreateARelationship.java
+++ b/fit/core-reference/src/main/java-all/org/apache/syncope/fit/core/reference/flowable/CreateARelationship.java
@@ -29,17 +29,17 @@ import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.core.provisioning.api.data.UserDataBinder;
 import org.flowable.engine.delegate.DelegateExecution;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
 
-@Component
 public class CreateARelationship extends FlowableServiceTask {
 
-    @Autowired
-    private UserDataBinder dataBinder;
+    private final UserDataBinder dataBinder;
 
-    @Autowired
-    private UserDAO userDAO;
+    private final UserDAO userDAO;
+
+    public CreateARelationship(final UserDataBinder dataBinder, final UserDAO userDAO) {
+        this.dataBinder = dataBinder;
+        this.userDAO = userDAO;
+    }
 
     @Override
     protected void doExecute(final DelegateExecution execution) {
diff --git a/client/am/console/src/main/java/org/apache/syncope/client/console/SyncopeAMConsoleContext.java b/fit/core-reference/src/main/java-all/org/apache/syncope/fit/core/reference/flowable/FlowableConfiguration.java
similarity index 51%
copy from client/am/console/src/main/java/org/apache/syncope/client/console/SyncopeAMConsoleContext.java
copy to fit/core-reference/src/main/java-all/org/apache/syncope/fit/core/reference/flowable/FlowableConfiguration.java
index e3ff01a..6adbde0 100644
--- a/client/am/console/src/main/java/org/apache/syncope/client/console/SyncopeAMConsoleContext.java
+++ b/fit/core-reference/src/main/java-all/org/apache/syncope/fit/core/reference/flowable/FlowableConfiguration.java
@@ -16,32 +16,31 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.syncope.client.console;
 
-import org.apache.syncope.client.console.commons.AMPolicyTabProvider;
-import org.apache.syncope.client.console.commons.AMRealmPolicyProvider;
-import org.apache.syncope.client.console.commons.PolicyTabProvider;
-import org.apache.syncope.client.console.commons.RealmPolicyProvider;
-import org.apache.syncope.client.console.init.AMClassPathScanImplementationContributor;
-import org.apache.syncope.client.console.init.ClassPathScanImplementationContributor;
+package org.apache.syncope.fit.core.reference.flowable;
+
+import org.apache.syncope.core.persistence.api.dao.AnySearchDAO;
+import org.apache.syncope.core.persistence.api.dao.UserDAO;
+import org.apache.syncope.core.provisioning.api.data.UserDataBinder;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
-@Configuration
-public class SyncopeAMConsoleContext {
-
+@Configuration(proxyBeanMethods = false)
+public class FlowableConfiguration {
     @Bean
-    public ClassPathScanImplementationContributor amClassPathScanImplementationContributor() {
-        return new AMClassPathScanImplementationContributor();
+    public AssignDirectorGroup assignDirectorGroup(final UserDataBinder dataBinder,
+                                                   final UserDAO userDAO) {
+        return new AssignDirectorGroup(dataBinder, userDAO);
     }
 
     @Bean
-    public RealmPolicyProvider realmPolicyProvider() {
-        return new AMRealmPolicyProvider();
+    public CreateARelationship createARelationship(final UserDataBinder dataBinder,
+                                                   final UserDAO userDAO) {
+        return new CreateARelationship(dataBinder, userDAO);
     }
 
     @Bean
-    public PolicyTabProvider amPolicyTabProvider() {
-        return new AMPolicyTabProvider();
+    public PrintersValueProvider printersValueProvider(final AnySearchDAO anySearchDAO) {
+        return new PrintersValueProvider(anySearchDAO);
     }
 }
diff --git a/fit/core-reference/src/main/java-all/org/apache/syncope/fit/core/reference/flowable/PrintersValueProvider.java b/fit/core-reference/src/main/java-all/org/apache/syncope/fit/core/reference/flowable/PrintersValueProvider.java
index ae56169..00672dc 100644
--- a/fit/core-reference/src/main/java-all/org/apache/syncope/fit/core/reference/flowable/PrintersValueProvider.java
+++ b/fit/core-reference/src/main/java-all/org/apache/syncope/fit/core/reference/flowable/PrintersValueProvider.java
@@ -29,11 +29,8 @@ import org.apache.syncope.core.persistence.api.dao.search.AnyTypeCond;
 import org.apache.syncope.core.persistence.api.dao.search.OrderByClause;
 import org.apache.syncope.core.persistence.api.dao.search.SearchCond;
 import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 
-@Component
 public class PrintersValueProvider implements DropdownValueProvider {
 
     private static final SearchCond PRINTER_COND;
@@ -51,8 +48,11 @@ public class PrintersValueProvider implements DropdownValueProvider {
         ORDER_BY = List.of(orderByNameAsc);
     }
 
-    @Autowired
-    private AnySearchDAO anySearchDAO;
+    private final AnySearchDAO anySearchDAO;
+
+    public PrintersValueProvider(final AnySearchDAO anySearchDAO) {
+        this.anySearchDAO = anySearchDAO;
+    }
 
     @Transactional(readOnly = true)
     @Override
diff --git a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/CoreReferenceContext.java b/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/CoreReferenceContext.java
index 8a120fb..81534b7 100644
--- a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/CoreReferenceContext.java
+++ b/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/CoreReferenceContext.java
@@ -26,7 +26,6 @@ import org.apache.syncope.core.persistence.api.dao.ImplementationDAO;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
 import org.apache.syncope.core.persistence.api.entity.EntityFactory;
 import org.apache.syncope.core.workflow.api.UserWorkflowAdapter;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.AutoConfigureBefore;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.ComponentScan;
@@ -34,11 +33,10 @@ import org.springframework.context.annotation.Configuration;
 
 @AutoConfigureBefore(IdRepoLogicContext.class)
 @ComponentScan("org.apache.syncope.fit.core.reference")
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class CoreReferenceContext {
 
     @Bean
-    @Autowired
     public ElasticsearchInit elasticsearchInit(
             final ImplementationDAO implementationDAO,
             final EntityFactory entityFactory,
@@ -48,13 +46,11 @@ public class CoreReferenceContext {
     }
 
     @Bean
-    @Autowired
     public EnableFlowableForTestUsers enableFlowableForTestUsers(final UserDAO userDAO) {
         return new EnableFlowableForTestUsers(userDAO);
     }
 
     @Bean
-    @Autowired
     public ImplementationLookup implementationLookup(
             final UserWorkflowAdapter uwf,
             final AnySearchDAO anySearchDAO,
diff --git a/fit/core-reference/src/main/resources/log4j2.xml b/fit/core-reference/src/main/resources/log4j2.xml
index acecff4..a224040 100644
--- a/fit/core-reference/src/main/resources/log4j2.xml
+++ b/fit/core-reference/src/main/resources/log4j2.xml
@@ -20,7 +20,6 @@ under the License.
 <configuration status="WARN">
 
   <appenders>
-
     <RollingRandomAccessFile name="main" fileName="${log.directory}/core.log"
                              filePattern="${log.directory}/core-%d{yyyy-MM-dd}.log.gz"
                              immediateFlush="false" append="true">
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AbstractConsoleITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AbstractConsoleITCase.java
index 2e5e220..985da5c 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AbstractConsoleITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/console/AbstractConsoleITCase.java
@@ -60,7 +60,7 @@ import org.springframework.test.context.support.TestPropertySourceUtils;
 public abstract class AbstractConsoleITCase extends AbstractUIITCase {
 
     @ImportAutoConfiguration(classes = { SelfKeymasterClientContext.class, ZookeeperKeymasterClientContext.class })
-    @Configuration
+    @Configuration(proxyBeanMethods = false)
     public static class SyncopeConsoleWebApplicationTestConfig {
 
         @Bean
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/CoreITContext.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/CoreITContext.java
index a85f4d0..b0fad17 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/CoreITContext.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/CoreITContext.java
@@ -26,7 +26,7 @@ import org.springframework.context.annotation.PropertySource;
 import org.springframework.jdbc.datasource.DriverManagerDataSource;
 
 @PropertySource("classpath:test.properties")
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class CoreITContext {
 
     @Value("${testdb.driver}")
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/enduser/AbstractEnduserITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/enduser/AbstractEnduserITCase.java
index 0e08057..f8788ed 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/enduser/AbstractEnduserITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/enduser/AbstractEnduserITCase.java
@@ -64,7 +64,7 @@ import org.springframework.test.context.support.TestPropertySourceUtils;
 public abstract class AbstractEnduserITCase extends AbstractUIITCase {
 
     @ImportAutoConfiguration(classes = { SelfKeymasterClientContext.class, ZookeeperKeymasterClientContext.class })
-    @Configuration
+    @Configuration(proxyBeanMethods = false)
     public static class SyncopeEnduserWebApplicationTestConfig {
 
         @Bean
diff --git a/fit/wa-reference/src/main/resources/log4j2.xml b/fit/wa-reference/src/main/resources/log4j2.xml
index 5eca0fd..c126ea3 100644
--- a/fit/wa-reference/src/main/resources/log4j2.xml
+++ b/fit/wa-reference/src/main/resources/log4j2.xml
@@ -63,7 +63,7 @@ under the License.
       <appender-ref ref="main"/>
     </asyncLogger>
 
-    <asyncLogger name="org.apache.cxf" additivity="false" level="ERROR">
+    <asyncLogger name="org.apache.cxf" additivity="false" level="DEBUG">
       <appender-ref ref="main"/>
     </asyncLogger>
 
diff --git a/fit/wa-reference/src/test/resources/log4j2.xml b/fit/wa-reference/src/test/resources/log4j2.xml
index 759b411..d27ffdf 100644
--- a/fit/wa-reference/src/test/resources/log4j2.xml
+++ b/fit/wa-reference/src/test/resources/log4j2.xml
@@ -45,7 +45,11 @@ under the License.
       <appender-ref ref="main"/>
     </asyncLogger>
 
-    <asyncLogger name="org.apache.cxf" additivity="false" level="ERROR">
+    <asyncLogger name="org.springframework.security" additivity="false" level="DEBUG">
+      <appender-ref ref="main"/>
+    </asyncLogger>
+
+    <asyncLogger name="org.apache.cxf" additivity="false" level="DEBUG">
       <appender-ref ref="main"/>
     </asyncLogger>
 
diff --git a/sra/src/main/java/org/apache/syncope/sra/SecurityConfig.java b/sra/src/main/java/org/apache/syncope/sra/SecurityConfig.java
index e3e75b6..14aeb37 100644
--- a/sra/src/main/java/org/apache/syncope/sra/SecurityConfig.java
+++ b/sra/src/main/java/org/apache/syncope/sra/SecurityConfig.java
@@ -40,7 +40,8 @@ import org.pac4j.core.http.callback.NoParameterCallbackUrlResolver;
 import org.pac4j.saml.client.SAML2Client;
 import org.pac4j.saml.config.SAML2Configuration;
 import org.pac4j.saml.metadata.keystore.BaseSAML2KeystoreGenerator;
-import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.ObjectProvider;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.actuate.autoconfigure.security.reactive.EndpointRequest;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -56,11 +57,13 @@ import org.springframework.http.HttpMethod;
 import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
 import org.springframework.security.config.web.server.ServerHttpSecurity;
 import org.springframework.security.core.userdetails.MapReactiveUserDetailsService;
+import org.springframework.security.core.userdetails.ReactiveUserDetailsService;
 import org.springframework.security.core.userdetails.User;
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.security.oauth2.client.registration.ClientRegistration;
 import org.springframework.security.oauth2.client.registration.ClientRegistrations;
 import org.springframework.security.oauth2.client.registration.InMemoryReactiveClientRegistrationRepository;
+import org.springframework.security.oauth2.client.registration.ReactiveClientRegistrationRepository;
 import org.springframework.security.oauth2.core.AuthorizationGrantType;
 import org.springframework.security.oauth2.core.OAuth2TokenValidator;
 import org.springframework.security.oauth2.jose.jws.SignatureAlgorithm;
@@ -76,15 +79,9 @@ import org.springframework.security.web.server.util.matcher.ServerWebExchangeMat
 import reactor.core.publisher.Mono;
 
 @EnableWebFluxSecurity
-@Configuration
+@Configuration(proxyBeanMethods = false)
 public class SecurityConfig {
 
-    @Autowired
-    private ResourcePatternResolver resourceResolver;
-
-    @Autowired
-    private SRAProperties props;
-
     @Bean
     @Order(0)
     @ConditionalOnProperty(prefix = SRAProperties.PREFIX, name = SRAProperties.AM_TYPE, havingValue = "SAML2")
@@ -109,7 +106,7 @@ public class SecurityConfig {
     }
 
     @Bean
-    public MapReactiveUserDetailsService userDetailsService() {
+    public ReactiveUserDetailsService userDetailsService(final SRAProperties props) {
         UserDetails user = User.builder().
                 username(props.getAnonymousUser()).
                 password("{noop}" + props.getAnonymousKey()).
@@ -120,20 +117,26 @@ public class SecurityConfig {
 
     @Bean
     @ConditionalOnProperty(prefix = SRAProperties.PREFIX, name = SRAProperties.AM_TYPE, havingValue = "OIDC")
-    public InMemoryReactiveClientRegistrationRepository oidcClientRegistrationRepository() {
-        return new InMemoryReactiveClientRegistrationRepository(
-                ClientRegistrations.fromOidcIssuerLocation(props.getOidc().getConfiguration()).
-                        registrationId(SRAProperties.AMType.OIDC.name()).
-                        clientId(props.getOidc().getClientId()).
-                        clientSecret(props.getOidc().getClientSecret()).
-                        scope(props.getOidc().getScopes().toArray(new String[0])).
-                        build());
+    public ClientRegistration oidcClientRegistration(final SRAProperties props) {
+        return ClientRegistrations.fromOidcIssuerLocation(props.getOidc().getConfiguration()).
+            registrationId(SRAProperties.AMType.OIDC.name()).
+            clientId(props.getOidc().getClientId()).
+            clientSecret(props.getOidc().getClientSecret()).
+            scope(props.getOidc().getScopes().toArray(new String[0])).
+            build();
+    }
+
+    @Bean
+    @ConditionalOnProperty(prefix = SRAProperties.PREFIX, name = SRAProperties.AM_TYPE, havingValue = "OIDC")
+    public ReactiveClientRegistrationRepository oidcClientRegistrationRepository(
+        @Qualifier("oidcClientRegistration") final ClientRegistration oidcClientRegistration) {
+        return new InMemoryReactiveClientRegistrationRepository(oidcClientRegistration);
     }
 
     @Bean
     @ConditionalOnMissingBean
     @ConditionalOnProperty(prefix = SRAProperties.PREFIX, name = SRAProperties.AM_TYPE, havingValue = "OIDC")
-    public OAuth2TokenValidator<Jwt> oidcJWTValidator() {
+    public OAuth2TokenValidator<Jwt> oidcJWTValidator(final SRAProperties props) {
         return JwtValidators.createDefaultWithIssuer(props.getOidc().getConfiguration());
     }
 
@@ -146,39 +149,51 @@ public class SecurityConfig {
     @Bean
     @ConditionalOnMissingBean
     @ConditionalOnProperty(prefix = SRAProperties.PREFIX, name = SRAProperties.AM_TYPE, havingValue = "OIDC")
-    public ReactiveJwtDecoder oidcJWTDecoder() {
-        String jwkSetUri = oidcClientRegistrationRepository().iterator().next().getProviderDetails().getJwkSetUri();
+    public ReactiveJwtDecoder oidcJWTDecoder(
+        @Qualifier("oidcClientRegistration")
+        final ClientRegistration oidcClientRegistration,
+        @Qualifier("oidcJWTValidator")
+        final OAuth2TokenValidator<Jwt> oidcJWTValidator,
+        @Qualifier("jwtClaimSetConverter")
+        final Converter<Map<String, Object>, Map<String, Object>> jwtClaimSetConverter) {
+        String jwkSetUri = oidcClientRegistration.getProviderDetails().getJwkSetUri();
         NimbusReactiveJwtDecoder jwtDecoder = NimbusReactiveJwtDecoder.withJwkSetUri(jwkSetUri)
             .jwsAlgorithm(SignatureAlgorithm.RS256)
             .jwsAlgorithm(SignatureAlgorithm.RS512)
             .build();
-        jwtDecoder.setJwtValidator(oidcJWTValidator());
-        jwtDecoder.setClaimSetConverter(jwtClaimSetConverter());
+        jwtDecoder.setJwtValidator(oidcJWTValidator);
+        jwtDecoder.setClaimSetConverter(jwtClaimSetConverter);
         return jwtDecoder;
     }
 
     @Bean
     @ConditionalOnProperty(prefix = SRAProperties.PREFIX, name = SRAProperties.AM_TYPE, havingValue = "OAUTH2")
-    public InMemoryReactiveClientRegistrationRepository oauth2ClientRegistrationRepository() {
-        return new InMemoryReactiveClientRegistrationRepository(
-                ClientRegistration.withRegistrationId(SRAProperties.AMType.OAUTH2.name()).
-                        redirectUri("{baseUrl}/{action}/oauth2/code/{registrationId}").
-                        tokenUri(props.getOauth2().getTokenUri()).
-                        authorizationUri(props.getOauth2().getAuthorizationUri()).
-                        userInfoUri(props.getOauth2().getUserInfoUri()).
-                        userNameAttributeName(props.getOauth2().getUserNameAttributeName()).
-                        clientId(props.getOauth2().getClientId()).
-                        clientSecret(props.getOauth2().getClientSecret()).
-                        scope(props.getOauth2().getScopes().toArray(new String[0])).
-                        authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE).
-                        jwkSetUri(props.getOauth2().getJwkSetUri()).
-                        build());
+    public ClientRegistration oauth2ClientRegistration(final SRAProperties props) {
+        return ClientRegistration.withRegistrationId(SRAProperties.AMType.OAUTH2.name()).
+            redirectUri("{baseUrl}/{action}/oauth2/code/{registrationId}").
+            tokenUri(props.getOauth2().getTokenUri()).
+            authorizationUri(props.getOauth2().getAuthorizationUri()).
+            userInfoUri(props.getOauth2().getUserInfoUri()).
+            userNameAttributeName(props.getOauth2().getUserNameAttributeName()).
+            clientId(props.getOauth2().getClientId()).
+            clientSecret(props.getOauth2().getClientSecret()).
+            scope(props.getOauth2().getScopes().toArray(new String[0])).
+            authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE).
+            jwkSetUri(props.getOauth2().getJwkSetUri()).
+            build();
+    }
+    
+    @Bean
+    @ConditionalOnProperty(prefix = SRAProperties.PREFIX, name = SRAProperties.AM_TYPE, havingValue = "OAUTH2")
+    public ReactiveClientRegistrationRepository oauth2ClientRegistrationRepository(
+        @Qualifier("oauth2ClientRegistration") final ClientRegistration oauth2ClientRegistration) {
+        return new InMemoryReactiveClientRegistrationRepository(oauth2ClientRegistration);
     }
 
     @Bean
     @ConditionalOnMissingBean
     @ConditionalOnProperty(prefix = SRAProperties.PREFIX, name = SRAProperties.AM_TYPE, havingValue = "OAUTH2")
-    public OAuth2TokenValidator<Jwt> oauth2JWTValidator() {
+    public OAuth2TokenValidator<Jwt> oauth2JWTValidator(final SRAProperties props) {
         return props.getOauth2().getIssuer() == null
                 ? JwtValidators.createDefault()
                 : JwtValidators.createDefaultWithIssuer(props.getOauth2().getIssuer());
@@ -187,8 +202,15 @@ public class SecurityConfig {
     @Bean
     @ConditionalOnMissingBean
     @ConditionalOnProperty(prefix = SRAProperties.PREFIX, name = SRAProperties.AM_TYPE, havingValue = "OAUTH2")
-    public ReactiveJwtDecoder oauth2JWTDecoder() {
-        String jwkSetUri = oauth2ClientRegistrationRepository().iterator().next().getProviderDetails().getJwkSetUri();
+    public ReactiveJwtDecoder oauth2JWTDecoder(
+        @Qualifier("oauth2ClientRegistration")
+        final ClientRegistration oauth2ClientRegistration,
+        @Qualifier("oauth2JWTValidator")
+        final OAuth2TokenValidator<Jwt> oauth2JWTValidator,
+        @Qualifier("jwtClaimSetConverter")
+        final Converter<Map<String, Object>, Map<String, Object>> jwtClaimSetConverter) {
+
+        String jwkSetUri = oauth2ClientRegistration.getProviderDetails().getJwkSetUri();
         NimbusReactiveJwtDecoder jwtDecoder;
         if (StringUtils.isBlank(jwkSetUri)) {
             jwtDecoder = new NimbusReactiveJwtDecoder(jwt -> {
@@ -201,15 +223,16 @@ public class SecurityConfig {
         } else {
             jwtDecoder = NimbusReactiveJwtDecoder.withJwkSetUri(jwkSetUri).build();
         }
-        jwtDecoder.setJwtValidator(oauth2JWTValidator());
-        jwtDecoder.setClaimSetConverter(jwtClaimSetConverter());
+        jwtDecoder.setJwtValidator(oauth2JWTValidator);
+        jwtDecoder.setClaimSetConverter(jwtClaimSetConverter);
         return jwtDecoder;
     }
 
     @Bean
     @ConditionalOnMissingBean
     @ConditionalOnProperty(prefix = SRAProperties.PREFIX, name = SRAProperties.AM_TYPE, havingValue = "SAML2")
-    public SAML2Client saml2Client() {
+    public SAML2Client saml2Client(final ResourcePatternResolver resourceResolver,
+                              final SRAProperties props) {
         SAML2Configuration cfg = new SAML2Configuration(
                 resourceResolver.getResource(props.getSaml2().getKeystore()),
                 props.getSaml2().getKeystoreStorePass(),
@@ -265,6 +288,8 @@ public class SecurityConfig {
     @Order(2)
     @ConditionalOnProperty(prefix = SRAProperties.PREFIX, name = SRAProperties.AM_TYPE)
     public SecurityWebFilterChain routesSecurityFilterChain(
+            @Qualifier("saml2Client") final ObjectProvider<SAML2Client> saml2Client,
+            final SRAProperties props,
             final ServerHttpSecurity http,
             final CacheManager cacheManager,
             final LogoutRouteMatcher logoutRouteMatcher,
@@ -285,9 +310,10 @@ public class SecurityConfig {
                 break;
 
             case SAML2:
-                SAML2Client saml2Client = saml2Client();
-                SAML2SecurityConfigUtils.forLogin(http, saml2Client, publicRouteMatcher);
-                SAML2SecurityConfigUtils.forLogout(builder, saml2Client, cacheManager, logoutRouteMatcher, ctx);
+                saml2Client.ifAvailable(client -> {
+                    SAML2SecurityConfigUtils.forLogin(http, client, publicRouteMatcher);
+                    SAML2SecurityConfigUtils.forLogout(builder, client, cacheManager, logoutRouteMatcher, ctx);
+                });
                 break;
 
             case CAS:
diff --git a/sra/src/main/java/org/apache/syncope/sra/SessionConfig.java b/sra/src/main/java/org/apache/syncope/sra/SessionConfig.java
index 27c1edc..2f65be5 100644
--- a/sra/src/main/java/org/apache/syncope/sra/SessionConfig.java
+++ b/sra/src/main/java/org/apache/syncope/sra/SessionConfig.java
@@ -31,7 +31,7 @@ import org.springframework.session.MapSession;
 import org.springframework.session.ReactiveSessionRepository;
 import org.springframework.session.config.annotation.web.server.EnableSpringWebSession;
 
-@Configuration
+@Configuration(proxyBeanMethods = false)
 @EnableCaching
 @EnableSpringWebSession
 public class SessionConfig {
diff --git a/sra/src/main/java/org/apache/syncope/sra/SyncopeSRAApplication.java b/sra/src/main/java/org/apache/syncope/sra/SyncopeSRAApplication.java
index ceff488..0714783 100644
--- a/sra/src/main/java/org/apache/syncope/sra/SyncopeSRAApplication.java
+++ b/sra/src/main/java/org/apache/syncope/sra/SyncopeSRAApplication.java
@@ -25,7 +25,10 @@ import org.apache.syncope.common.keymaster.client.api.startstop.KeymasterStop;
 import org.apache.syncope.sra.actuate.SRASessions;
 import org.apache.syncope.sra.actuate.SyncopeCoreHealthIndicator;
 import org.apache.syncope.sra.actuate.SyncopeSRAInfoContributor;
-import org.springframework.beans.factory.annotation.Autowired;
+import org.apache.syncope.sra.security.CsrfRouteMatcher;
+import org.apache.syncope.sra.security.LogoutRouteMatcher;
+import org.apache.syncope.sra.security.PublicRouteMatcher;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.builder.SpringApplicationBuilder;
@@ -35,9 +38,10 @@ import org.springframework.cloud.gateway.route.Route;
 import org.springframework.cloud.gateway.route.RouteLocator;
 import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.context.annotation.Bean;
+import org.springframework.web.server.WebExceptionHandler;
 import reactor.core.publisher.Flux;
 
-@SpringBootApplication
+@SpringBootApplication(proxyBeanMethods = false)
 @EnableConfigurationProperties(SRAProperties.class)
 public class SyncopeSRAApplication {
 
@@ -47,21 +51,26 @@ public class SyncopeSRAApplication {
                 build().run(args);
     }
 
-    @Autowired
-    private ServiceOps serviceOps;
-
-    @Autowired
-    private SRAProperties props;
-
-    @Autowired
-    private CacheManager cacheManager;
+    @Bean
+    public LogoutRouteMatcher logoutRouteMatcher() {
+        return new LogoutRouteMatcher();
+    }
 
-    @Autowired
-    private ConfigurableApplicationContext ctx;
+    @Bean
+    public PublicRouteMatcher publicRouteMatcher() {
+        return new PublicRouteMatcher();
+    }
+    
+    @Bean
+    public CsrfRouteMatcher csrfRouteMatcher(final PublicRouteMatcher publicRouteMatcher) {
+        return new CsrfRouteMatcher(publicRouteMatcher);
+    }
 
     @ConditionalOnMissingBean
     @Bean
-    public RouteProvider routeProvider() {
+    public RouteProvider routeProvider(final ConfigurableApplicationContext ctx,
+                                       final ServiceOps serviceOps,
+                                       final SRAProperties props) {
         return new RouteProvider(
                 serviceOps,
                 ctx,
@@ -72,19 +81,20 @@ public class SyncopeSRAApplication {
 
     @ConditionalOnMissingBean
     @Bean
-    public RouteLocator routes() {
-        return () -> Flux.fromIterable(routeProvider().fetch()).map(Route.AbstractBuilder::build);
+    public RouteLocator routes(@Qualifier("routeProvider") final RouteProvider routeProvider) {
+        return () -> Flux.fromIterable(routeProvider.fetch()).map(Route.AbstractBuilder::build);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    public SRASessions sraSessionsActuatorEndpoint() {
+    public SRASessions sraSessionsActuatorEndpoint(final CacheManager cacheManager) {
         return new SRASessions(cacheManager);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    public SyncopeCoreHealthIndicator syncopeCoreHealthIndicator() {
+    public SyncopeCoreHealthIndicator syncopeCoreHealthIndicator(final ServiceOps serviceOps,
+                                                                 final SRAProperties props) {
         return new SyncopeCoreHealthIndicator(
                 serviceOps,
                 props.getAnonymousUser(),
@@ -107,4 +117,11 @@ public class SyncopeSRAApplication {
     public KeymasterStop keymasterStop() {
         return new KeymasterStop(NetworkService.Type.SRA);
     }
+
+    @Bean
+    public WebExceptionHandler syncopeSRAWebExceptionHandler(
+        @Qualifier("routeProvider") final RouteProvider routeProvider,
+        final SRAProperties props) {
+        return new SyncopeSRAWebExceptionHandler(routeProvider, props);
+    }
 }
diff --git a/sra/src/main/java/org/apache/syncope/sra/SyncopeSRAWebExceptionHandler.java b/sra/src/main/java/org/apache/syncope/sra/SyncopeSRAWebExceptionHandler.java
index 38251dc..3ddd232 100644
--- a/sra/src/main/java/org/apache/syncope/sra/SyncopeSRAWebExceptionHandler.java
+++ b/sra/src/main/java/org/apache/syncope/sra/SyncopeSRAWebExceptionHandler.java
@@ -30,7 +30,6 @@ import org.apache.syncope.common.lib.to.SRARouteTO;
 import org.apache.syncope.common.rest.api.RESTHeaders;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cloud.gateway.event.RefreshRoutesEvent;
 import org.springframework.cloud.gateway.support.NotFoundException;
 import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
@@ -42,12 +41,10 @@ import org.springframework.http.InvalidMediaTypeException;
 import org.springframework.http.MediaType;
 import org.springframework.http.server.reactive.ServerHttpRequest;
 import org.springframework.security.oauth2.core.OAuth2AuthorizationException;
-import org.springframework.stereotype.Component;
 import org.springframework.web.server.ServerWebExchange;
 import org.springframework.web.server.WebExceptionHandler;
 import reactor.core.publisher.Mono;
 
-@Component
 @Order(-2)
 public class SyncopeSRAWebExceptionHandler implements WebExceptionHandler, ApplicationListener<RefreshRoutesEvent> {
 
@@ -55,11 +52,14 @@ public class SyncopeSRAWebExceptionHandler implements WebExceptionHandler, Appli
 
     private static final Map<String, Optional<URI>> CACHE = new ConcurrentHashMap<>();
 
-    @Autowired
-    private RouteProvider routeProvider;
+    private final RouteProvider routeProvider;
 
-    @Autowired
-    private SRAProperties props;
+    private final SRAProperties props;
+
+    public SyncopeSRAWebExceptionHandler(final RouteProvider routeProvider, final SRAProperties props) {
+        this.routeProvider = routeProvider;
+        this.props = props;
+    }
 
     @Override
     public void onApplicationEvent(final RefreshRoutesEvent event) {
diff --git a/sra/src/main/java/org/apache/syncope/sra/security/CsrfRouteMatcher.java b/sra/src/main/java/org/apache/syncope/sra/security/CsrfRouteMatcher.java
index d15a7e9..9dc6f50 100644
--- a/sra/src/main/java/org/apache/syncope/sra/security/CsrfRouteMatcher.java
+++ b/sra/src/main/java/org/apache/syncope/sra/security/CsrfRouteMatcher.java
@@ -21,15 +21,12 @@ package org.apache.syncope.sra.security;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import org.apache.syncope.common.lib.to.SRARouteTO;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
 import org.springframework.cloud.gateway.route.Route;
 import org.springframework.http.HttpMethod;
 import org.springframework.http.HttpRequest;
 import org.springframework.web.server.ServerWebExchange;
 import reactor.core.publisher.Mono;
 
-@Component
 public class CsrfRouteMatcher extends AbstractRouteMatcher {
 
     private static final String CACHE_NAME = CsrfRouteMatcher.class.getName();
@@ -41,8 +38,11 @@ public class CsrfRouteMatcher extends AbstractRouteMatcher {
         CACHE.put(CACHE_NAME, new ConcurrentHashMap<>());
     }
 
-    @Autowired
-    private PublicRouteMatcher publicRouteMatcher;
+    private final PublicRouteMatcher publicRouteMatcher;
+
+    public CsrfRouteMatcher(final PublicRouteMatcher publicRouteMatcher) {
+        this.publicRouteMatcher = publicRouteMatcher;
+    }
 
     @Override
     protected String getCacheName() {
diff --git a/sra/src/main/java/org/apache/syncope/sra/security/LogoutRouteMatcher.java b/sra/src/main/java/org/apache/syncope/sra/security/LogoutRouteMatcher.java
index aeff3dc..a3be13e 100644
--- a/sra/src/main/java/org/apache/syncope/sra/security/LogoutRouteMatcher.java
+++ b/sra/src/main/java/org/apache/syncope/sra/security/LogoutRouteMatcher.java
@@ -21,9 +21,7 @@ package org.apache.syncope.sra.security;
 import java.util.concurrent.ConcurrentHashMap;
 import org.apache.syncope.common.lib.to.SRARouteTO;
 import org.springframework.cloud.gateway.route.Route;
-import org.springframework.stereotype.Component;
 
-@Component
 public class LogoutRouteMatcher extends AbstractRouteMatcher {
 
     private static final String CACHE_NAME = LogoutRouteMatcher.class.getName();
diff --git a/sra/src/main/java/org/apache/syncope/sra/security/PublicRouteMatcher.java b/sra/src/main/java/org/apache/syncope/sra/security/PublicRouteMatcher.java
index 7e5e10e..3687040 100644
--- a/sra/src/main/java/org/apache/syncope/sra/security/PublicRouteMatcher.java
+++ b/sra/src/main/java/org/apache/syncope/sra/security/PublicRouteMatcher.java
@@ -21,9 +21,7 @@ package org.apache.syncope.sra.security;
 import java.util.concurrent.ConcurrentHashMap;
 import org.apache.syncope.common.lib.types.SRARouteType;
 import org.springframework.cloud.gateway.route.Route;
-import org.springframework.stereotype.Component;
 
-@Component
 public class PublicRouteMatcher extends AbstractRouteMatcher {
 
     private static final String CACHE_NAME = PublicRouteMatcher.class.getName();
diff --git a/sra/src/main/java/org/apache/syncope/sra/security/oauth2/OidcClientInitiatedServerLogoutSuccessHandler.java b/sra/src/main/java/org/apache/syncope/sra/security/oauth2/OidcClientInitiatedServerLogoutSuccessHandler.java
index 175ebd6..290fe4e 100644
--- a/sra/src/main/java/org/apache/syncope/sra/security/oauth2/OidcClientInitiatedServerLogoutSuccessHandler.java
+++ b/sra/src/main/java/org/apache/syncope/sra/security/oauth2/OidcClientInitiatedServerLogoutSuccessHandler.java
@@ -20,8 +20,9 @@ package org.apache.syncope.sra.security.oauth2;
 
 import java.net.URI;
 import java.nio.charset.StandardCharsets;
-import javax.annotation.Resource;
 import org.apache.syncope.sra.security.AbstractServerLogoutSuccessHandler;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import reactor.core.publisher.Mono;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
@@ -41,7 +42,8 @@ import org.springframework.web.util.UriComponentsBuilder;
  */
 public class OidcClientInitiatedServerLogoutSuccessHandler extends AbstractServerLogoutSuccessHandler {
 
-    @Resource(name = "oidcClientRegistrationRepository")
+    @Autowired
+    @Qualifier("oidcClientRegistrationRepository")
     private ReactiveClientRegistrationRepository clientRegistrationRepository;
 
     protected final RedirectServerLogoutSuccessHandler serverLogoutSuccessHandler =
diff --git a/sra/src/main/resources/sra.properties b/sra/src/main/resources/sra.properties
index b61eeb4..551efc7 100644
--- a/sra/src/main/resources/sra.properties
+++ b/sra/src/main/resources/sra.properties
@@ -36,3 +36,8 @@ sra.useGZIPCompression=true
 
 sra.global.error=/error
 sra.global.postLogout=/logout
+
+##
+# Disable CGLib Proxies
+spring.aop.auto=true
+spring.aop.proxy-target-class=false
diff --git a/wa/bootstrap/src/main/java/org/apache/syncope/wa/bootstrap/SyncopeWABootstrapConfiguration.java b/wa/bootstrap/src/main/java/org/apache/syncope/wa/bootstrap/SyncopeWABootstrapConfiguration.java
index d167e80..45a3b72 100644
--- a/wa/bootstrap/src/main/java/org/apache/syncope/wa/bootstrap/SyncopeWABootstrapConfiguration.java
+++ b/wa/bootstrap/src/main/java/org/apache/syncope/wa/bootstrap/SyncopeWABootstrapConfiguration.java
@@ -18,7 +18,6 @@
  */
 package org.apache.syncope.wa.bootstrap;
 
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.cloud.bootstrap.config.PropertySourceLocator;
 import org.springframework.context.annotation.Bean;
@@ -49,7 +48,6 @@ public class SyncopeWABootstrapConfiguration {
 
     @Configuration(proxyBeanMethods = false)
     public static class PropertySourceConfiguration {
-        @Autowired
         @Bean
         public PropertySourceLocator configPropertySourceLocator(final WARestClient waRestClient) {
             return new SyncopeWAPropertySourceLocator(waRestClient);
diff --git a/wa/starter/src/main/java/org/apache/syncope/wa/starter/SyncopeWAApplication.java b/wa/starter/src/main/java/org/apache/syncope/wa/starter/SyncopeWAApplication.java
index 6e83d8f..3c62039 100644
--- a/wa/starter/src/main/java/org/apache/syncope/wa/starter/SyncopeWAApplication.java
+++ b/wa/starter/src/main/java/org/apache/syncope/wa/starter/SyncopeWAApplication.java
@@ -34,7 +34,6 @@ import org.quartz.Trigger;
 import org.quartz.TriggerBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration;
 import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration;
@@ -74,9 +73,9 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
     RedisRepositoriesAutoConfiguration.class
 })
 @EnableConfigurationProperties({ WAProperties.class, CasConfigurationProperties.class })
-@EnableAsync
-@EnableAspectJAutoProxy(proxyTargetClass = true)
-@EnableTransactionManagement(proxyTargetClass = true)
+@EnableAsync(proxyTargetClass = false)
+@EnableAspectJAutoProxy(proxyTargetClass = false)
+@EnableTransactionManagement(proxyTargetClass = false)
 @EnableScheduling
 public class SyncopeWAApplication extends SpringBootServletInitializer {
 
@@ -88,12 +87,6 @@ public class SyncopeWAApplication extends SpringBootServletInitializer {
             build().run(args);
     }
 
-    @Autowired
-    protected WAProperties waProperties;
-
-    @Autowired
-    protected SchedulerFactoryBean scheduler;
-
     @Override
     protected SpringApplicationBuilder configure(final SpringApplicationBuilder builder) {
         return builder.properties(Map.of("spring.config.name", "wa",
@@ -108,10 +101,13 @@ public class SyncopeWAApplication extends SpringBootServletInitializer {
     @EventListener
     public void handleApplicationReadyEvent(final ApplicationReadyEvent event) {
         new CasConfigurationPropertiesValidator(event.getApplicationContext()).validate();
-        scheduleJobToRefreshContext();
+        final WAProperties waProperties = event.getApplicationContext().getBean(WAProperties.class);
+        final SchedulerFactoryBean scheduler = event.getApplicationContext().getBean(SchedulerFactoryBean.class);
+        scheduleJobToRefreshContext(waProperties, scheduler);
     }
 
-    protected void scheduleJobToRefreshContext() {
+    protected void scheduleJobToRefreshContext(final  WAProperties waProperties,
+                                               final SchedulerFactoryBean scheduler) {
         try {
             Date date = Date.from(LocalDateTime.now().plusSeconds(waProperties.getContextRefreshDelay()).
                     atZone(ZoneId.systemDefault()).toInstant());
diff --git a/wa/starter/src/main/java/org/apache/syncope/wa/starter/actuate/SyncopeWAInfoContributor.java b/wa/starter/src/main/java/org/apache/syncope/wa/starter/actuate/SyncopeWAInfoContributor.java
index ca78683..21625d9 100644
--- a/wa/starter/src/main/java/org/apache/syncope/wa/starter/actuate/SyncopeWAInfoContributor.java
+++ b/wa/starter/src/main/java/org/apache/syncope/wa/starter/actuate/SyncopeWAInfoContributor.java
@@ -19,15 +19,17 @@
 package org.apache.syncope.wa.starter.actuate;
 
 import org.apache.syncope.wa.bootstrap.WAProperties;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.actuate.info.Info;
 import org.springframework.boot.actuate.info.InfoContributor;
 import org.springframework.security.access.prepost.PreAuthorize;
 
 public class SyncopeWAInfoContributor implements InfoContributor {
 
-    @Autowired
-    protected WAProperties waProperties;
+    protected final WAProperties waProperties;
+
+    public SyncopeWAInfoContributor(final WAProperties waProperties) {
+        this.waProperties = waProperties;
+    }
 
     @PreAuthorize("isAuthenticated()")
     @Override
diff --git a/wa/starter/src/main/java/org/apache/syncope/wa/starter/config/SyncopeWAConfiguration.java b/wa/starter/src/main/java/org/apache/syncope/wa/starter/config/SyncopeWAConfiguration.java
index 6aff8a3..2891671 100644
--- a/wa/starter/src/main/java/org/apache/syncope/wa/starter/config/SyncopeWAConfiguration.java
+++ b/wa/starter/src/main/java/org/apache/syncope/wa/starter/config/SyncopeWAConfiguration.java
@@ -38,6 +38,7 @@ import org.apache.syncope.common.keymaster.client.api.model.NetworkService;
 import org.apache.syncope.common.keymaster.client.api.startstop.KeymasterStart;
 import org.apache.syncope.common.keymaster.client.api.startstop.KeymasterStop;
 import org.apache.syncope.common.lib.types.JWSAlgorithm;
+import org.apache.syncope.wa.bootstrap.WAProperties;
 import org.apache.syncope.wa.bootstrap.WARestClient;
 import org.apache.syncope.wa.starter.actuate.SyncopeCoreHealthIndicator;
 import org.apache.syncope.wa.starter.actuate.SyncopeWAInfoContributor;
@@ -78,7 +79,6 @@ import org.apereo.cas.otp.repository.credentials.OneTimeTokenCredentialRepositor
 import org.apereo.cas.otp.repository.token.OneTimeTokenRepository;
 import org.apereo.cas.services.ServiceRegistryExecutionPlanConfigurer;
 import org.apereo.cas.services.ServiceRegistryListener;
-import org.apereo.cas.services.web.CasThymeleafLoginFormDirector;
 import org.apereo.cas.support.events.CasEventRepository;
 import org.apereo.cas.support.events.CasEventRepositoryFilter;
 import org.apereo.cas.support.pac4j.authentication.DelegatedClientFactoryCustomizer;
@@ -87,19 +87,16 @@ import org.apereo.cas.support.saml.idp.metadata.generator.SamlIdPMetadataGenerat
 import org.apereo.cas.support.saml.idp.metadata.locator.SamlIdPMetadataLocator;
 import org.apereo.cas.util.DateTimeUtils;
 import org.apereo.cas.util.crypto.CipherExecutor;
-import org.apereo.cas.web.flow.CasWebflowExecutionPlan;
 import org.apereo.cas.webauthn.storage.WebAuthnCredentialRepository;
 import org.pac4j.core.client.Client;
 import org.springframework.beans.factory.ObjectProvider;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.cloud.context.config.annotation.RefreshScope;
 import org.springframework.context.ConfigurableApplicationContext;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
-@Configuration(value = "SyncopeWAConfiguration", proxyBeanMethods = false)
+@Configuration(proxyBeanMethods = false)
 public class SyncopeWAConfiguration {
 
     private static String version(final ConfigurableApplicationContext ctx) {
@@ -202,7 +199,6 @@ public class SyncopeWAConfiguration {
                 clientAppTOMappers);
     }
 
-    @Autowired
     @Bean
     public ServiceRegistryExecutionPlanConfigurer syncopeServiceRegistryConfigurer(
             final ConfigurableApplicationContext ctx,
@@ -217,7 +213,6 @@ public class SyncopeWAConfiguration {
         return plan -> plan.registerServiceRegistry(registry);
     }
 
-    @Autowired
     @Bean
     public SamlIdPMetadataGenerator samlIdPMetadataGenerator(
             final WARestClient restClient,
@@ -226,7 +221,6 @@ public class SyncopeWAConfiguration {
         return new RestfulSamlIdPMetadataGenerator(context, restClient);
     }
 
-    @Autowired
     @Bean
     public SamlIdPMetadataLocator samlIdPMetadataLocator(final WARestClient restClient) {
         return new RestfulSamlIdPMetadataLocator(
@@ -235,7 +229,6 @@ public class SyncopeWAConfiguration {
                 restClient);
     }
 
-    @Autowired
     @Bean
     public AuditTrailExecutionPlanConfigurer auditConfigurer(final WARestClient restClient) {
         return plan -> plan.registerAuditTrailManager(new SyncopeWAAuditTrailManager(restClient));
@@ -247,7 +240,6 @@ public class SyncopeWAConfiguration {
         return CasEventRepositoryFilter.noOp();
     }
 
-    @Autowired
     @Bean
     public CasEventRepository casEventRepository(final WARestClient restClient,
             @Qualifier("syncopeWAEventRepositoryFilter")
@@ -255,7 +247,6 @@ public class SyncopeWAConfiguration {
         return new SyncopeWAEventRepository(syncopeWAEventRepositoryFilter, restClient);
     }
 
-    @Autowired
     @Bean
     public DelegatedClientFactoryCustomizer<Client> delegatedClientCustomizer(final WARestClient restClient) {
         return new SyncopeWASAML2ClientCustomizer(restClient);
@@ -269,7 +260,6 @@ public class SyncopeWAConfiguration {
                 restClient, casProperties.getAuthn().getMfa().getGauth().getCore().getTimeStepSize());
     }
 
-    @Autowired
     @Bean
     public OneTimeTokenCredentialRepository googleAuthenticatorAccountRegistry(
             final IGoogleAuthenticator googleAuthenticatorInstance, final WARestClient restClient) {
@@ -277,7 +267,6 @@ public class SyncopeWAConfiguration {
         return new SyncopeWAGoogleMfaAuthCredentialRepository(restClient, googleAuthenticatorInstance);
     }
 
-    @Autowired
     @Bean
     public OidcJsonWebKeystoreGeneratorService oidcJsonWebKeystoreGeneratorService(
             final ConfigurableApplicationContext ctx,
@@ -289,7 +278,6 @@ public class SyncopeWAConfiguration {
         return new SyncopeWAOIDCJWKSGeneratorService(restClient, size, algorithm);
     }
 
-    @RefreshScope
     @Bean
     public WebAuthnCredentialRepository webAuthnCredentialRepository(
             final CasConfigurationProperties casProperties,
@@ -298,7 +286,6 @@ public class SyncopeWAConfiguration {
     }
 
     @Bean
-    @RefreshScope
     public U2FDeviceRepository u2fDeviceRepository(
             final CasConfigurationProperties casProperties,
             final WARestClient restClient) {
@@ -313,22 +300,20 @@ public class SyncopeWAConfiguration {
     }
 
     @Bean
-    @Autowired
     public SurrogateAuthenticationService surrogateAuthenticationService(final WARestClient restClient) {
         return new SyncopeWASurrogateAuthenticationService(restClient);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    @Autowired
     public SyncopeCoreHealthIndicator syncopeCoreHealthIndicator(final WARestClient restClient) {
         return new SyncopeCoreHealthIndicator(restClient);
     }
 
     @ConditionalOnMissingBean
     @Bean
-    public SyncopeWAInfoContributor syncopeWAInfoContributor() {
-        return new SyncopeWAInfoContributor();
+    public SyncopeWAInfoContributor syncopeWAInfoContributor(final WAProperties waProperties) {
+        return new SyncopeWAInfoContributor(waProperties);
     }
 
     @Bean
@@ -340,10 +325,4 @@ public class SyncopeWAConfiguration {
     public KeymasterStop keymasterStop() {
         return new KeymasterStop(NetworkService.Type.WA);
     }
-
-    @Bean
-    public CasThymeleafLoginFormDirector casThymeleafLoginFormDirector(
-            @Qualifier("casWebflowExecutionPlan") final CasWebflowExecutionPlan webflowExecutionPlan) {
-        return new CasThymeleafLoginFormDirector(webflowExecutionPlan);
-    }
 }
diff --git a/wa/starter/src/main/java/org/apache/syncope/wa/starter/config/SyncopeWARefreshContextJob.java b/wa/starter/src/main/java/org/apache/syncope/wa/starter/config/SyncopeWARefreshContextJob.java
index 348d3f8..d7aee55 100644
--- a/wa/starter/src/main/java/org/apache/syncope/wa/starter/config/SyncopeWARefreshContextJob.java
+++ b/wa/starter/src/main/java/org/apache/syncope/wa/starter/config/SyncopeWARefreshContextJob.java
@@ -62,7 +62,7 @@ public class SyncopeWARefreshContextJob implements Job {
             LOG.info("Generated SAML2 IdP metadata for {}", document.getAppliesTo());
 
             advertiseReady();
-        } catch (Exception e) {
+        } catch (final Exception e) {
             throw new JobExecutionException("While generating SAML2 IdP metadata", e);
         }
     }
diff --git a/wa/starter/src/main/java/org/apache/syncope/wa/starter/saml/idp/metadata/RestfulSamlIdPMetadataGenerator.java b/wa/starter/src/main/java/org/apache/syncope/wa/starter/saml/idp/metadata/RestfulSamlIdPMetadataGenerator.java
index a89068a..1b2bbbc 100644
--- a/wa/starter/src/main/java/org/apache/syncope/wa/starter/saml/idp/metadata/RestfulSamlIdPMetadataGenerator.java
+++ b/wa/starter/src/main/java/org/apache/syncope/wa/starter/saml/idp/metadata/RestfulSamlIdPMetadataGenerator.java
@@ -50,7 +50,7 @@ public class RestfulSamlIdPMetadataGenerator extends BaseSamlIdPMetadataGenerato
     @Override
     protected SamlIdPMetadataDocument finalizeMetadataDocument(
             final SamlIdPMetadataDocument doc,
-            final Optional<SamlRegisteredService> registeredService) {
+            final Optional<SamlRegisteredService> registeredService) throws Exception {
 
         LOG.info("Generating new SAML2 IdP metadata document");
 
@@ -84,14 +84,14 @@ public class RestfulSamlIdPMetadataGenerator extends BaseSamlIdPMetadataGenerato
 
     @Override
     public Pair<String, String> buildSelfSignedEncryptionCert(final Optional<SamlRegisteredService> registeredService)
-            throws Exception {
+        throws Exception {
 
         return generateCertificateAndKey();
     }
 
     @Override
     public Pair<String, String> buildSelfSignedSigningCert(final Optional<SamlRegisteredService> registeredService)
-            throws Exception {
+        throws Exception {
 
         return generateCertificateAndKey();
     }
diff --git a/wa/starter/src/main/resources/wa.properties b/wa/starter/src/main/resources/wa.properties
index 281f148..8ae2d17 100644
--- a/wa/starter/src/main/resources/wa.properties
+++ b/wa/starter/src/main/resources/wa.properties
@@ -110,3 +110,8 @@ cas.authn.syncope.name=DefaultSyncopeAuthModule
 # Default strategy for matching request paths against
 # registered Spring MVC handler mappings
 spring.mvc.pathmatch.matching-strategy=ant-path-matcher
+
+##
+# Disable CGLib Proxies
+spring.aop.auto=true
+spring.aop.proxy-target-class=false