You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by ya...@apache.org on 2025/12/11 16:09:52 UTC

(airavata) 02/19: add spring boot to airavata-api and streamline service and background process launches

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

yasith pushed a commit to branch service-layer-improvements
in repository https://gitbox.apache.org/repos/asf/airavata.git

commit 2f5d196f2b651237b73109efa10b4d7bd5eccfd0
Author: yasithdev <ya...@icloud.com>
AuthorDate: Sat Dec 6 15:08:12 2025 -0600

    add spring boot to airavata-api and streamline service and background process launches
---
 airavata-api/pom.xml                               |  21 ++
 .../org/apache/airavata/AiravataApplication.java   |  78 +++++++
 .../api/thrift/handler/AiravataServiceHandler.java |  12 +-
 .../thrift/handler/CredentialServiceHandler.java   |  12 +-
 .../thrift/handler/GroupManagerServiceHandler.java |  37 ++--
 .../api/thrift/handler/IamAdminServiceHandler.java |  19 +-
 .../thrift/handler/OrchestratorServiceHandler.java |  17 +-
 .../api/thrift/handler/RegistryServiceHandler.java |   8 +-
 .../handler/SharingRegistryServerHandler.java      |  14 +-
 .../handler/TenantProfileServiceHandler.java       |  17 +-
 .../thrift/handler/UserProfileServiceHandler.java  |   6 +-
 .../api/thrift/server/AiravataServiceServer.java   |  16 +-
 .../api/thrift/server/CredentialServiceServer.java |  10 +-
 .../thrift/server/OrchestratorServiceServer.java   |  10 +-
 .../api/thrift/server/ProfileServiceServer.java    |  21 +-
 .../api/thrift/server/RegistryServiceServer.java   |  10 +-
 .../api/thrift/server/SharingRegistryServer.java   |  12 +-
 .../config/BackgroundServicesLauncher.java         | 234 +++++++++++++++++++++
 .../java/org/apache/airavata/config/JpaConfig.java | 167 +++++++++++++++
 .../airavata/config/RegistryServiceProvider.java   |  47 +++++
 .../airavata/config/ThriftServerLauncher.java      |  87 ++++++++
 .../helix/impl/workflow/PostWorkflowManager.java   |  13 +-
 .../helix/impl/workflow/PreWorkflowManager.java    |   2 +-
 .../helix/impl/workflow/WorkflowManager.java       |  15 +-
 .../java/org/apache/airavata/main/ThriftAPI.java   |  67 +++++-
 .../core/repositories/TenantProfileRepository.java |   2 +
 .../core/repositories/UserProfileRepository.java   |   2 +
 .../appcatalog/AppCatAbstractRepository.java       |  10 +-
 .../ApplicationDeploymentRepository.java           |   2 +
 .../appcatalog/ApplicationInputRepository.java     |   2 +
 .../appcatalog/ApplicationInterfaceRepository.java |   2 +
 .../appcatalog/ApplicationModuleRepository.java    |   2 +
 .../appcatalog/ApplicationOutputRepository.java    |   2 +
 .../appcatalog/BatchQueuePolicyRepository.java     |   2 +
 .../appcatalog/BatchQueueRepository.java           |   2 +
 .../ComputeResourcePolicyRepository.java           |   2 +
 .../appcatalog/ComputeResourcePrefRepository.java  |   2 +
 .../appcatalog/ComputeResourceRepository.java      |   2 +
 .../appcatalog/DataMovementRepository.java         |   2 +
 .../appcatalog/GatewayGroupsRepository.java        |   2 +
 .../appcatalog/GroupResourceProfileRepository.java |   2 +
 .../appcatalog/GrpComputePrefRepository.java       |   2 +
 .../appcatalog/GwyResourceProfileRepository.java   |   2 +
 .../JobSubmissionInterfaceRepository.java          |   2 +
 .../appcatalog/ParserInputRepository.java          |   2 +
 .../appcatalog/ParserOutputRepository.java         |   2 +
 .../repositories/appcatalog/ParserRepository.java  |   2 +
 .../appcatalog/ParsingTemplateRepository.java      |   2 +
 .../appcatalog/ResourceJobManagerRepository.java   |   2 +
 .../appcatalog/StoragePrefRepository.java          |   2 +
 .../appcatalog/StorageResourceRepository.java      |   2 +
 .../UserComputeResourcePreferenceRepository.java   |   2 +
 .../appcatalog/UserResourceProfileRepository.java  |   2 +
 .../UserStoragePreferenceRepository.java           |   2 +
 .../expcatalog/ExpCatAbstractRepository.java       |  10 +-
 .../expcatalog/ExperimentErrorRepository.java      |   2 +
 .../expcatalog/ExperimentInputRepository.java      |   2 +
 .../expcatalog/ExperimentOutputRepository.java     |   2 +
 .../expcatalog/ExperimentRepository.java           |   2 +
 .../expcatalog/ExperimentStatusRepository.java     |   2 +
 .../expcatalog/ExperimentSummaryRepository.java    |   2 +
 .../repositories/expcatalog/GatewayRepository.java |   2 +
 .../GatewayUsageReportingCommandRepository.java    |   2 +
 .../repositories/expcatalog/JobRepository.java     |   2 +
 .../expcatalog/JobStatusRepository.java            |   2 +
 .../expcatalog/NotificationRepository.java         |   2 +
 .../expcatalog/ProcessErrorRepository.java         |   2 +
 .../expcatalog/ProcessInputRepository.java         |   2 +
 .../expcatalog/ProcessOutputRepository.java        |   2 +
 .../repositories/expcatalog/ProcessRepository.java |   8 +-
 .../expcatalog/ProcessStatusRepository.java        |   2 +
 .../expcatalog/ProcessWorkflowRepository.java      |   2 +
 .../repositories/expcatalog/ProjectRepository.java |   2 +
 .../expcatalog/QueueStatusRepository.java          |   2 +
 .../expcatalog/TaskErrorRepository.java            |   2 +
 .../repositories/expcatalog/TaskRepository.java    |   8 +-
 .../expcatalog/TaskStatusRepository.java           |   2 +
 .../repositories/expcatalog/UserRepository.java    |   2 +
 .../replicacatalog/DataProductRepository.java      |  13 +-
 .../DataReplicaLocationRepository.java             |   2 +
 .../replicacatalog/RepCatAbstractRepository.java   |  10 +-
 .../WorkflowCatAbstractRepository.java             |  10 +-
 .../workflowcatalog/WorkflowRepository.java        |   2 +
 .../apache/airavata/service/AiravataService.java   |  33 ++-
 .../airavata/service/CredentialStoreService.java   |   2 +
 .../airavata/service/GroupManagerService.java      |  44 ++--
 .../apache/airavata/service/IamAdminService.java   |  31 +--
 .../service/OrchestratorRegistryService.java       |  12 +-
 .../airavata/service/OrchestratorService.java      |   5 +-
 .../apache/airavata/service/RegistryService.java   | 106 +++++++---
 .../airavata/service/SharingRegistryService.java   |   2 +
 .../airavata/service/TenantProfileService.java     |  17 +-
 .../airavata/service/UserProfileService.java       |  27 +--
 .../sharing/db/repositories/DomainRepository.java  |   2 +
 .../sharing/db/repositories/EntityRepository.java  |   2 +
 .../db/repositories/EntityTypeRepository.java      |   2 +
 .../db/repositories/GroupAdminRepository.java      |   2 +
 .../db/repositories/GroupMembershipRepository.java |   2 +
 .../db/repositories/PermissionTypeRepository.java  |   2 +
 .../sharing/db/repositories/SharingRepository.java |   2 +
 .../db/repositories/UserGroupRepository.java       |   2 +
 .../sharing/db/repositories/UserRepository.java    |   2 +
 pom.xml                                            |   9 +
 103 files changed, 1190 insertions(+), 239 deletions(-)

diff --git a/airavata-api/pom.xml b/airavata-api/pom.xml
index b64be1d8aa..148e064ed9 100644
--- a/airavata-api/pom.xml
+++ b/airavata-api/pom.xml
@@ -346,6 +346,27 @@ under the License.
         </exclusion>
       </exclusions>
     </dependency>
+
+    <!-- Spring Boot Dependencies -->
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-data-jpa</artifactId>
+      <exclusions>
+        <!-- Exclude Hibernate as we're using OpenJPA -->
+        <exclusion>
+          <groupId>org.hibernate.orm</groupId>
+          <artifactId>hibernate-core</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-aop</artifactId>
+    </dependency>
   </dependencies>
 
   <build>
diff --git a/airavata-api/src/main/java/org/apache/airavata/AiravataApplication.java b/airavata-api/src/main/java/org/apache/airavata/AiravataApplication.java
new file mode 100644
index 0000000000..f9ef1fc752
--- /dev/null
+++ b/airavata-api/src/main/java/org/apache/airavata/AiravataApplication.java
@@ -0,0 +1,78 @@
+/**
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+package org.apache.airavata;
+
+import org.apache.airavata.common.utils.ApplicationSettings;
+import org.apache.airavata.common.utils.ServerSettings;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.domain.EntityScan;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+/**
+ * Spring Boot application entry point for Airavata API.
+ * This class initializes the Spring application context and enables
+ * dependency injection for services, repositories, and entities.
+ * All services (Thrift servers, workflow managers, helix controllers, etc.)
+ * are started automatically via BackgroundServicesLauncher and ThriftAPI integration.
+ */
+@SpringBootApplication
+@EnableTransactionManagement
+@ComponentScan(basePackages = {
+    "org.apache.airavata.service",
+    "org.apache.airavata.registry.core.repositories",
+    "org.apache.airavata.profile",
+    "org.apache.airavata.sharing.db.repositories",
+    "org.apache.airavata.config",
+    "org.apache.airavata.api.thrift"
+})
+@EntityScan(basePackages = {
+    "org.apache.airavata.registry.core.entities",
+    "org.apache.airavata.profile.commons",
+    "org.apache.airavata.sharing.db.entities"
+})
+public class AiravataApplication {
+
+    private static final Logger logger = LoggerFactory.getLogger(AiravataApplication.class);
+
+    public static void main(String[] args) {
+        // Ensure properties are loaded before Spring context starts
+        try {
+            // Merge command line args into settings
+            ServerSettings.mergeSettingsCommandLineArgs(args);
+            // Trigger static initialization of ApplicationSettings
+            ApplicationSettings.getSetting("servers", "all");
+            logger.info("Airavata properties loaded successfully");
+        } catch (Exception e) {
+            logger.warn("Failed to pre-load properties, will rely on ApplicationSettings static initialization", e);
+        }
+        
+        // Start Spring Boot application - this will initialize all beans and run CommandLineRunners
+        SpringApplication app = new SpringApplication(AiravataApplication.class);
+        // Don't exit immediately - keep running for background services
+        app.setRegisterShutdownHook(true);
+        app.run(args);
+    }
+
+}
+
diff --git a/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/AiravataServiceHandler.java b/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/AiravataServiceHandler.java
index daacc87973..a46d0e7895 100644
--- a/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/AiravataServiceHandler.java
+++ b/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/AiravataServiceHandler.java
@@ -75,14 +75,18 @@ import org.apache.airavata.security.interceptor.SecurityCheck;
 import org.apache.airavata.service.AiravataService;
 import org.apache.airavata.service.ServiceFactoryException;
 import org.apache.airavata.sharing.models.SharingRegistryException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 
+@Component
 public class AiravataServiceHandler implements Airavata.Iface {
 
-    private AiravataService airavataService;
+    private final AiravataService airavataService;
 
-    public AiravataServiceHandler() throws AiravataException, ServiceFactoryException {
-        airavataService = new AiravataService();
-        airavataService.init();
+    @Autowired
+    public AiravataServiceHandler(AiravataService airavataService) throws AiravataException {
+        this.airavataService = airavataService;
+        this.airavataService.init();
     }
 
     /**
diff --git a/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/CredentialServiceHandler.java b/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/CredentialServiceHandler.java
index 2779751ba0..53549b7c77 100644
--- a/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/CredentialServiceHandler.java
+++ b/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/CredentialServiceHandler.java
@@ -27,19 +27,19 @@ import org.apache.airavata.credential.exception.CredentialStoreException;
 import org.apache.airavata.model.credential.store.*;
 import org.apache.airavata.model.error.AiravataSystemException;
 import org.apache.airavata.service.CredentialStoreService;
-import org.apache.airavata.service.ServiceFactory;
-import org.apache.airavata.service.ServiceFactoryException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 
+@Component
 public class CredentialServiceHandler implements org.apache.airavata.credential.cpi.CredentialStoreService.Iface {
     protected static Logger log = LoggerFactory.getLogger(CredentialServiceHandler.class);
+    
+    @Autowired
     private CredentialStoreService credentialStoreService;
 
-    public CredentialServiceHandler()
-            throws ApplicationSettingsException, IllegalAccessException, ClassNotFoundException, InstantiationException,
-                    ServiceFactoryException {
-        credentialStoreService = ServiceFactory.getInstance().getCredentialStoreService();
+    public CredentialServiceHandler() {
     }
 
     @Override
diff --git a/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/GroupManagerServiceHandler.java b/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/GroupManagerServiceHandler.java
index ec2aab0494..50e772ed78 100644
--- a/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/GroupManagerServiceHandler.java
+++ b/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/GroupManagerServiceHandler.java
@@ -32,14 +32,19 @@ import org.apache.airavata.service.ServiceFactoryException;
 import org.apache.airavata.sharing.models.SharingRegistryException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 
+@Component
 public class GroupManagerServiceHandler implements GroupManagerService.Iface {
 
     private static final Logger logger = LoggerFactory.getLogger(GroupManagerServiceHandler.class);
-    private org.apache.airavata.service.GroupManagerService groupManagerService;
+    private final org.apache.airavata.service.GroupManagerService groupManagerService;
 
-    public GroupManagerServiceHandler() {
-        groupManagerService = new org.apache.airavata.service.GroupManagerService();
+    @Autowired
+    public GroupManagerServiceHandler(org.apache.airavata.service.GroupManagerService groupManagerService) {
+        this.groupManagerService = groupManagerService;
+        logger.info("GroupManagerServiceHandler initialized with Spring-injected GroupManagerService");
     }
 
     @Override
@@ -53,7 +58,7 @@ public class GroupManagerServiceHandler implements GroupManagerService.Iface {
             throws GroupManagerServiceException, AuthorizationException {
         try {
             return groupManagerService.createGroup(authzToken, groupModel);
-        } catch (SharingRegistryException | ServiceFactoryException e) {
+        } catch (SharingRegistryException e) {
             GroupManagerServiceException ex =
                     new GroupManagerServiceException("Error creating group: " + e.getMessage());
             ex.initCause(e);
@@ -67,7 +72,7 @@ public class GroupManagerServiceHandler implements GroupManagerService.Iface {
             throws GroupManagerServiceException, AuthorizationException {
         try {
             return groupManagerService.updateGroup(authzToken, groupModel);
-        } catch (SharingRegistryException | ServiceFactoryException e) {
+        } catch (SharingRegistryException e) {
             GroupManagerServiceException ex =
                     new GroupManagerServiceException("Error updating group: " + e.getMessage());
             ex.initCause(e);
@@ -81,7 +86,7 @@ public class GroupManagerServiceHandler implements GroupManagerService.Iface {
             throws GroupManagerServiceException, AuthorizationException {
         try {
             return groupManagerService.deleteGroup(authzToken, groupId, ownerId);
-        } catch (SharingRegistryException | ServiceFactoryException e) {
+        } catch (SharingRegistryException e) {
             GroupManagerServiceException ex =
                     new GroupManagerServiceException("Error deleting group: " + e.getMessage());
             ex.initCause(e);
@@ -95,7 +100,7 @@ public class GroupManagerServiceHandler implements GroupManagerService.Iface {
             throws GroupManagerServiceException, AuthorizationException {
         try {
             return groupManagerService.getGroup(authzToken, groupId);
-        } catch (SharingRegistryException | ServiceFactoryException e) {
+        } catch (SharingRegistryException e) {
             GroupManagerServiceException ex =
                     new GroupManagerServiceException("Error getting group: " + e.getMessage());
             ex.initCause(e);
@@ -109,7 +114,7 @@ public class GroupManagerServiceHandler implements GroupManagerService.Iface {
             throws GroupManagerServiceException, AuthorizationException {
         try {
             return groupManagerService.getGroups(authzToken);
-        } catch (SharingRegistryException | ServiceFactoryException e) {
+        } catch (SharingRegistryException e) {
             GroupManagerServiceException ex =
                     new GroupManagerServiceException("Error getting groups: " + e.getMessage());
             ex.initCause(e);
@@ -123,7 +128,7 @@ public class GroupManagerServiceHandler implements GroupManagerService.Iface {
             throws GroupManagerServiceException, AuthorizationException {
         try {
             return groupManagerService.getAllGroupsUserBelongs(authzToken, userName);
-        } catch (SharingRegistryException | ServiceFactoryException e) {
+        } catch (SharingRegistryException e) {
             GroupManagerServiceException ex =
                     new GroupManagerServiceException("Error getting user groups: " + e.getMessage());
             ex.initCause(e);
@@ -136,7 +141,7 @@ public class GroupManagerServiceHandler implements GroupManagerService.Iface {
             throws GroupManagerServiceException, AuthorizationException {
         try {
             return groupManagerService.addUsersToGroup(authzToken, userIds, groupId);
-        } catch (SharingRegistryException | ServiceFactoryException e) {
+        } catch (SharingRegistryException e) {
             GroupManagerServiceException ex =
                     new GroupManagerServiceException("Error adding users to group: " + e.getMessage());
             ex.initCause(e);
@@ -149,7 +154,7 @@ public class GroupManagerServiceHandler implements GroupManagerService.Iface {
             throws GroupManagerServiceException, AuthorizationException {
         try {
             return groupManagerService.removeUsersFromGroup(authzToken, userIds, groupId);
-        } catch (SharingRegistryException | ServiceFactoryException e) {
+        } catch (SharingRegistryException e) {
             GroupManagerServiceException ex =
                     new GroupManagerServiceException("Error removing users from group: " + e.getMessage());
             ex.initCause(e);
@@ -163,7 +168,7 @@ public class GroupManagerServiceHandler implements GroupManagerService.Iface {
             throws GroupManagerServiceException, AuthorizationException {
         try {
             return groupManagerService.transferGroupOwnership(authzToken, groupId, newOwnerId);
-        } catch (SharingRegistryException | ServiceFactoryException e) {
+        } catch (SharingRegistryException e) {
             GroupManagerServiceException ex =
                     new GroupManagerServiceException("Error transferring group ownership: " + e.getMessage());
             ex.initCause(e);
@@ -177,7 +182,7 @@ public class GroupManagerServiceHandler implements GroupManagerService.Iface {
             throws GroupManagerServiceException, AuthorizationException {
         try {
             return groupManagerService.addGroupAdmins(authzToken, groupId, adminIds);
-        } catch (SharingRegistryException | ServiceFactoryException e) {
+        } catch (SharingRegistryException e) {
             GroupManagerServiceException ex =
                     new GroupManagerServiceException("Error adding group admins: " + e.getMessage());
             ex.initCause(e);
@@ -191,7 +196,7 @@ public class GroupManagerServiceHandler implements GroupManagerService.Iface {
             throws GroupManagerServiceException, AuthorizationException {
         try {
             return groupManagerService.removeGroupAdmins(authzToken, groupId, adminIds);
-        } catch (SharingRegistryException | ServiceFactoryException e) {
+        } catch (SharingRegistryException e) {
             GroupManagerServiceException ex =
                     new GroupManagerServiceException("Error removing group admins: " + e.getMessage());
             ex.initCause(e);
@@ -205,7 +210,7 @@ public class GroupManagerServiceHandler implements GroupManagerService.Iface {
             throws GroupManagerServiceException, AuthorizationException {
         try {
             return groupManagerService.hasAdminAccess(authzToken, groupId, adminId);
-        } catch (SharingRegistryException | ServiceFactoryException e) {
+        } catch (SharingRegistryException e) {
             GroupManagerServiceException ex =
                     new GroupManagerServiceException("Error checking admin access: " + e.getMessage());
             ex.initCause(e);
@@ -219,7 +224,7 @@ public class GroupManagerServiceHandler implements GroupManagerService.Iface {
             throws GroupManagerServiceException, AuthorizationException {
         try {
             return groupManagerService.hasOwnerAccess(authzToken, groupId, ownerId);
-        } catch (SharingRegistryException | ServiceFactoryException e) {
+        } catch (SharingRegistryException e) {
             GroupManagerServiceException ex =
                     new GroupManagerServiceException("Error checking owner access: " + e.getMessage());
             ex.initCause(e);
diff --git a/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/IamAdminServiceHandler.java b/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/IamAdminServiceHandler.java
index 2dc3ace75a..ba6171c047 100644
--- a/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/IamAdminServiceHandler.java
+++ b/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/IamAdminServiceHandler.java
@@ -34,22 +34,19 @@ import org.apache.airavata.security.interceptor.SecurityCheck;
 import org.apache.airavata.service.IamAdminService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 
+@Component
 public class IamAdminServiceHandler implements IamAdminServices.Iface {
 
     private static final Logger logger = LoggerFactory.getLogger(IamAdminServiceHandler.class);
-    private IamAdminService iamAdminService;
+    private final IamAdminService iamAdminService;
 
-    public IamAdminServiceHandler() throws IamAdminServicesException {
-        try {
-            iamAdminService = new org.apache.airavata.service.IamAdminService();
-        } catch (Throwable e) {
-            String msg = "Error initializing IamAdminServicesHandler, reason: " + e.getMessage();
-            logger.error(msg, e);
-            var exception = new IamAdminServicesException(msg);
-            exception.initCause(e);
-            throw exception;
-        }
+    @Autowired
+    public IamAdminServiceHandler(IamAdminService iamAdminService) {
+        this.iamAdminService = iamAdminService;
+        logger.info("IamAdminServiceHandler initialized with Spring-injected IamAdminService");
     }
 
     @Override
diff --git a/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/OrchestratorServiceHandler.java b/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/OrchestratorServiceHandler.java
index 5861cfa679..e89b969d10 100644
--- a/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/OrchestratorServiceHandler.java
+++ b/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/OrchestratorServiceHandler.java
@@ -26,13 +26,15 @@ import org.apache.airavata.model.error.LaunchValidationException;
 import org.apache.airavata.model.process.ProcessModel;
 import org.apache.airavata.orchestrator.util.OrchestratorServerThreadPoolExecutor;
 import org.apache.airavata.service.OrchestratorService;
-import org.apache.airavata.service.ServiceFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 
+@Component
 public class OrchestratorServiceHandler implements org.apache.airavata.orchestrator.cpi.OrchestratorService.Iface {
     private static Logger log = LoggerFactory.getLogger(OrchestratorServiceHandler.class);
-    private OrchestratorService orchestratorService;
+    private final OrchestratorService orchestratorService;
 
     /**
      * Query orchestrator server to fetch the CPI version
@@ -42,13 +44,10 @@ public class OrchestratorServiceHandler implements org.apache.airavata.orchestra
         return org.apache.airavata.orchestrator.cpi.orchestrator_cpiConstants.ORCHESTRATOR_CPI_VERSION;
     }
 
-    public OrchestratorServiceHandler() {
-        try {
-            orchestratorService = ServiceFactory.getInstance().getOrchestratorService();
-        } catch (Exception e) {
-            log.error("Error while initializing orchestrator service", e);
-            throw new RuntimeException("Error while initializing orchestrator service", e);
-        }
+    @Autowired
+    public OrchestratorServiceHandler(OrchestratorService orchestratorService) {
+        this.orchestratorService = orchestratorService;
+        log.info("OrchestratorServiceHandler initialized with Spring-injected OrchestratorService");
     }
 
     /**
diff --git a/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/RegistryServiceHandler.java b/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/RegistryServiceHandler.java
index 19e7db537c..a98d8588af 100644
--- a/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/RegistryServiceHandler.java
+++ b/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/RegistryServiceHandler.java
@@ -67,11 +67,15 @@ import org.apache.airavata.registry.api.registry_apiConstants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
 public class RegistryServiceHandler implements RegistryService.Iface {
     private static final Logger logger = LoggerFactory.getLogger(RegistryServiceHandler.class);
 
-    private org.apache.airavata.service.RegistryService registryService =
-            new org.apache.airavata.service.RegistryService();
+    @Autowired
+    private org.apache.airavata.service.RegistryService registryService;
 
     // Helper method to convert domain exceptions to Thrift exceptions
     private RegistryServiceException convertToRegistryServiceException(Throwable e, String context) {
diff --git a/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/SharingRegistryServerHandler.java b/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/SharingRegistryServerHandler.java
index aa53a3e85d..bd9be91a75 100644
--- a/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/SharingRegistryServerHandler.java
+++ b/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/SharingRegistryServerHandler.java
@@ -27,20 +27,18 @@ import org.apache.airavata.sharing.models.*;
 import org.apache.airavata.sharing.service.cpi.SharingRegistryService;
 import org.apache.airavata.sharing.service.cpi.sharing_cpiConstants;
 
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
 public class SharingRegistryServerHandler implements SharingRegistryService.Iface {
+    @Autowired
     private org.apache.airavata.service.SharingRegistryService sharingRegistryService;
 
     public static String OWNER_PERMISSION_NAME =
             org.apache.airavata.service.SharingRegistryService.OWNER_PERMISSION_NAME;
 
-    public SharingRegistryServerHandler() throws ApplicationSettingsException {
-        this(new SharingRegistryDBInitConfig());
-    }
-
-    public SharingRegistryServerHandler(SharingRegistryDBInitConfig sharingRegistryDBInitConfig)
-            throws ApplicationSettingsException {
-        DBInitializer.initializeDB(sharingRegistryDBInitConfig);
-        sharingRegistryService = new org.apache.airavata.service.SharingRegistryService();
+    public SharingRegistryServerHandler() {
     }
 
     @Override
diff --git a/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/TenantProfileServiceHandler.java b/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/TenantProfileServiceHandler.java
index 32c34fcd1f..538b64bc4f 100644
--- a/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/TenantProfileServiceHandler.java
+++ b/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/TenantProfileServiceHandler.java
@@ -35,22 +35,19 @@ import org.slf4j.LoggerFactory;
 /**
  * Created by goshenoy on 3/6/17.
  */
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
 public class TenantProfileServiceHandler implements TenantProfileService.Iface {
 
     private static final Logger logger = LoggerFactory.getLogger(TenantProfileServiceHandler.class);
+    
+    @Autowired
     private org.apache.airavata.service.TenantProfileService tenantProfileService;
 
-    public TenantProfileServiceHandler() throws TenantProfileServiceException {
+    public TenantProfileServiceHandler() {
         logger.debug("Initializing TenantProfileServiceHandler");
-        try {
-            tenantProfileService = new org.apache.airavata.service.TenantProfileService();
-        } catch (Throwable e) {
-            String msg = "Error initializing TenantProfileServiceHandler, reason: " + e.getMessage();
-            logger.error(msg, e);
-            var exception = new TenantProfileServiceException(msg);
-            exception.initCause(e);
-            throw exception;
-        }
     }
 
     @Override
diff --git a/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/UserProfileServiceHandler.java b/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/UserProfileServiceHandler.java
index b39e5b9550..826a48c657 100644
--- a/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/UserProfileServiceHandler.java
+++ b/airavata-api/src/main/java/org/apache/airavata/api/thrift/handler/UserProfileServiceHandler.java
@@ -29,12 +29,16 @@ import org.apache.airavata.profile.user.cpi.exception.UserProfileServiceExceptio
 import org.apache.airavata.profile.user.cpi.profile_user_cpiConstants;
 import org.apache.airavata.security.interceptor.SecurityCheck;
 
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
 public class UserProfileServiceHandler implements org.apache.airavata.profile.user.cpi.UserProfileService.Iface {
 
+    @Autowired
     private org.apache.airavata.service.UserProfileService userProfileService;
 
     public UserProfileServiceHandler() {
-        userProfileService = new org.apache.airavata.service.UserProfileService();
     }
 
     @Override
diff --git a/airavata-api/src/main/java/org/apache/airavata/api/thrift/server/AiravataServiceServer.java b/airavata-api/src/main/java/org/apache/airavata/api/thrift/server/AiravataServiceServer.java
index bb21d2bbb2..cb8aa5db72 100644
--- a/airavata-api/src/main/java/org/apache/airavata/api/thrift/server/AiravataServiceServer.java
+++ b/airavata-api/src/main/java/org/apache/airavata/api/thrift/server/AiravataServiceServer.java
@@ -33,6 +33,9 @@ import org.apache.airavata.common.utils.ServerSettings;
 import org.apache.airavata.model.error.AiravataErrorType;
 import org.apache.airavata.model.error.AiravataSystemException;
 import org.apache.airavata.security.interceptor.SecurityModule;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Component;
 import org.apache.thrift.server.TServer;
 import org.apache.thrift.server.TThreadPoolServer;
 import org.apache.thrift.transport.TSSLTransportFactory;
@@ -42,6 +45,7 @@ import org.apache.thrift.transport.TTransportException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+@Component
 public class AiravataServiceServer implements IServer {
 
     private static final Logger logger = LoggerFactory.getLogger(AiravataServiceServer.class);
@@ -52,6 +56,9 @@ public class AiravataServiceServer implements IServer {
 
     private TServer server, TLSServer;
 
+    @Autowired
+    private ApplicationContext applicationContext;
+
     public AiravataServiceServer() {
         setStatus(ServerStatus.STOPPED);
     }
@@ -138,11 +145,12 @@ public class AiravataServiceServer implements IServer {
     @Override
     public void start() throws Exception {
         setStatus(ServerStatus.STARTING);
-        // Obtain a AiravataServerHandl
-        // er object from Guice which is wrapped with interception logic.
-        Injector injector = Guice.createInjector(new SecurityModule());
+        // Get AiravataServiceHandler from Spring context
+        AiravataServiceHandler handler = applicationContext.getBean(AiravataServiceHandler.class);
+        // TODO: Migrate SecurityModule to Spring AOP for security interception
+        // For now, we use the handler directly. Security checks are still applied via @SecurityCheck annotations
         Airavata.Processor<Airavata.Iface> airavataAPIServer =
-                new Airavata.Processor<Airavata.Iface>(injector.getInstance(AiravataServiceHandler.class));
+                new Airavata.Processor<Airavata.Iface>(handler);
         startAiravataServer(airavataAPIServer);
     }
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/api/thrift/server/CredentialServiceServer.java b/airavata-api/src/main/java/org/apache/airavata/api/thrift/server/CredentialServiceServer.java
index 59c2f04cde..f264da38fb 100644
--- a/airavata-api/src/main/java/org/apache/airavata/api/thrift/server/CredentialServiceServer.java
+++ b/airavata-api/src/main/java/org/apache/airavata/api/thrift/server/CredentialServiceServer.java
@@ -31,7 +31,11 @@ import org.apache.thrift.transport.TServerTransport;
 import org.apache.thrift.transport.TTransportException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Component;
 
+@Component
 public class CredentialServiceServer implements IServer {
     private static final Logger logger = LoggerFactory.getLogger(CredentialServiceServer.class);
     private static final String SERVER_NAME = "Credential Store Server";
@@ -40,6 +44,9 @@ public class CredentialServiceServer implements IServer {
     private IServer.ServerStatus status;
     private TServer server;
 
+    @Autowired
+    private ApplicationContext applicationContext;
+
     public CredentialServiceServer() {
         setStatus(IServer.ServerStatus.STOPPED);
     }
@@ -60,8 +67,9 @@ public class CredentialServiceServer implements IServer {
             setStatus(ServerStatus.STARTING);
             final int serverPort = Integer.parseInt(ServerSettings.getCredentialStoreServerPort());
             final String serverHost = ServerSettings.getCredentialStoreServerHost();
+            CredentialServiceHandler handler = applicationContext.getBean(CredentialServiceHandler.class);
             CredentialStoreService.Processor processor =
-                    new CredentialStoreService.Processor(new CredentialServiceHandler());
+                    new CredentialStoreService.Processor(handler);
 
             TServerTransport serverTransport;
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/api/thrift/server/OrchestratorServiceServer.java b/airavata-api/src/main/java/org/apache/airavata/api/thrift/server/OrchestratorServiceServer.java
index 29afa7a963..4b82939269 100644
--- a/airavata-api/src/main/java/org/apache/airavata/api/thrift/server/OrchestratorServiceServer.java
+++ b/airavata-api/src/main/java/org/apache/airavata/api/thrift/server/OrchestratorServiceServer.java
@@ -37,7 +37,11 @@ import org.apache.thrift.transport.TTransportException;
 import org.quartz.SchedulerException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Component;
 
+@Component
 public class OrchestratorServiceServer implements IServer {
 
     private static final Logger logger = LoggerFactory.getLogger(OrchestratorServiceServer.class);
@@ -54,6 +58,9 @@ public class OrchestratorServiceServer implements IServer {
 
     private static DataInterpreterService dataInterpreterService;
 
+    @Autowired
+    private ApplicationContext applicationContext;
+
     //	private ClusterStatusMonitorJobScheduler clusterStatusMonitorJobScheduler;
 
     public OrchestratorServiceServer() {
@@ -179,8 +186,9 @@ public class OrchestratorServiceServer implements IServer {
         }
 
         setStatus(ServerStatus.STARTING);
+        OrchestratorServiceHandler handler = applicationContext.getBean(OrchestratorServiceHandler.class);
         OrchestratorService.Processor<OrchestratorServiceHandler> orchestratorService =
-                new OrchestratorService.Processor<OrchestratorServiceHandler>(new OrchestratorServiceHandler());
+                new OrchestratorService.Processor<OrchestratorServiceHandler>(handler);
         StartOrchestratorServer(orchestratorService);
     }
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/api/thrift/server/ProfileServiceServer.java b/airavata-api/src/main/java/org/apache/airavata/api/thrift/server/ProfileServiceServer.java
index 83bd5f54d7..67950c43cc 100644
--- a/airavata-api/src/main/java/org/apache/airavata/api/thrift/server/ProfileServiceServer.java
+++ b/airavata-api/src/main/java/org/apache/airavata/api/thrift/server/ProfileServiceServer.java
@@ -48,10 +48,14 @@ import org.apache.thrift.transport.TServerTransport;
 import org.apache.thrift.transport.TTransportException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Component;
 
 /**
  * Created by goshenoy on 03/08/2017.
  */
+@Component
 public class ProfileServiceServer implements IServer {
 
     private static final Logger logger = LoggerFactory.getLogger(ProfileServiceServer.class);
@@ -63,6 +67,9 @@ public class ProfileServiceServer implements IServer {
     private TServer server;
     private List<DBInitConfig> dbInitConfigs = Arrays.asList(new UserProfileCatalogDBInitConfig());
 
+    @Autowired
+    private ApplicationContext applicationContext;
+
     public ProfileServiceServer() {
         setStatus(ServerStatus.STOPPED);
     }
@@ -94,11 +101,17 @@ public class ProfileServiceServer implements IServer {
 
             final int serverPort = Integer.parseInt(ServerSettings.getProfileServiceServerPort());
 
+            // Get handlers from Spring context
+            UserProfileServiceHandler userProfileHandler = applicationContext.getBean(UserProfileServiceHandler.class);
+            TenantProfileServiceHandler tenantProfileHandler = applicationContext.getBean(TenantProfileServiceHandler.class);
+            IamAdminServiceHandler iamAdminHandler = applicationContext.getBean(IamAdminServiceHandler.class);
+            GroupManagerServiceHandler groupManagerHandler = applicationContext.getBean(GroupManagerServiceHandler.class);
+
             // create multiple processors for each profile-service
-            var userProfileProcessor = new UserProfileService.Processor<>(new UserProfileServiceHandler());
-            var teneantProfileProcessor = new TenantProfileService.Processor<>(new TenantProfileServiceHandler());
-            var iamAdminServicesProcessor = new IamAdminServices.Processor<>(new IamAdminServiceHandler());
-            var groupmanagerProcessor = new GroupManagerService.Processor<>(new GroupManagerServiceHandler());
+            var userProfileProcessor = new UserProfileService.Processor<>(userProfileHandler);
+            var teneantProfileProcessor = new TenantProfileService.Processor<>(tenantProfileHandler);
+            var iamAdminServicesProcessor = new IamAdminServices.Processor<>(iamAdminHandler);
+            var groupmanagerProcessor = new GroupManagerService.Processor<>(groupManagerHandler);
 
             // create a multiplexed processor
             TMultiplexedProcessor profileServiceProcessor = new TMultiplexedProcessor();
diff --git a/airavata-api/src/main/java/org/apache/airavata/api/thrift/server/RegistryServiceServer.java b/airavata-api/src/main/java/org/apache/airavata/api/thrift/server/RegistryServiceServer.java
index 6e340998d1..54b2f27538 100644
--- a/airavata-api/src/main/java/org/apache/airavata/api/thrift/server/RegistryServiceServer.java
+++ b/airavata-api/src/main/java/org/apache/airavata/api/thrift/server/RegistryServiceServer.java
@@ -40,7 +40,11 @@ import org.apache.thrift.transport.TServerTransport;
 import org.apache.thrift.transport.TTransportException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Component;
 
+@Component
 public class RegistryServiceServer implements IServer {
     private static final Logger logger = LoggerFactory.getLogger(RegistryServiceServer.class);
 
@@ -51,6 +55,9 @@ public class RegistryServiceServer implements IServer {
 
     private TServer server;
 
+    @Autowired
+    private ApplicationContext applicationContext;
+
     private List<DBInitConfig> dbInitConfigs =
             Arrays.asList(new ExpCatalogDBInitConfig(), new AppCatalogDBInitConfig(), new ReplicaCatalogDBInitConfig());
 
@@ -138,8 +145,9 @@ public class RegistryServiceServer implements IServer {
     @Override
     public void start() throws Exception {
         setStatus(ServerStatus.STARTING);
+        RegistryServiceHandler handler = applicationContext.getBean(RegistryServiceHandler.class);
         RegistryService.Processor<RegistryServiceHandler> orchestratorService =
-                new RegistryService.Processor<RegistryServiceHandler>(new RegistryServiceHandler());
+                new RegistryService.Processor<RegistryServiceHandler>(handler);
         StartRegistryServer(orchestratorService);
     }
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/api/thrift/server/SharingRegistryServer.java b/airavata-api/src/main/java/org/apache/airavata/api/thrift/server/SharingRegistryServer.java
index 9a45e13324..bff0064444 100644
--- a/airavata-api/src/main/java/org/apache/airavata/api/thrift/server/SharingRegistryServer.java
+++ b/airavata-api/src/main/java/org/apache/airavata/api/thrift/server/SharingRegistryServer.java
@@ -38,7 +38,11 @@ import org.apache.thrift.transport.TServerTransport;
 import org.apache.thrift.transport.TTransportException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Component;
 
+@Component
 public class SharingRegistryServer implements IServer {
     private static final Logger logger = LoggerFactory.getLogger(SharingRegistryServer.class);
 
@@ -52,6 +56,9 @@ public class SharingRegistryServer implements IServer {
     private TServer server;
     private boolean testMode = false;
 
+    @Autowired
+    private ApplicationContext applicationContext;
+
     public SharingRegistryServer() {
         setStatus(IServer.ServerStatus.STOPPED);
     }
@@ -73,8 +80,9 @@ public class SharingRegistryServer implements IServer {
 
             final int serverPort = Integer.parseInt(ServerSettings.getSetting(SHARING_REG_SERVER_PORT));
             final String serverHost = ServerSettings.getSetting(SHARING_REG_SERVER_HOST);
-            SharingRegistryService.Processor processor = new SharingRegistryService.Processor(
-                    new SharingRegistryServerHandler(createSharingRegistryDBInitConfig()));
+            // SharingRegistryServerHandler doesn't need DBInitConfig anymore - it's a Spring bean
+            SharingRegistryServerHandler handler = applicationContext.getBean(SharingRegistryServerHandler.class);
+            SharingRegistryService.Processor processor = new SharingRegistryService.Processor(handler);
 
             TServerTransport serverTransport;
             TThreadPoolServer.Args options;
diff --git a/airavata-api/src/main/java/org/apache/airavata/config/BackgroundServicesLauncher.java b/airavata-api/src/main/java/org/apache/airavata/config/BackgroundServicesLauncher.java
new file mode 100644
index 0000000000..5e94cbc8c1
--- /dev/null
+++ b/airavata-api/src/main/java/org/apache/airavata/config/BackgroundServicesLauncher.java
@@ -0,0 +1,234 @@
+/**
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+package org.apache.airavata.config;
+
+import org.apache.airavata.common.utils.ServerSettings;
+import org.apache.airavata.helix.impl.controller.HelixController;
+import org.apache.airavata.helix.impl.participant.GlobalParticipant;
+import org.apache.airavata.helix.impl.workflow.PostWorkflowManager;
+import org.apache.airavata.helix.impl.workflow.PreWorkflowManager;
+import org.apache.airavata.helix.impl.workflow.ParserWorkflowManager;
+import org.apache.airavata.monitor.email.EmailBasedMonitor;
+import org.apache.airavata.monitor.platform.MonitoringServer;
+import org.apache.airavata.monitor.realtime.RealtimeMonitor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.annotation.Order;
+
+/**
+ * Configuration class to launch all background services when Spring Boot starts.
+ * Services are started in the correct order based on dependencies.
+ */
+@Configuration
+public class BackgroundServicesLauncher {
+
+    private static final Logger logger = LoggerFactory.getLogger(BackgroundServicesLauncher.class);
+
+    @Bean
+    @Order(1)
+    public CommandLineRunner startHelixController() {
+        return args -> {
+            if (shouldStartService("helix.controller.enabled", true)) {
+                logger.info("Starting Helix Controller...");
+                Thread controllerThread = new Thread(() -> {
+                    try {
+                        HelixController controller = new HelixController();
+                        controller.startServer();
+                    } catch (Exception e) {
+                        logger.error("Failed to start Helix Controller", e);
+                    }
+                });
+                controllerThread.setName("HelixController");
+                controllerThread.setDaemon(true);
+                controllerThread.start();
+                logger.info("Helix Controller thread started");
+            }
+        };
+    }
+
+    @Bean
+    @Order(2)
+    public CommandLineRunner startGlobalParticipant() {
+        return args -> {
+            if (shouldStartService("helix.participant.enabled", true)) {
+                logger.info("Starting Global Participant...");
+                Thread participantThread = new Thread(() -> {
+                    try {
+                        GlobalParticipant.main(new String[0]);
+                    } catch (Exception e) {
+                        logger.error("Failed to start Global Participant", e);
+                    }
+                });
+                participantThread.setName("GlobalParticipant");
+                participantThread.setDaemon(true);
+                participantThread.start();
+                logger.info("Global Participant thread started");
+            }
+        };
+    }
+
+    @Bean
+    @Order(3)
+    public CommandLineRunner startPreWorkflowManager() {
+        return args -> {
+            if (shouldStartService("workflow.pre.enabled", true)) {
+                logger.info("Starting Pre Workflow Manager...");
+                Thread preWmThread = new Thread(() -> {
+                    try {
+                        PreWorkflowManager manager = new PreWorkflowManager();
+                        manager.startServer();
+                        // Keep thread alive
+                        Thread.currentThread().join();
+                    } catch (Exception e) {
+                        logger.error("Failed to start Pre Workflow Manager", e);
+                    }
+                });
+                preWmThread.setName("PreWorkflowManager");
+                preWmThread.setDaemon(true);
+                preWmThread.start();
+                logger.info("Pre Workflow Manager thread started");
+            }
+        };
+    }
+
+    @Bean
+    @Order(4)
+    public CommandLineRunner startParserWorkflowManager() {
+        return args -> {
+            if (shouldStartService("workflow.parser.enabled", true)) {
+                logger.info("Starting Parser Workflow Manager...");
+                Thread parserWmThread = new Thread(() -> {
+                    try {
+                        ParserWorkflowManager.main(new String[0]);
+                    } catch (Exception e) {
+                        logger.error("Failed to start Parser Workflow Manager", e);
+                    }
+                });
+                parserWmThread.setName("ParserWorkflowManager");
+                parserWmThread.setDaemon(true);
+                parserWmThread.start();
+                logger.info("Parser Workflow Manager thread started");
+            }
+        };
+    }
+
+    @Bean
+    @Order(5)
+    public CommandLineRunner startPostWorkflowManager() {
+        return args -> {
+            if (shouldStartService("workflow.post.enabled", true)) {
+                logger.info("Starting Post Workflow Manager...");
+                Thread postWmThread = new Thread(() -> {
+                    try {
+                        PostWorkflowManager manager = new PostWorkflowManager();
+                        manager.startServer();
+                        Thread.currentThread().join();
+                    } catch (Exception e) {
+                        logger.error("Failed to start Post Workflow Manager", e);
+                    }
+                });
+                postWmThread.setName("PostWorkflowManager");
+                postWmThread.setDaemon(true);
+                postWmThread.start();
+                logger.info("Post Workflow Manager thread started");
+            }
+        };
+    }
+
+    @Bean
+    @Order(6)
+    public CommandLineRunner startRealtimeMonitor() {
+        return args -> {
+            if (shouldStartService("monitor.realtime.enabled", true)) {
+                logger.info("Starting Realtime Monitor...");
+                Thread monitorThread = new Thread(() -> {
+                    try {
+                        RealtimeMonitor.main(new String[0]);
+                    } catch (Exception e) {
+                        logger.error("Failed to start Realtime Monitor", e);
+                    }
+                });
+                monitorThread.setName("RealtimeMonitor");
+                monitorThread.setDaemon(true);
+                monitorThread.start();
+                logger.info("Realtime Monitor thread started");
+            }
+        };
+    }
+
+    @Bean
+    @Order(7)
+    public CommandLineRunner startEmailMonitor() {
+        return args -> {
+            if (shouldStartService("monitor.email.enabled", true)) {
+                logger.info("Starting Email Monitor...");
+                Thread emailThread = new Thread(() -> {
+                    try {
+                        EmailBasedMonitor monitor = new EmailBasedMonitor();
+                        monitor.startServer();
+                    } catch (Exception e) {
+                        logger.error("Failed to start Email Monitor", e);
+                    }
+                });
+                emailThread.setName("EmailMonitor");
+                emailThread.setDaemon(true);
+                emailThread.start();
+                logger.info("Email Monitor thread started");
+            }
+        };
+    }
+
+    @Bean
+    @Order(8)
+    public CommandLineRunner startMonitoringServer() {
+        return args -> {
+            if (ServerSettings.getBooleanSetting("api.server.monitoring.enabled")) {
+                logger.info("Starting Monitoring Server...");
+                try {
+                    MonitoringServer monitoringServer = new MonitoringServer(
+                            ServerSettings.getSetting("api.server.monitoring.host"),
+                            ServerSettings.getIntSetting("api.server.monitoring.port"));
+                    monitoringServer.start();
+                    Runtime.getRuntime().addShutdownHook(new Thread(monitoringServer::stop));
+                    logger.info("Monitoring Server started successfully");
+                } catch (Exception e) {
+                    logger.error("Failed to start Monitoring Server", e);
+                }
+            }
+        };
+    }
+
+    private boolean shouldStartService(String propertyKey, boolean defaultValue) {
+        try {
+            String value = ServerSettings.getSetting(propertyKey);
+            if (value != null) {
+                return Boolean.parseBoolean(value);
+            }
+            return defaultValue;
+        } catch (Exception e) {
+            logger.debug("Property {} not found, using default: {}", propertyKey, defaultValue);
+            return defaultValue;
+        }
+    }
+}
+
diff --git a/airavata-api/src/main/java/org/apache/airavata/config/JpaConfig.java b/airavata-api/src/main/java/org/apache/airavata/config/JpaConfig.java
new file mode 100644
index 0000000000..bd3dfc4eca
--- /dev/null
+++ b/airavata-api/src/main/java/org/apache/airavata/config/JpaConfig.java
@@ -0,0 +1,167 @@
+/**
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+package org.apache.airavata.config;
+
+import jakarta.persistence.EntityManager;
+import jakarta.persistence.EntityManagerFactory;
+import org.apache.airavata.common.utils.JDBCConfig;
+import org.apache.airavata.common.utils.JPAUtils;
+import org.apache.airavata.profile.commons.utils.ProfileServiceJDBCConfig;
+import org.apache.airavata.registry.core.utils.AppCatalogJDBCConfig;
+import org.apache.airavata.registry.core.utils.ExpCatalogJDBCConfig;
+import org.apache.airavata.registry.core.utils.ReplicaCatalogJDBCConfig;
+import org.apache.airavata.registry.core.utils.WorkflowCatalogJDBCConfig;
+import org.apache.airavata.sharing.db.utils.SharingRegistryJDBCConfig;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.context.annotation.Scope;
+import org.springframework.orm.jpa.JpaTransactionManager;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+/**
+ * Configuration for multiple JPA persistence units.
+ * Spring Boot typically expects a single persistence unit, so we need
+ * custom configuration for each of the 6 persistence units.
+ */
+@Configuration
+@EnableTransactionManagement
+public class JpaConfig {
+
+    // Persistence unit names
+    public static final String PROFILE_SERVICE_PU = "profile_service";
+    public static final String APPCATALOG_PU = "appcatalog_data_new";
+    public static final String EXPCATALOG_PU = "experiment_data_new";
+    public static final String REPLICACATALOG_PU = "replicacatalog_data_new";
+    public static final String WORKFLOWCATALOG_PU = "workflowcatalog_data_new";
+    public static final String SHARING_REGISTRY_PU = "airavata-sharing-registry";
+
+    @Bean(name = "profileServiceEntityManagerFactory")
+    @Primary
+    public EntityManagerFactory profileServiceEntityManagerFactory() {
+        JDBCConfig jdbcConfig = new ProfileServiceJDBCConfig();
+        return JPAUtils.getEntityManagerFactory(PROFILE_SERVICE_PU, jdbcConfig);
+    }
+
+    @Bean(name = "appCatalogEntityManagerFactory")
+    public EntityManagerFactory appCatalogEntityManagerFactory() {
+        JDBCConfig jdbcConfig = new AppCatalogJDBCConfig();
+        return JPAUtils.getEntityManagerFactory(APPCATALOG_PU, jdbcConfig);
+    }
+
+    @Bean(name = "expCatalogEntityManagerFactory")
+    public EntityManagerFactory expCatalogEntityManagerFactory() {
+        JDBCConfig jdbcConfig = new ExpCatalogJDBCConfig();
+        return JPAUtils.getEntityManagerFactory(EXPCATALOG_PU, jdbcConfig);
+    }
+
+    @Bean(name = "replicaCatalogEntityManagerFactory")
+    public EntityManagerFactory replicaCatalogEntityManagerFactory() {
+        JDBCConfig jdbcConfig = new ReplicaCatalogJDBCConfig();
+        return JPAUtils.getEntityManagerFactory(REPLICACATALOG_PU, jdbcConfig);
+    }
+
+    @Bean(name = "workflowCatalogEntityManagerFactory")
+    public EntityManagerFactory workflowCatalogEntityManagerFactory() {
+        JDBCConfig jdbcConfig = new WorkflowCatalogJDBCConfig();
+        return JPAUtils.getEntityManagerFactory(WORKFLOWCATALOG_PU, jdbcConfig);
+    }
+
+    @Bean(name = "sharingRegistryEntityManagerFactory")
+    public EntityManagerFactory sharingRegistryEntityManagerFactory() {
+        JDBCConfig jdbcConfig = new SharingRegistryJDBCConfig();
+        return JPAUtils.getEntityManagerFactory(SHARING_REGISTRY_PU, jdbcConfig);
+    }
+
+    // Transaction managers for each persistence unit
+    @Bean(name = "profileServiceTransactionManager")
+    @Primary
+    public PlatformTransactionManager profileServiceTransactionManager() {
+        return new JpaTransactionManager(profileServiceEntityManagerFactory());
+    }
+
+    @Bean(name = "appCatalogTransactionManager")
+    public PlatformTransactionManager appCatalogTransactionManager() {
+        return new JpaTransactionManager(appCatalogEntityManagerFactory());
+    }
+
+    @Bean(name = "expCatalogTransactionManager")
+    public PlatformTransactionManager expCatalogTransactionManager() {
+        return new JpaTransactionManager(expCatalogEntityManagerFactory());
+    }
+
+    @Bean(name = "replicaCatalogTransactionManager")
+    public PlatformTransactionManager replicaCatalogTransactionManager() {
+        return new JpaTransactionManager(replicaCatalogEntityManagerFactory());
+    }
+
+    @Bean(name = "workflowCatalogTransactionManager")
+    public PlatformTransactionManager workflowCatalogTransactionManager() {
+        return new JpaTransactionManager(workflowCatalogEntityManagerFactory());
+    }
+
+    @Bean(name = "sharingRegistryTransactionManager")
+    public PlatformTransactionManager sharingRegistryTransactionManager() {
+        return new JpaTransactionManager(sharingRegistryEntityManagerFactory());
+    }
+
+    // EntityManager beans for injection into repositories
+    // Note: EntityManagers are thread-safe when used with Spring's transaction management
+    // We use prototype scope to create new instances as needed
+    @Bean(name = "appCatalogEntityManager")
+    @Scope("prototype")
+    public EntityManager appCatalogEntityManager(@Qualifier("appCatalogEntityManagerFactory") EntityManagerFactory emf) {
+        return emf.createEntityManager();
+    }
+
+    @Bean(name = "expCatalogEntityManager")
+    @Scope("prototype")
+    public EntityManager expCatalogEntityManager(@Qualifier("expCatalogEntityManagerFactory") EntityManagerFactory emf) {
+        return emf.createEntityManager();
+    }
+
+    @Bean(name = "replicaCatalogEntityManager")
+    @Scope("prototype")
+    public EntityManager replicaCatalogEntityManager(@Qualifier("replicaCatalogEntityManagerFactory") EntityManagerFactory emf) {
+        return emf.createEntityManager();
+    }
+
+    @Bean(name = "workflowCatalogEntityManager")
+    @Scope("prototype")
+    public EntityManager workflowCatalogEntityManager(@Qualifier("workflowCatalogEntityManagerFactory") EntityManagerFactory emf) {
+        return emf.createEntityManager();
+    }
+
+    @Bean(name = "profileServiceEntityManager")
+    @Scope("prototype")
+    @Primary
+    public EntityManager profileServiceEntityManager(@Qualifier("profileServiceEntityManagerFactory") EntityManagerFactory emf) {
+        return emf.createEntityManager();
+    }
+
+    @Bean(name = "sharingRegistryEntityManager")
+    @Scope("prototype")
+    public EntityManager sharingRegistryEntityManager(@Qualifier("sharingRegistryEntityManagerFactory") EntityManagerFactory emf) {
+        return emf.createEntityManager();
+    }
+}
+
diff --git a/airavata-api/src/main/java/org/apache/airavata/config/RegistryServiceProvider.java b/airavata-api/src/main/java/org/apache/airavata/config/RegistryServiceProvider.java
new file mode 100644
index 0000000000..9e5953f9e5
--- /dev/null
+++ b/airavata-api/src/main/java/org/apache/airavata/config/RegistryServiceProvider.java
@@ -0,0 +1,47 @@
+/**
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+package org.apache.airavata.config;
+
+import org.apache.airavata.service.RegistryService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * Provider to make RegistryService available to components that can't use Spring injection
+ * (e.g., workflow managers started via main methods).
+ */
+@Component
+public class RegistryServiceProvider {
+
+    private static RegistryService instance;
+
+    @Autowired
+    public void setRegistryService(RegistryService registryService) {
+        RegistryServiceProvider.instance = registryService;
+    }
+
+    public static RegistryService getInstance() {
+        if (instance == null) {
+            throw new IllegalStateException("RegistryService not initialized. Spring context may not be ready.");
+        }
+        return instance;
+    }
+}
+
diff --git a/airavata-api/src/main/java/org/apache/airavata/config/ThriftServerLauncher.java b/airavata-api/src/main/java/org/apache/airavata/config/ThriftServerLauncher.java
new file mode 100644
index 0000000000..82a436b641
--- /dev/null
+++ b/airavata-api/src/main/java/org/apache/airavata/config/ThriftServerLauncher.java
@@ -0,0 +1,87 @@
+/**
+*
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements. See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership. The ASF licenses this file
+* to you under the Apache License, Version 2.0 (the
+* "License"); you may not use this file except in compliance
+* with the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+* KIND, either express or implied. See the License for the
+* specific language governing permissions and limitations
+* under the License.
+*/
+package org.apache.airavata.config;
+
+import org.apache.airavata.common.utils.ApplicationSettings;
+import org.apache.airavata.main.ThriftAPI;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.context.ApplicationContext;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+/**
+ * Launches Thrift API servers using Spring context.
+ * This runs after background services are started (Order 10).
+ */
+@Component
+@Order(10)
+public class ThriftServerLauncher implements CommandLineRunner {
+
+    private static final Logger logger = LoggerFactory.getLogger(ThriftServerLauncher.class);
+    private static final String SERVERS_KEY = "servers";
+
+    @Autowired
+    private ApplicationContext applicationContext;
+
+    @Override
+    public void run(String... args) throws Exception {
+        logger.info("Starting Thrift API servers via Spring integration...");
+        
+        // Set Spring context in ThriftAPI for server loading
+        ThriftAPI.setSpringContext((org.springframework.context.ConfigurableApplicationContext) applicationContext);
+        
+        // Parse server names from args
+        String serverNames = "all";
+        for (String string : args) {
+            logger.info("Server Arguments: " + string);
+            if (string.startsWith("--servers=")) {
+                serverNames = string.substring("--servers=".length());
+            }
+        }
+        serverNames = ApplicationSettings.getSetting(SERVERS_KEY, serverNames);
+        
+        // Start all Thrift servers using ThriftAPI's logic
+        // This will use Spring context for server instances
+        ThriftAPI.startAllServers(serverNames);
+        
+        // Keep the application running
+        logger.info("All Airavata services started successfully. Application will continue running...");
+        keepAlive();
+    }
+
+    private void keepAlive() {
+        // Keep the main thread alive so Spring application doesn't exit
+        // Background services run in daemon threads, so we need to keep main thread alive
+        try {
+            synchronized (this) {
+                while (!Thread.currentThread().isInterrupted()) {
+                    this.wait();
+                }
+            }
+        } catch (InterruptedException e) {
+            logger.info("ThriftServerLauncher interrupted, shutting down...");
+            Thread.currentThread().interrupt();
+        }
+    }
+}
+
diff --git a/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/PostWorkflowManager.java b/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/PostWorkflowManager.java
index 09e1086486..1ede009214 100644
--- a/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/PostWorkflowManager.java
+++ b/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/PostWorkflowManager.java
@@ -114,10 +114,15 @@ public class PostWorkflowManager extends WorkflowManager {
 
         RegistryService registryService;
         try {
-            registryService = ServiceFactory.getInstance().getRegistryService();
-        } catch (ServiceFactoryException e) {
-            logger.error("Failed to get RegistryService from ServiceFactory", e);
-            return false;
+            registryService = org.apache.airavata.config.RegistryServiceProvider.getInstance();
+        } catch (Exception e) {
+            // Fallback to ServiceFactory for backward compatibility
+            try {
+                registryService = ServiceFactory.getInstance().getRegistryService();
+            } catch (ServiceFactoryException ex) {
+                logger.error("Failed to get RegistryService from ServiceFactory", ex);
+                return false;
+            }
         }
 
         var jobId = jobStatusResult.getJobId();
diff --git a/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/PreWorkflowManager.java b/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/PreWorkflowManager.java
index f05f9c6060..c3278c7001 100644
--- a/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/PreWorkflowManager.java
+++ b/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/PreWorkflowManager.java
@@ -93,7 +93,7 @@ public class PreWorkflowManager extends WorkflowManager {
     private String createAndLaunchPreWorkflow(String processId, boolean forceRun) throws Exception {
 
         prewfCounter.inc();
-        RegistryService registryService = ServiceFactory.getInstance().getRegistryService();
+        RegistryService registryService = getRegistryService();
 
         ProcessModel processModel;
         ExperimentModel experimentModel;
diff --git a/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/WorkflowManager.java b/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/WorkflowManager.java
index 62a3bd9869..fda4fee9ac 100644
--- a/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/WorkflowManager.java
+++ b/airavata-api/src/main/java/org/apache/airavata/helix/impl/workflow/WorkflowManager.java
@@ -103,9 +103,18 @@ public class WorkflowManager {
     }
 
     private void initRegistryService()
-            throws ApplicationSettingsException, IllegalAccessException, ClassNotFoundException, InstantiationException,
-                    ServiceFactoryException {
-        this.registryService = ServiceFactory.getInstance().getRegistryService();
+            throws ApplicationSettingsException, IllegalAccessException, ClassNotFoundException, InstantiationException {
+        // Try to get from Spring context first, fallback to ServiceFactory for backward compatibility
+        try {
+            this.registryService = org.apache.airavata.config.RegistryServiceProvider.getInstance();
+        } catch (Exception e) {
+            // Fallback to ServiceFactory if Spring context not available
+            try {
+                this.registryService = ServiceFactory.getInstance().getRegistryService();
+            } catch (ServiceFactoryException ex) {
+                throw new IllegalStateException("Failed to get RegistryService", ex);
+            }
+        }
     }
 
     public Publisher getStatusPublisher() {
diff --git a/airavata-api/src/main/java/org/apache/airavata/main/ThriftAPI.java b/airavata-api/src/main/java/org/apache/airavata/main/ThriftAPI.java
index c2c87aceea..251a9d7eca 100644
--- a/airavata-api/src/main/java/org/apache/airavata/main/ThriftAPI.java
+++ b/airavata-api/src/main/java/org/apache/airavata/main/ThriftAPI.java
@@ -35,6 +35,9 @@ import org.apache.airavata.common.utils.StringUtil.CommandLineParameters;
 import org.apache.airavata.monitor.platform.MonitoringServer;
 import org.apache.commons.cli.ParseException;
 import org.apache.zookeeper.server.ServerCnxnFactory;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+import org.apache.airavata.AiravataApplication;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -48,6 +51,20 @@ public class ThriftAPI {
     private static final String serverStartedFileNamePrefix = "server_start";
     private static boolean systemShutDown = false;
     private static String STOP_COMMAND_STR = "stop";
+    private static ConfigurableApplicationContext springContext;
+
+    /**
+     * Set the Spring application context for server loading.
+     * Called by AiravataApplication after Spring context is initialized.
+     */
+    public static void setSpringContext(ConfigurableApplicationContext context) {
+        springContext = context;
+        logger.info("Spring context set in ThriftAPI");
+    }
+
+    public static ConfigurableApplicationContext getSpringContext() {
+        return springContext;
+    }
 
     private static final String ALL_IN_ONE = "all";
     private static final String API_ORCH = "api-orch";
@@ -78,12 +95,24 @@ public class ThriftAPI {
                     Class<?> classInstance;
                     try {
                         classInstance = ThriftAPI.class.getClassLoader().loadClass(serverClassName);
-                        servers.add((IServer) classInstance.newInstance());
+                        // Try to get from Spring context first, otherwise use reflection
+                        IServer server = null;
+                        if (springContext != null) {
+                            try {
+                                server = springContext.getBean(classInstance.asSubclass(IServer.class));
+                            } catch (Exception e) {
+                                // Not a Spring bean, use reflection
+                                logger.debug("Server {} not found in Spring context, using reflection", serverClassName);
+                            }
+                        }
+                        if (server == null) {
+                            server = (IServer) classInstance.getDeclaredConstructor().newInstance();
+                        }
+                        servers.add(server);
                     } catch (ClassNotFoundException e) {
                         logger.error("Error while locating server implementation \"" + serverString + "\"!!!", e);
-                    } catch (InstantiationException e) {
-                        logger.error("Error while initiating server instance \"" + serverString + "\"!!!", e);
-                    } catch (IllegalAccessException e) {
+                    } catch (InstantiationException | IllegalAccessException | 
+                             java.lang.reflect.InvocationTargetException | NoSuchMethodException e) {
                         logger.error("Error while initiating server instance \"" + serverString + "\"!!!", e);
                     } catch (ClassCastException e) {
                         logger.error("Invalid server \"" + serverString + "\"!!!", e);
@@ -104,7 +133,7 @@ public class ThriftAPI {
         });
     }
 
-    private static List<String> handleServerDependencies(String serverNames) {
+    public static List<String> handleServerDependencies(String serverNames) {
         List<String> serverList = new ArrayList<>(Arrays.asList(serverNames.split(",")));
         if (serverList.indexOf(ALL_IN_ONE) > -1) {
             serverList.clear();
@@ -168,9 +197,33 @@ public class ThriftAPI {
         }
     }
 
-    private static void performServerStart(String[] args) {
+    public static void performServerStart(String[] args) {
         setServerStarted();
         logger.info("Airavata server instance starting...");
+        
+        // Spring context should already be initialized by AiravataApplication
+        // Try to get it from Spring's ApplicationContextAware or use a static reference
+        if (springContext == null) {
+            logger.warn("Spring context not available, attempting to initialize...");
+            try {
+                springContext = new AnnotationConfigApplicationContext(AiravataApplication.class);
+                logger.info("Spring application context initialized successfully");
+                
+                // Register shutdown hook for Spring context
+                Runtime.getRuntime().addShutdownHook(new Thread(() -> {
+                    if (springContext != null) {
+                        logger.info("Closing Spring application context...");
+                        springContext.close();
+                    }
+                }));
+            } catch (Exception e) {
+                logger.error("Failed to initialize Spring application context", e);
+                throw new RuntimeException("Failed to initialize Spring context", e);
+            }
+        } else {
+            logger.info("Using existing Spring application context");
+        }
+        
         String serverNames = "all";
         for (String string : args) {
             logger.info("Server Arguments: " + string);
@@ -342,7 +395,7 @@ public class ThriftAPI {
 
     private static final int SERVER_STATUS_CHANGE_WAIT_INTERVAL = 500;
 
-    private static void waitForServerToStart(IServer server, Integer maxWait) throws Exception {
+    public static void waitForServerToStart(IServer server, Integer maxWait) throws Exception {
         int count = 0;
         //		if (server.getStatus()==ServerStatus.STARTING) {
         //			logger.info("Waiting for " + server.getName() + " to start...");
diff --git a/airavata-api/src/main/java/org/apache/airavata/profile/tenant/core/repositories/TenantProfileRepository.java b/airavata-api/src/main/java/org/apache/airavata/profile/tenant/core/repositories/TenantProfileRepository.java
index 63290314fc..40787ba4d4 100644
--- a/airavata-api/src/main/java/org/apache/airavata/profile/tenant/core/repositories/TenantProfileRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/profile/tenant/core/repositories/TenantProfileRepository.java
@@ -30,10 +30,12 @@ import org.apache.airavata.profile.commons.tenant.entities.GatewayEntity;
 import org.apache.airavata.profile.commons.utils.QueryConstants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
 /**
  * Created by goshenoy on 3/8/17.
  */
+@Repository
 public class TenantProfileRepository extends AbstractRepository<Gateway, GatewayEntity, String> {
 
     private static final Logger logger = LoggerFactory.getLogger(TenantProfileRepository.class);
diff --git a/airavata-api/src/main/java/org/apache/airavata/profile/user/core/repositories/UserProfileRepository.java b/airavata-api/src/main/java/org/apache/airavata/profile/user/core/repositories/UserProfileRepository.java
index 5be2a54db6..979c27dd19 100644
--- a/airavata-api/src/main/java/org/apache/airavata/profile/user/core/repositories/UserProfileRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/profile/user/core/repositories/UserProfileRepository.java
@@ -31,7 +31,9 @@ import org.apache.airavata.profile.commons.utils.ObjectMapperSingleton;
 import org.apache.airavata.profile.commons.utils.QueryConstants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class UserProfileRepository extends AbstractRepository<UserProfile, UserProfileEntity, String> {
     private static final Logger logger = LoggerFactory.getLogger(UserProfileRepository.class);
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/AppCatAbstractRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/AppCatAbstractRepository.java
index 9a1bafbeb9..140685059a 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/AppCatAbstractRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/AppCatAbstractRepository.java
@@ -20,17 +20,23 @@
 package org.apache.airavata.registry.core.repositories.appcatalog;
 
 import jakarta.persistence.EntityManager;
+import jakarta.persistence.EntityManagerFactory;
 import org.apache.airavata.registry.core.repositories.AbstractRepository;
-import org.apache.airavata.registry.core.utils.JPAUtil.AppCatalogJPAUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 
 public class AppCatAbstractRepository<T, E, Id> extends AbstractRepository<T, E, Id> {
 
+    @Autowired
+    @Qualifier("appCatalogEntityManagerFactory")
+    private EntityManagerFactory entityManagerFactory;
+
     public AppCatAbstractRepository(Class<T> thriftGenericClass, Class<E> dbEntityGenericClass) {
         super(thriftGenericClass, dbEntityGenericClass);
     }
 
     @Override
     protected EntityManager getEntityManager() {
-        return AppCatalogJPAUtils.getEntityManager();
+        return entityManagerFactory.createEntityManager();
     }
 }
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ApplicationDeploymentRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ApplicationDeploymentRepository.java
index 3c5f050ec9..7c47c6752a 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ApplicationDeploymentRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ApplicationDeploymentRepository.java
@@ -33,7 +33,9 @@ import org.apache.airavata.registry.cpi.AppCatalogException;
 import org.apache.airavata.registry.cpi.ApplicationDeployment;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class ApplicationDeploymentRepository
         extends AppCatAbstractRepository<ApplicationDeploymentDescription, ApplicationDeploymentEntity, String>
         implements ApplicationDeployment {
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ApplicationInputRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ApplicationInputRepository.java
index 4917721dc2..5070124008 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ApplicationInputRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ApplicationInputRepository.java
@@ -22,7 +22,9 @@ package org.apache.airavata.registry.core.repositories.appcatalog;
 import org.apache.airavata.model.application.io.InputDataObjectType;
 import org.apache.airavata.registry.core.entities.appcatalog.ApplicationInputEntity;
 import org.apache.airavata.registry.core.entities.appcatalog.ApplicationInputPK;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class ApplicationInputRepository
         extends AppCatAbstractRepository<InputDataObjectType, ApplicationInputEntity, ApplicationInputPK> {
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ApplicationInterfaceRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ApplicationInterfaceRepository.java
index 091ac4723e..abbfb1d33c 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ApplicationInterfaceRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ApplicationInterfaceRepository.java
@@ -38,7 +38,9 @@ import org.apache.airavata.registry.cpi.AppCatalogException;
 import org.apache.airavata.registry.cpi.ApplicationInterface;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class ApplicationInterfaceRepository
         extends AppCatAbstractRepository<ApplicationInterfaceDescription, ApplicationInterfaceEntity, String>
         implements ApplicationInterface {
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ApplicationModuleRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ApplicationModuleRepository.java
index 8ede093beb..c96dd40c00 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ApplicationModuleRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ApplicationModuleRepository.java
@@ -18,10 +18,12 @@
 * under the License.
 */
 package org.apache.airavata.registry.core.repositories.appcatalog;
+import org.springframework.stereotype.Repository;
 
 import org.apache.airavata.model.appcatalog.appdeployment.ApplicationModule;
 import org.apache.airavata.registry.core.entities.appcatalog.ApplicationModuleEntity;
 
+@Repository
 public class ApplicationModuleRepository
         extends AppCatAbstractRepository<ApplicationModule, ApplicationModuleEntity, String> {
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ApplicationOutputRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ApplicationOutputRepository.java
index fd20205630..b77f2fbfee 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ApplicationOutputRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ApplicationOutputRepository.java
@@ -18,11 +18,13 @@
 * under the License.
 */
 package org.apache.airavata.registry.core.repositories.appcatalog;
+import org.springframework.stereotype.Repository;
 
 import org.apache.airavata.model.application.io.OutputDataObjectType;
 import org.apache.airavata.registry.core.entities.appcatalog.ApplicationOutputEntity;
 import org.apache.airavata.registry.core.entities.appcatalog.ApplicationOutputPK;
 
+@Repository
 public class ApplicationOutputRepository
         extends AppCatAbstractRepository<OutputDataObjectType, ApplicationOutputEntity, ApplicationOutputPK> {
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/BatchQueuePolicyRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/BatchQueuePolicyRepository.java
index 6bae50c6c1..25c501bfbf 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/BatchQueuePolicyRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/BatchQueuePolicyRepository.java
@@ -18,6 +18,7 @@
 * under the License.
 */
 package org.apache.airavata.registry.core.repositories.appcatalog;
+import org.springframework.stereotype.Repository;
 
 import org.apache.airavata.model.appcatalog.groupresourceprofile.BatchQueueResourcePolicy;
 import org.apache.airavata.registry.core.entities.appcatalog.BatchQueueResourcePolicyEntity;
@@ -25,6 +26,7 @@ import org.apache.airavata.registry.core.entities.appcatalog.BatchQueueResourceP
 /**
  * Created by skariyat on 2/10/18.
  */
+@Repository
 public class BatchQueuePolicyRepository
         extends AppCatAbstractRepository<BatchQueueResourcePolicy, BatchQueueResourcePolicyEntity, String> {
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/BatchQueueRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/BatchQueueRepository.java
index 339aeebefa..6e14746910 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/BatchQueueRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/BatchQueueRepository.java
@@ -18,11 +18,13 @@
 * under the License.
 */
 package org.apache.airavata.registry.core.repositories.appcatalog;
+import org.springframework.stereotype.Repository;
 
 import org.apache.airavata.model.appcatalog.computeresource.BatchQueue;
 import org.apache.airavata.registry.core.entities.appcatalog.BatchQueueEntity;
 import org.apache.airavata.registry.core.entities.appcatalog.BatchQueuePK;
 
+@Repository
 public class BatchQueueRepository extends AppCatAbstractRepository<BatchQueue, BatchQueueEntity, BatchQueuePK> {
 
     public BatchQueueRepository() {
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ComputeResourcePolicyRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ComputeResourcePolicyRepository.java
index 7fbb4db3e8..8f7fa264b5 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ComputeResourcePolicyRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ComputeResourcePolicyRepository.java
@@ -18,6 +18,7 @@
 * under the License.
 */
 package org.apache.airavata.registry.core.repositories.appcatalog;
+import org.springframework.stereotype.Repository;
 
 import org.apache.airavata.model.appcatalog.groupresourceprofile.ComputeResourcePolicy;
 import org.apache.airavata.registry.core.entities.appcatalog.ComputeResourcePolicyEntity;
@@ -25,6 +26,7 @@ import org.apache.airavata.registry.core.entities.appcatalog.ComputeResourcePoli
 /**
  * Created by skariyat on 2/10/18.
  */
+@Repository
 public class ComputeResourcePolicyRepository
         extends AppCatAbstractRepository<ComputeResourcePolicy, ComputeResourcePolicyEntity, String> {
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ComputeResourcePrefRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ComputeResourcePrefRepository.java
index bd89c4bc09..a0dea442e8 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ComputeResourcePrefRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ComputeResourcePrefRepository.java
@@ -18,6 +18,7 @@
 * under the License.
 */
 package org.apache.airavata.registry.core.repositories.appcatalog;
+import org.springframework.stereotype.Repository;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -26,6 +27,7 @@ import org.apache.airavata.registry.core.entities.appcatalog.ComputeResourcePref
 import org.apache.airavata.registry.core.entities.appcatalog.ComputeResourcePreferencePK;
 import org.apache.airavata.registry.core.entities.appcatalog.SSHAccountProvisionerConfiguration;
 
+@Repository
 public class ComputeResourcePrefRepository
         extends AppCatAbstractRepository<
                 ComputeResourcePreference, ComputeResourcePreferenceEntity, ComputeResourcePreferencePK> {
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ComputeResourceRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ComputeResourceRepository.java
index a75ce4488f..7584726735 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ComputeResourceRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ComputeResourceRepository.java
@@ -67,7 +67,9 @@ import org.apache.airavata.registry.cpi.AppCatalogException;
 import org.apache.airavata.registry.cpi.ComputeResource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class ComputeResourceRepository
         extends AppCatAbstractRepository<ComputeResourceDescription, ComputeResourceEntity, String>
         implements ComputeResource {
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/DataMovementRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/DataMovementRepository.java
index 5476698b23..bad0701df4 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/DataMovementRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/DataMovementRepository.java
@@ -18,6 +18,7 @@
 * under the License.
 */
 package org.apache.airavata.registry.core.repositories.appcatalog;
+import org.springframework.stereotype.Repository;
 
 import com.github.dozermapper.core.Mapper;
 import org.apache.airavata.model.data.movement.DataMovementInterface;
@@ -25,6 +26,7 @@ import org.apache.airavata.registry.core.entities.appcatalog.DataMovementInterfa
 import org.apache.airavata.registry.core.entities.appcatalog.DataMovementInterfacePK;
 import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
 
+@Repository
 public class DataMovementRepository
         extends AppCatAbstractRepository<DataMovementInterface, DataMovementInterfaceEntity, DataMovementInterfacePK> {
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/GatewayGroupsRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/GatewayGroupsRepository.java
index a8ba315fde..c485f45ad7 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/GatewayGroupsRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/GatewayGroupsRepository.java
@@ -18,10 +18,12 @@
 * under the License.
 */
 package org.apache.airavata.registry.core.repositories.appcatalog;
+import org.springframework.stereotype.Repository;
 
 import org.apache.airavata.model.appcatalog.gatewaygroups.GatewayGroups;
 import org.apache.airavata.registry.core.entities.appcatalog.GatewayGroupsEntity;
 
+@Repository
 public class GatewayGroupsRepository extends AppCatAbstractRepository<GatewayGroups, GatewayGroupsEntity, String> {
     public GatewayGroupsRepository() {
         super(GatewayGroups.class, GatewayGroupsEntity.class);
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/GroupResourceProfileRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/GroupResourceProfileRepository.java
index b2521277f2..a2d014e01f 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/GroupResourceProfileRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/GroupResourceProfileRepository.java
@@ -18,6 +18,7 @@
 * under the License.
 */
 package org.apache.airavata.registry.core.repositories.appcatalog;
+import org.springframework.stereotype.Repository;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -46,6 +47,7 @@ import org.apache.airavata.registry.core.utils.QueryConstants;
 /**
  * Created by skariyat on 2/8/18.
  */
+@Repository
 public class GroupResourceProfileRepository
         extends AppCatAbstractRepository<GroupResourceProfile, GroupResourceProfileEntity, String> {
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/GrpComputePrefRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/GrpComputePrefRepository.java
index dcd7a29736..d57b73db0a 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/GrpComputePrefRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/GrpComputePrefRepository.java
@@ -18,6 +18,7 @@
 * under the License.
 */
 package org.apache.airavata.registry.core.repositories.appcatalog;
+import org.springframework.stereotype.Repository;
 
 import org.apache.airavata.model.appcatalog.groupresourceprofile.AwsComputeResourcePreference;
 import org.apache.airavata.model.appcatalog.groupresourceprofile.EnvironmentSpecificPreferences;
@@ -32,6 +33,7 @@ import org.apache.airavata.registry.core.entities.appcatalog.SlurmGroupComputeRe
 /**
  * Created by skariyat on 2/10/18.
  */
+@Repository
 public class GrpComputePrefRepository
         extends AppCatAbstractRepository<
                 GroupComputeResourcePreference, GroupComputeResourcePrefEntity, GroupComputeResourcePrefPK> {
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/GwyResourceProfileRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/GwyResourceProfileRepository.java
index b5aaf0b245..2f1ee0e5a7 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/GwyResourceProfileRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/GwyResourceProfileRepository.java
@@ -36,7 +36,9 @@ import org.apache.airavata.registry.cpi.AppCatalogException;
 import org.apache.airavata.registry.cpi.GwyResourceProfile;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class GwyResourceProfileRepository
         extends AppCatAbstractRepository<GatewayResourceProfile, GatewayProfileEntity, String>
         implements GwyResourceProfile {
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/JobSubmissionInterfaceRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/JobSubmissionInterfaceRepository.java
index f10bb006f9..8a7f268973 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/JobSubmissionInterfaceRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/JobSubmissionInterfaceRepository.java
@@ -18,6 +18,7 @@
 * under the License.
 */
 package org.apache.airavata.registry.core.repositories.appcatalog;
+import org.springframework.stereotype.Repository;
 
 import com.github.dozermapper.core.Mapper;
 import org.apache.airavata.model.appcatalog.computeresource.JobSubmissionInterface;
@@ -25,6 +26,7 @@ import org.apache.airavata.registry.core.entities.appcatalog.JobSubmissionInterf
 import org.apache.airavata.registry.core.entities.appcatalog.JobSubmissionInterfacePK;
 import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
 
+@Repository
 public class JobSubmissionInterfaceRepository
         extends AppCatAbstractRepository<
                 JobSubmissionInterface, JobSubmissionInterfaceEntity, JobSubmissionInterfacePK> {
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ParserInputRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ParserInputRepository.java
index 6c73093619..9ca3e0a3dc 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ParserInputRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ParserInputRepository.java
@@ -24,7 +24,9 @@ import org.apache.airavata.registry.core.entities.appcatalog.ParserInputEntity;
 import org.apache.airavata.registry.cpi.AppCatalogException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class ParserInputRepository extends AppCatAbstractRepository<ParserInput, ParserInputEntity, String> {
 
     private static final Logger logger = LoggerFactory.getLogger(ParserInputRepository.class);
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ParserOutputRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ParserOutputRepository.java
index 0ef087514f..418d370c43 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ParserOutputRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ParserOutputRepository.java
@@ -24,7 +24,9 @@ import org.apache.airavata.registry.core.entities.appcatalog.ParserOutputEntity;
 import org.apache.airavata.registry.cpi.AppCatalogException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class ParserOutputRepository extends AppCatAbstractRepository<ParserOutput, ParserOutputEntity, String> {
 
     private static final Logger logger = LoggerFactory.getLogger(ParserInputRepository.class);
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ParserRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ParserRepository.java
index 989e704203..5a31ff63f9 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ParserRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ParserRepository.java
@@ -31,7 +31,9 @@ import org.apache.airavata.registry.core.utils.QueryConstants;
 import org.apache.airavata.registry.cpi.AppCatalogException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class ParserRepository extends AppCatAbstractRepository<Parser, ParserEntity, String> {
 
     private static final Logger logger = LoggerFactory.getLogger(ParserRepository.class);
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ParsingTemplateRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ParsingTemplateRepository.java
index bfd2d38d3f..d9847bb9c9 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ParsingTemplateRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ParsingTemplateRepository.java
@@ -18,6 +18,7 @@
 * under the License.
 */
 package org.apache.airavata.registry.core.repositories.appcatalog;
+import org.springframework.stereotype.Repository;
 
 import java.util.HashMap;
 import java.util.List;
@@ -27,6 +28,7 @@ import org.apache.airavata.registry.core.entities.appcatalog.ParsingTemplateEnti
 import org.apache.airavata.registry.core.utils.DBConstants;
 import org.apache.airavata.registry.core.utils.QueryConstants;
 
+@Repository
 public class ParsingTemplateRepository
         extends AppCatAbstractRepository<ParsingTemplate, ParsingTemplateEntity, String> {
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ResourceJobManagerRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ResourceJobManagerRepository.java
index 70f9f7239c..a819c6debf 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ResourceJobManagerRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/ResourceJobManagerRepository.java
@@ -18,6 +18,7 @@
 * under the License.
 */
 package org.apache.airavata.registry.core.repositories.appcatalog;
+import org.springframework.stereotype.Repository;
 
 import jakarta.persistence.Query;
 import java.util.HashMap;
@@ -30,6 +31,7 @@ import org.apache.airavata.registry.core.entities.appcatalog.*;
 import org.apache.airavata.registry.core.utils.DBConstants;
 import org.apache.airavata.registry.core.utils.QueryConstants;
 
+@Repository
 public class ResourceJobManagerRepository
         extends AppCatAbstractRepository<ResourceJobManager, ResourceJobManagerEntity, String> {
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/StoragePrefRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/StoragePrefRepository.java
index b2c70bd1ff..18ed3e9c3f 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/StoragePrefRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/StoragePrefRepository.java
@@ -18,11 +18,13 @@
 * under the License.
 */
 package org.apache.airavata.registry.core.repositories.appcatalog;
+import org.springframework.stereotype.Repository;
 
 import org.apache.airavata.model.appcatalog.gatewayprofile.StoragePreference;
 import org.apache.airavata.registry.core.entities.appcatalog.StoragePreferenceEntity;
 import org.apache.airavata.registry.core.entities.appcatalog.StoragePreferencePK;
 
+@Repository
 public class StoragePrefRepository
         extends AppCatAbstractRepository<StoragePreference, StoragePreferenceEntity, StoragePreferencePK> {
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/StorageResourceRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/StorageResourceRepository.java
index 475e414226..12c44b6a5d 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/StorageResourceRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/StorageResourceRepository.java
@@ -37,10 +37,12 @@ import org.apache.airavata.registry.cpi.AppCatalogException;
 import org.apache.airavata.registry.cpi.StorageResource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
 /**
  * Created by skariyat on 3/12/18.
  */
+@Repository
 public class StorageResourceRepository
         extends AppCatAbstractRepository<StorageResourceDescription, StorageResourceEntity, String>
         implements StorageResource {
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/UserComputeResourcePreferenceRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/UserComputeResourcePreferenceRepository.java
index c7dabc76da..e2034053aa 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/UserComputeResourcePreferenceRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/UserComputeResourcePreferenceRepository.java
@@ -18,11 +18,13 @@
 * under the License.
 */
 package org.apache.airavata.registry.core.repositories.appcatalog;
+import org.springframework.stereotype.Repository;
 
 import org.apache.airavata.model.appcatalog.userresourceprofile.UserComputeResourcePreference;
 import org.apache.airavata.registry.core.entities.appcatalog.UserComputeResourcePreferenceEntity;
 import org.apache.airavata.registry.core.entities.appcatalog.UserComputeResourcePreferencePK;
 
+@Repository
 public class UserComputeResourcePreferenceRepository
         extends AppCatAbstractRepository<
                 UserComputeResourcePreference, UserComputeResourcePreferenceEntity, UserComputeResourcePreferencePK> {
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/UserResourceProfileRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/UserResourceProfileRepository.java
index 8091926915..d547709fa2 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/UserResourceProfileRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/UserResourceProfileRepository.java
@@ -36,7 +36,9 @@ import org.apache.airavata.registry.cpi.AppCatalogException;
 import org.apache.airavata.registry.cpi.UsrResourceProfile;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class UserResourceProfileRepository
         extends AppCatAbstractRepository<UserResourceProfile, UserResourceProfileEntity, UserResourceProfilePK>
         implements UsrResourceProfile {
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/UserStoragePreferenceRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/UserStoragePreferenceRepository.java
index 66060ad772..e5c76f3ec6 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/UserStoragePreferenceRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/appcatalog/UserStoragePreferenceRepository.java
@@ -18,11 +18,13 @@
 * under the License.
 */
 package org.apache.airavata.registry.core.repositories.appcatalog;
+import org.springframework.stereotype.Repository;
 
 import org.apache.airavata.model.appcatalog.userresourceprofile.UserStoragePreference;
 import org.apache.airavata.registry.core.entities.appcatalog.UserStoragePreferenceEntity;
 import org.apache.airavata.registry.core.entities.appcatalog.UserStoragePreferencePK;
 
+@Repository
 public class UserStoragePreferenceRepository
         extends AppCatAbstractRepository<UserStoragePreference, UserStoragePreferenceEntity, UserStoragePreferencePK> {
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExpCatAbstractRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExpCatAbstractRepository.java
index 52a6a313a3..a226f09fe6 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExpCatAbstractRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExpCatAbstractRepository.java
@@ -20,17 +20,23 @@
 package org.apache.airavata.registry.core.repositories.expcatalog;
 
 import jakarta.persistence.EntityManager;
+import jakarta.persistence.EntityManagerFactory;
 import org.apache.airavata.registry.core.repositories.AbstractRepository;
-import org.apache.airavata.registry.core.utils.JPAUtil.ExpCatalogJPAUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 
 public class ExpCatAbstractRepository<T, E, Id> extends AbstractRepository<T, E, Id> {
 
+    @Autowired
+    @Qualifier("expCatalogEntityManagerFactory")
+    private EntityManagerFactory entityManagerFactory;
+
     public ExpCatAbstractRepository(Class<T> thriftGenericClass, Class<E> dbEntityGenericClass) {
         super(thriftGenericClass, dbEntityGenericClass);
     }
 
     @Override
     protected EntityManager getEntityManager() {
-        return ExpCatalogJPAUtils.getEntityManager();
+        return entityManagerFactory.createEntityManager();
     }
 }
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentErrorRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentErrorRepository.java
index c0312b32ac..5a42fa0460 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentErrorRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentErrorRepository.java
@@ -30,7 +30,9 @@ import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
 import org.apache.airavata.registry.cpi.RegistryException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class ExperimentErrorRepository
         extends ExpCatAbstractRepository<ErrorModel, ExperimentErrorEntity, ExperimentErrorPK> {
     private static final Logger logger = LoggerFactory.getLogger(ExperimentErrorRepository.class);
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentInputRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentInputRepository.java
index 5db34cd846..2ed1bed9f4 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentInputRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentInputRepository.java
@@ -29,7 +29,9 @@ import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
 import org.apache.airavata.registry.cpi.RegistryException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class ExperimentInputRepository
         extends ExpCatAbstractRepository<InputDataObjectType, ExperimentInputEntity, ExperimentInputPK> {
     private static final Logger logger = LoggerFactory.getLogger(ExperimentInputRepository.class);
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentOutputRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentOutputRepository.java
index ceae29a034..7f15b03e25 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentOutputRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentOutputRepository.java
@@ -29,7 +29,9 @@ import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
 import org.apache.airavata.registry.cpi.RegistryException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class ExperimentOutputRepository
         extends ExpCatAbstractRepository<OutputDataObjectType, ExperimentOutputEntity, ExperimentOutputPK> {
     private static final Logger logger = LoggerFactory.getLogger(ExperimentOutputRepository.class);
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentRepository.java
index d3b8fd1a3a..975bd90a6f 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentRepository.java
@@ -37,7 +37,9 @@ import org.apache.airavata.registry.cpi.RegistryException;
 import org.apache.airavata.registry.cpi.ResultOrderType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class ExperimentRepository extends ExpCatAbstractRepository<ExperimentModel, ExperimentEntity, String> {
     private static final Logger logger = LoggerFactory.getLogger(ExperimentRepository.class);
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentStatusRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentStatusRepository.java
index 05398aa487..986aa3566d 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentStatusRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentStatusRepository.java
@@ -33,7 +33,9 @@ import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
 import org.apache.airavata.registry.cpi.RegistryException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class ExperimentStatusRepository
         extends ExpCatAbstractRepository<ExperimentStatus, ExperimentStatusEntity, ExperimentStatusPK> {
     private static final Logger logger = LoggerFactory.getLogger(ExperimentStatusRepository.class);
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentSummaryRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentSummaryRepository.java
index f89ef81e9d..bb168ec9fd 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentSummaryRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ExperimentSummaryRepository.java
@@ -37,7 +37,9 @@ import org.apache.airavata.registry.cpi.RegistryException;
 import org.apache.airavata.registry.cpi.ResultOrderType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class ExperimentSummaryRepository
         extends ExpCatAbstractRepository<ExperimentSummaryModel, ExperimentSummaryEntity, String> {
     private static final Logger logger = LoggerFactory.getLogger(ExperimentSummaryRepository.class);
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/GatewayRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/GatewayRepository.java
index 010b06a441..1e8b904b36 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/GatewayRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/GatewayRepository.java
@@ -34,7 +34,9 @@ import org.apache.airavata.registry.core.utils.QueryConstants;
 import org.apache.airavata.registry.cpi.RegistryException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class GatewayRepository extends ExpCatAbstractRepository<Gateway, GatewayEntity, String> {
     private static final Logger logger = LoggerFactory.getLogger(GatewayRepository.class);
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/GatewayUsageReportingCommandRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/GatewayUsageReportingCommandRepository.java
index ec38ed0640..6327131ead 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/GatewayUsageReportingCommandRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/GatewayUsageReportingCommandRepository.java
@@ -27,7 +27,9 @@ import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
 import org.apache.airavata.registry.cpi.RegistryException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class GatewayUsageReportingCommandRepository
         extends ExpCatAbstractRepository<
                 GatewayUsageReportingCommand, GatewayUsageReportingCommandEntity, GatewayUsageReportingPK> {
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/JobRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/JobRepository.java
index 913f9ad137..b4dd545c67 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/JobRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/JobRepository.java
@@ -36,7 +36,9 @@ import org.apache.airavata.registry.core.utils.QueryConstants;
 import org.apache.airavata.registry.cpi.RegistryException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class JobRepository extends ExpCatAbstractRepository<JobModel, JobEntity, JobPK> {
     private static final Logger logger = LoggerFactory.getLogger(JobRepository.class);
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/JobStatusRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/JobStatusRepository.java
index 61bc9310b3..b28f6f2506 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/JobStatusRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/JobStatusRepository.java
@@ -34,7 +34,9 @@ import org.apache.airavata.registry.core.utils.QueryConstants;
 import org.apache.airavata.registry.cpi.RegistryException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class JobStatusRepository extends ExpCatAbstractRepository<JobStatus, JobStatusEntity, JobStatusPK> {
     private static final Logger logger = LoggerFactory.getLogger(JobStatusRepository.class);
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/NotificationRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/NotificationRepository.java
index 93b066c33e..7204638c7b 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/NotificationRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/NotificationRepository.java
@@ -33,7 +33,9 @@ import org.apache.airavata.registry.core.utils.QueryConstants;
 import org.apache.airavata.registry.cpi.RegistryException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class NotificationRepository extends ExpCatAbstractRepository<Notification, NotificationEntity, String> {
     private static final Logger logger = LoggerFactory.getLogger(NotificationRepository.class);
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessErrorRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessErrorRepository.java
index 4b0998b096..9901419f64 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessErrorRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessErrorRepository.java
@@ -30,7 +30,9 @@ import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
 import org.apache.airavata.registry.cpi.RegistryException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class ProcessErrorRepository extends ExpCatAbstractRepository<ErrorModel, ProcessErrorEntity, ProcessErrorPK> {
     private static final Logger logger = LoggerFactory.getLogger(ProcessErrorRepository.class);
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessInputRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessInputRepository.java
index 6fae1e1602..7700b9adfc 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessInputRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessInputRepository.java
@@ -29,7 +29,9 @@ import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
 import org.apache.airavata.registry.cpi.RegistryException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class ProcessInputRepository
         extends ExpCatAbstractRepository<InputDataObjectType, ProcessInputEntity, ProcessInputPK> {
     private static final Logger logger = LoggerFactory.getLogger(ProcessInputRepository.class);
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessOutputRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessOutputRepository.java
index 1b3084415c..e81458fab9 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessOutputRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessOutputRepository.java
@@ -29,7 +29,9 @@ import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
 import org.apache.airavata.registry.cpi.RegistryException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class ProcessOutputRepository
         extends ExpCatAbstractRepository<OutputDataObjectType, ProcessOutputEntity, ProcessOutputPK> {
     private static final Logger logger = LoggerFactory.getLogger(ProcessOutputRepository.class);
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessRepository.java
index 72fdd2f081..078647ba54 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessRepository.java
@@ -39,14 +39,18 @@ import org.apache.airavata.registry.core.utils.QueryConstants;
 import org.apache.airavata.registry.cpi.RegistryException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class ProcessRepository extends ExpCatAbstractRepository<ProcessModel, ProcessEntity, String> {
     private static final Logger logger = LoggerFactory.getLogger(ProcessRepository.class);
 
-    private final TaskRepository taskRepository = new TaskRepository();
+    private final TaskRepository taskRepository;
 
-    public ProcessRepository() {
+    @org.springframework.beans.factory.annotation.Autowired
+    public ProcessRepository(TaskRepository taskRepository) {
         super(ProcessModel.class, ProcessEntity.class);
+        this.taskRepository = taskRepository;
     }
 
     protected String saveProcessModelData(ProcessModel processModel) throws RegistryException {
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessStatusRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessStatusRepository.java
index c0d8d078aa..0726430922 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessStatusRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessStatusRepository.java
@@ -36,7 +36,9 @@ import org.apache.airavata.registry.core.utils.QueryConstants;
 import org.apache.airavata.registry.cpi.RegistryException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class ProcessStatusRepository
         extends ExpCatAbstractRepository<ProcessStatus, ProcessStatusEntity, ProcessStatusPK> {
     private static final Logger logger = LoggerFactory.getLogger(ProcessStatusRepository.class);
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessWorkflowRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessWorkflowRepository.java
index 984fb417c9..9ec242bead 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessWorkflowRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProcessWorkflowRepository.java
@@ -30,7 +30,9 @@ import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
 import org.apache.airavata.registry.cpi.RegistryException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class ProcessWorkflowRepository
         extends ExpCatAbstractRepository<ProcessWorkflow, ProcessWorkflowEntity, ProcessWorkflowPK> {
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProjectRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProjectRepository.java
index ebb637c1d8..edf7f3979d 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProjectRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/ProjectRepository.java
@@ -34,7 +34,9 @@ import org.apache.airavata.registry.cpi.ResultOrderType;
 import org.apache.airavata.registry.cpi.utils.Constants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class ProjectRepository extends ExpCatAbstractRepository<Project, ProjectEntity, String> {
     private static final Logger logger = LoggerFactory.getLogger(ProjectRepository.class);
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/QueueStatusRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/QueueStatusRepository.java
index 9acfa41e31..d6a16cd2b4 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/QueueStatusRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/QueueStatusRepository.java
@@ -32,7 +32,9 @@ import org.apache.airavata.registry.core.utils.QueryConstants;
 import org.apache.airavata.registry.cpi.RegistryException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class QueueStatusRepository extends ExpCatAbstractRepository<QueueStatusModel, QueueStatusEntity, String> {
     private static final Logger logger = LoggerFactory.getLogger(QueueStatusRepository.class);
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/TaskErrorRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/TaskErrorRepository.java
index a08840021b..e7fa79ba6b 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/TaskErrorRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/TaskErrorRepository.java
@@ -30,7 +30,9 @@ import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
 import org.apache.airavata.registry.cpi.RegistryException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class TaskErrorRepository extends ExpCatAbstractRepository<ErrorModel, TaskErrorEntity, TaskErrorPK> {
     private static final Logger logger = LoggerFactory.getLogger(TaskErrorRepository.class);
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/TaskRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/TaskRepository.java
index 1a3f9af601..83196045dc 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/TaskRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/TaskRepository.java
@@ -35,14 +35,18 @@ import org.apache.airavata.registry.core.utils.QueryConstants;
 import org.apache.airavata.registry.cpi.RegistryException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class TaskRepository extends ExpCatAbstractRepository<TaskModel, TaskEntity, String> {
     private static final Logger logger = LoggerFactory.getLogger(TaskRepository.class);
 
-    private final JobRepository jobRepository = new JobRepository();
+    private final JobRepository jobRepository;
 
-    public TaskRepository() {
+    @org.springframework.beans.factory.annotation.Autowired
+    public TaskRepository(JobRepository jobRepository) {
         super(TaskModel.class, TaskEntity.class);
+        this.jobRepository = jobRepository;
     }
 
     protected String saveTaskModelData(TaskModel taskModel) throws RegistryException {
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/TaskStatusRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/TaskStatusRepository.java
index 1435416551..56e7510bdd 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/TaskStatusRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/TaskStatusRepository.java
@@ -32,7 +32,9 @@ import org.apache.airavata.registry.core.utils.ObjectMapperSingleton;
 import org.apache.airavata.registry.cpi.RegistryException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class TaskStatusRepository extends ExpCatAbstractRepository<TaskStatus, TaskStatusEntity, TaskStatusPK> {
     private static final Logger logger = LoggerFactory.getLogger(TaskStatusRepository.class);
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/UserRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/UserRepository.java
index 66887a05c9..6604b604c2 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/UserRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/expcatalog/UserRepository.java
@@ -18,6 +18,7 @@
 * under the License.
 */
 package org.apache.airavata.registry.core.repositories.expcatalog;
+import org.springframework.stereotype.Repository;
 
 import java.util.Collections;
 import java.util.List;
@@ -29,6 +30,7 @@ import org.apache.airavata.registry.core.utils.DBConstants;
 import org.apache.airavata.registry.core.utils.QueryConstants;
 import org.apache.airavata.registry.cpi.RegistryException;
 
+@Repository
 public class UserRepository extends ExpCatAbstractRepository<UserProfile, UserEntity, UserPK> {
     public UserRepository() {
         super(UserProfile.class, UserEntity.class);
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/replicacatalog/DataProductRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/replicacatalog/DataProductRepository.java
index c9fc69d68a..5a04bff25b 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/replicacatalog/DataProductRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/replicacatalog/DataProductRepository.java
@@ -33,17 +33,22 @@ import org.apache.airavata.registry.cpi.DataProductInterface;
 import org.apache.airavata.registry.cpi.ReplicaCatalogException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class DataProductRepository extends RepCatAbstractRepository<DataProductModel, DataProductEntity, String>
         implements DataProductInterface {
     private static final Logger logger = LoggerFactory.getLogger(DataProductRepository.class);
-    private static final DataReplicaLocationRepository dataReplicaLocationRepository =
-            new DataReplicaLocationRepository();
-
-    public DataProductRepository() {
+    
+    private final DataReplicaLocationRepository dataReplicaLocationRepository;
+    
+    @org.springframework.beans.factory.annotation.Autowired
+    public DataProductRepository(DataReplicaLocationRepository dataReplicaLocationRepository) {
         super(DataProductModel.class, DataProductEntity.class);
+        this.dataReplicaLocationRepository = dataReplicaLocationRepository;
     }
 
+
     protected String saveDataProductModelData(DataProductModel dataProductModel) throws ReplicaCatalogException {
         DataProductEntity dataProductEntity = saveDataProduct(dataProductModel);
         return dataProductEntity.getProductUri();
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/replicacatalog/DataReplicaLocationRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/replicacatalog/DataReplicaLocationRepository.java
index df0ad7693e..790e762dd5 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/replicacatalog/DataReplicaLocationRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/replicacatalog/DataReplicaLocationRepository.java
@@ -31,7 +31,9 @@ import org.apache.airavata.registry.cpi.DataReplicaLocationInterface;
 import org.apache.airavata.registry.cpi.ReplicaCatalogException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class DataReplicaLocationRepository
         extends RepCatAbstractRepository<DataReplicaLocationModel, DataReplicaLocationEntity, String>
         implements DataReplicaLocationInterface {
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/replicacatalog/RepCatAbstractRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/replicacatalog/RepCatAbstractRepository.java
index 1572045ae4..45bc254878 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/replicacatalog/RepCatAbstractRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/replicacatalog/RepCatAbstractRepository.java
@@ -20,17 +20,23 @@
 package org.apache.airavata.registry.core.repositories.replicacatalog;
 
 import jakarta.persistence.EntityManager;
+import jakarta.persistence.EntityManagerFactory;
 import org.apache.airavata.registry.core.repositories.AbstractRepository;
-import org.apache.airavata.registry.core.utils.JPAUtil.RepCatalogJPAUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 
 public class RepCatAbstractRepository<T, E, Id> extends AbstractRepository<T, E, Id> {
 
+    @Autowired
+    @Qualifier("replicaCatalogEntityManagerFactory")
+    private EntityManagerFactory entityManagerFactory;
+
     public RepCatAbstractRepository(Class<T> thriftGenericClass, Class<E> dbEntityGenericClass) {
         super(thriftGenericClass, dbEntityGenericClass);
     }
 
     @Override
     protected EntityManager getEntityManager() {
-        return RepCatalogJPAUtils.getEntityManager();
+        return entityManagerFactory.createEntityManager();
     }
 }
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/workflowcatalog/WorkflowCatAbstractRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/workflowcatalog/WorkflowCatAbstractRepository.java
index 83b9b7a133..ff48749759 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/workflowcatalog/WorkflowCatAbstractRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/workflowcatalog/WorkflowCatAbstractRepository.java
@@ -20,17 +20,23 @@
 package org.apache.airavata.registry.core.repositories.workflowcatalog;
 
 import jakarta.persistence.EntityManager;
+import jakarta.persistence.EntityManagerFactory;
 import org.apache.airavata.registry.core.repositories.AbstractRepository;
-import org.apache.airavata.registry.core.utils.JPAUtil.WorkflowCatalogJPAUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 
 public class WorkflowCatAbstractRepository<T, E, Id> extends AbstractRepository<T, E, Id> {
 
+    @Autowired
+    @Qualifier("workflowCatalogEntityManagerFactory")
+    private EntityManagerFactory entityManagerFactory;
+
     public WorkflowCatAbstractRepository(Class<T> thriftGenericClass, Class<E> dbEntityGenericClass) {
         super(thriftGenericClass, dbEntityGenericClass);
     }
 
     @Override
     protected EntityManager getEntityManager() {
-        return WorkflowCatalogJPAUtils.getEntityManager();
+        return entityManagerFactory.createEntityManager();
     }
 }
diff --git a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/workflowcatalog/WorkflowRepository.java b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/workflowcatalog/WorkflowRepository.java
index 70ca71e890..5bbb878a11 100644
--- a/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/workflowcatalog/WorkflowRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/registry/core/repositories/workflowcatalog/WorkflowRepository.java
@@ -32,7 +32,9 @@ import org.apache.airavata.registry.cpi.WorkflowCatalog;
 import org.apache.airavata.registry.cpi.WorkflowCatalogException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class WorkflowRepository extends WorkflowCatAbstractRepository<AiravataWorkflow, AiravataWorkflowEntity, String>
         implements WorkflowCatalog {
     private static final Logger logger = LoggerFactory.getLogger(WorkflowRepository.class);
diff --git a/airavata-api/src/main/java/org/apache/airavata/service/AiravataService.java b/airavata-api/src/main/java/org/apache/airavata/service/AiravataService.java
index e25e4b4ae5..cfef4a57c2 100644
--- a/airavata-api/src/main/java/org/apache/airavata/service/AiravataService.java
+++ b/airavata-api/src/main/java/org/apache/airavata/service/AiravataService.java
@@ -135,7 +135,9 @@ import org.apache.airavata.sharing.models.User;
 import org.apache.airavata.sharing.models.UserGroup;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
 
+@Service
 public class AiravataService {
     private static final Logger logger = LoggerFactory.getLogger(AiravataService.class);
 
@@ -172,31 +174,22 @@ public class AiravataService {
         return profile != null;
     }
 
-    private RegistryService registryService;
-    private SharingRegistryService sharingRegistryService;
-    private CredentialStoreService credentialStoreService;
+    private final RegistryService registryService;
+    private final SharingRegistryService sharingRegistryService;
+    private final CredentialStoreService credentialStoreService;
     private Publisher statusPublisher;
     private Publisher experimentPublisher;
 
-    public AiravataService() throws AiravataException, ServiceFactoryException {
-        ServiceFactory factory;
-        try {
-            factory = ServiceFactory.getInstance();
-        } catch (ServiceFactoryException e) {
-            String msg = "Error initializing AiravataService: failed to get ServiceFactory. Reason: " + e.getMessage();
-            logger.error(msg, e);
-            AiravataException exception = new AiravataException(msg);
-            exception.initCause(e);
-            throw exception;
-        }
-
-        registryService = factory.getRegistryService();
+    public AiravataService(
+            RegistryService registryService,
+            SharingRegistryService sharingRegistryService,
+            CredentialStoreService credentialStoreService) throws AiravataException {
+        this.registryService = registryService;
+        this.sharingRegistryService = sharingRegistryService;
+        this.credentialStoreService = credentialStoreService;
+        
         logger.info("Initialized RegistryService");
-
-        sharingRegistryService = factory.getSharingRegistryService();
         logger.info("Initialized SharingRegistryService");
-
-        credentialStoreService = factory.getCredentialStoreService();
         logger.info("Initialized CredentialStoreService");
 
         try {
diff --git a/airavata-api/src/main/java/org/apache/airavata/service/CredentialStoreService.java b/airavata-api/src/main/java/org/apache/airavata/service/CredentialStoreService.java
index 4d513f49e2..04a4cb9381 100644
--- a/airavata-api/src/main/java/org/apache/airavata/service/CredentialStoreService.java
+++ b/airavata-api/src/main/java/org/apache/airavata/service/CredentialStoreService.java
@@ -43,7 +43,9 @@ import org.apache.airavata.model.credential.store.*;
 import org.apache.commons.codec.binary.Base64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
 
+@Service
 public class CredentialStoreService {
     private static final Logger logger = LoggerFactory.getLogger(CredentialStoreService.class);
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/service/GroupManagerService.java b/airavata-api/src/main/java/org/apache/airavata/service/GroupManagerService.java
index 0e9ce73053..954de1f688 100644
--- a/airavata-api/src/main/java/org/apache/airavata/service/GroupManagerService.java
+++ b/airavata-api/src/main/java/org/apache/airavata/service/GroupManagerService.java
@@ -38,21 +38,23 @@ import org.apache.airavata.sharing.models.User;
 import org.apache.airavata.sharing.models.UserGroup;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
 
+@Service
 public class GroupManagerService {
     private static final Logger logger = LoggerFactory.getLogger(GroupManagerService.class);
-    private UserProfileRepository userProfileRepository = new UserProfileRepository();
+    @Autowired
+    private UserProfileRepository userProfileRepository;
+    @Autowired
     private SharingRegistryService sharingService;
 
-    private SharingRegistryService getSharingService() throws ServiceFactoryException {
-        if (sharingService == null) {
-            sharingService = ServiceFactory.getInstance().getSharingRegistryService();
-        }
+    private SharingRegistryService getSharingService() {
         return sharingService;
     }
 
     public String createGroup(AuthzToken authzToken, GroupModel groupModel)
-            throws GroupManagerServiceException, SharingRegistryException, ServiceFactoryException {
+            throws GroupManagerServiceException, SharingRegistryException {
         // TODO Validations for authorization
         var sharingUserGroup = new UserGroup();
         sharingUserGroup.setGroupId(UUID.randomUUID().toString());
@@ -78,7 +80,7 @@ public class GroupManagerService {
 
     public boolean updateGroup(AuthzToken authzToken, GroupModel groupModel)
             throws GroupManagerServiceException, SharingRegistryException, AuthorizationException,
-                    ServiceFactoryException {
+                    {
         var userId = getUserId(authzToken);
         var domainId = getDomainId(authzToken);
         if (!(getSharingService().hasOwnerAccess(domainId, groupModel.getId(), userId)
@@ -100,7 +102,7 @@ public class GroupManagerService {
 
     public boolean deleteGroup(AuthzToken authzToken, String groupId, String ownerId)
             throws GroupManagerServiceException, SharingRegistryException, AuthorizationException,
-                    ServiceFactoryException {
+                    {
         String userId = getUserId(authzToken);
         String domainId = getDomainId(authzToken);
         if (!(getSharingService().hasOwnerAccess(domainId, groupId, userId))) {
@@ -112,7 +114,7 @@ public class GroupManagerService {
     }
 
     public GroupModel getGroup(AuthzToken authzToken, String groupId)
-            throws GroupManagerServiceException, SharingRegistryException, ServiceFactoryException {
+            throws GroupManagerServiceException, SharingRegistryException {
         final String domainId = getDomainId(authzToken);
         UserGroup userGroup = getSharingService().getGroup(domainId, groupId);
         GroupModel groupModel = convertToGroupModel(userGroup, getSharingService());
@@ -120,14 +122,14 @@ public class GroupManagerService {
     }
 
     public List<GroupModel> getGroups(AuthzToken authzToken)
-            throws GroupManagerServiceException, SharingRegistryException, ServiceFactoryException {
+            throws GroupManagerServiceException, SharingRegistryException {
         final String domainId = getDomainId(authzToken);
         List<UserGroup> userGroups = getSharingService().getGroups(domainId, 0, -1);
         return convertToGroupModels(userGroups, getSharingService());
     }
 
     public List<GroupModel> getAllGroupsUserBelongs(AuthzToken authzToken, String userName)
-            throws GroupManagerServiceException, SharingRegistryException, ServiceFactoryException {
+            throws GroupManagerServiceException, SharingRegistryException {
         final String domainId = getDomainId(authzToken);
         List<UserGroup> userGroups = getSharingService().getAllMemberGroupsForUser(domainId, userName);
         return convertToGroupModels(userGroups, getSharingService());
@@ -135,7 +137,7 @@ public class GroupManagerService {
 
     public boolean addUsersToGroup(AuthzToken authzToken, List<String> userIds, String groupId)
             throws GroupManagerServiceException, SharingRegistryException, AuthorizationException,
-                    ServiceFactoryException {
+                    {
         String userId = getUserId(authzToken);
         String domainId = getDomainId(authzToken);
         if (!(getSharingService().hasOwnerAccess(domainId, groupId, userId)
@@ -147,7 +149,7 @@ public class GroupManagerService {
 
     public boolean removeUsersFromGroup(AuthzToken authzToken, List<String> userIds, String groupId)
             throws GroupManagerServiceException, SharingRegistryException, AuthorizationException,
-                    ServiceFactoryException {
+                    {
         String userId = getUserId(authzToken);
         String domainId = getDomainId(authzToken);
         if (!(getSharingService().hasOwnerAccess(domainId, groupId, userId)
@@ -159,7 +161,7 @@ public class GroupManagerService {
 
     public boolean transferGroupOwnership(AuthzToken authzToken, String groupId, String newOwnerId)
             throws GroupManagerServiceException, SharingRegistryException, AuthorizationException,
-                    ServiceFactoryException {
+                    {
         String userId = getUserId(authzToken);
         String domainId = getDomainId(authzToken);
         if (!(getSharingService().hasOwnerAccess(domainId, groupId, userId))) {
@@ -177,7 +179,7 @@ public class GroupManagerService {
 
     public boolean addGroupAdmins(AuthzToken authzToken, String groupId, List<String> adminIds)
             throws GroupManagerServiceException, SharingRegistryException, AuthorizationException,
-                    ServiceFactoryException {
+                    {
         String userId = getUserId(authzToken);
         String domainId = getDomainId(authzToken);
         if (!(getSharingService().hasOwnerAccess(domainId, groupId, userId))) {
@@ -195,7 +197,7 @@ public class GroupManagerService {
 
     public boolean removeGroupAdmins(AuthzToken authzToken, String groupId, List<String> adminIds)
             throws GroupManagerServiceException, SharingRegistryException, AuthorizationException,
-                    ServiceFactoryException {
+                    {
         String userId = getUserId(authzToken);
         String domainId = getDomainId(authzToken);
         if (!(getSharingService().hasOwnerAccess(domainId, groupId, userId))) {
@@ -205,12 +207,12 @@ public class GroupManagerService {
     }
 
     public boolean hasAdminAccess(AuthzToken authzToken, String groupId, String adminId)
-            throws GroupManagerServiceException, SharingRegistryException, ServiceFactoryException {
+            throws GroupManagerServiceException, SharingRegistryException {
         return getSharingService().hasAdminAccess(getDomainId(authzToken), groupId, adminId);
     }
 
     public boolean hasOwnerAccess(AuthzToken authzToken, String groupId, String ownerId)
-            throws GroupManagerServiceException, SharingRegistryException, ServiceFactoryException {
+            throws GroupManagerServiceException, SharingRegistryException {
         return getSharingService().hasOwnerAccess(getDomainId(authzToken), groupId, ownerId);
     }
 
@@ -223,7 +225,7 @@ public class GroupManagerService {
     }
 
     private List<GroupModel> convertToGroupModels(List<UserGroup> userGroups, SharingRegistryService sharingService)
-            throws SharingRegistryException, ServiceFactoryException {
+            throws SharingRegistryException {
 
         List<GroupModel> groupModels = new ArrayList<>();
 
@@ -236,7 +238,7 @@ public class GroupManagerService {
     }
 
     private GroupModel convertToGroupModel(UserGroup userGroup, SharingRegistryService sharingService)
-            throws SharingRegistryException, ServiceFactoryException {
+            throws SharingRegistryException {
         GroupModel groupModel = new GroupModel();
         groupModel.setId(userGroup.getGroupId());
         groupModel.setName(userGroup.getName());
@@ -254,7 +256,7 @@ public class GroupManagerService {
 
     private boolean internalAddUsersToGroup(
             SharingRegistryService sharingService, String domainId, List<String> userIds, String groupId)
-            throws SharingRegistryException, ServiceFactoryException {
+            throws SharingRegistryException {
 
         // FIXME: workaround for UserProfiles that failed to sync to the sharing
         // registry: create any missing users in the sharing registry
diff --git a/airavata-api/src/main/java/org/apache/airavata/service/IamAdminService.java b/airavata-api/src/main/java/org/apache/airavata/service/IamAdminService.java
index d561230e0c..d2762bfa81 100644
--- a/airavata-api/src/main/java/org/apache/airavata/service/IamAdminService.java
+++ b/airavata-api/src/main/java/org/apache/airavata/service/IamAdminService.java
@@ -41,34 +41,23 @@ import org.apache.airavata.profile.user.core.repositories.UserProfileRepository;
 import org.apache.airavata.registry.api.exception.RegistryServiceException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
 
+@Service
 public class IamAdminService {
     private static final Logger logger = LoggerFactory.getLogger(IamAdminService.class);
-    private UserProfileRepository userProfileRepository = new UserProfileRepository();
+    @Autowired
+    private UserProfileRepository userProfileRepository;
     private DBEventPublisherUtils dbEventPublisherUtils = new DBEventPublisherUtils(DBEventService.IAM_ADMIN);
+    @Autowired
     private final CredentialStoreService credentialStoreService;
+    @Autowired
     private final RegistryService registryService;
 
-    public IamAdminService() throws ApplicationSettingsException, IamAdminServicesException, ServiceFactoryException {
-        try {
-            credentialStoreService = ServiceFactory.getInstance().getCredentialStoreService();
-        } catch (ServiceFactoryException e) {
-            String msg = String.format("Unable to create credential store service: %s", e.getMessage());
-            logger.error(msg, e);
-            IamAdminServicesException exception = new IamAdminServicesException(msg);
-            exception.initCause(e);
-            throw exception;
-        }
-
-        try {
-            registryService = ServiceFactory.getInstance().getRegistryService();
-        } catch (ServiceFactoryException e) {
-            String msg = String.format("Unable to create registry service. Reason: %s", e.getMessage());
-            logger.error(msg, e);
-            IamAdminServicesException exception = new IamAdminServicesException(msg);
-            exception.initCause(e);
-            throw exception;
-        }
+    public IamAdminService(CredentialStoreService credentialStoreService, RegistryService registryService) {
+        this.credentialStoreService = credentialStoreService;
+        this.registryService = registryService;
     }
 
     public Gateway setUpGateway(AuthzToken authzToken, Gateway gateway)
diff --git a/airavata-api/src/main/java/org/apache/airavata/service/OrchestratorRegistryService.java b/airavata-api/src/main/java/org/apache/airavata/service/OrchestratorRegistryService.java
index 5a3aa6ce28..a2cba85de4 100644
--- a/airavata-api/src/main/java/org/apache/airavata/service/OrchestratorRegistryService.java
+++ b/airavata-api/src/main/java/org/apache/airavata/service/OrchestratorRegistryService.java
@@ -35,18 +35,16 @@ import org.apache.airavata.model.status.ProcessStatus;
 import org.apache.airavata.model.status.QueueStatusModel;
 import org.apache.airavata.registry.api.exception.RegistryServiceException;
 
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
 public class OrchestratorRegistryService {
 
+    @Autowired
     private RegistryService registryService;
 
     private RegistryService getRegistryService() {
-        if (registryService == null) {
-            try {
-                registryService = ServiceFactory.getInstance().getRegistryService();
-            } catch (ServiceFactoryException e) {
-                throw new IllegalStateException("Failed to get RegistryService from ServiceFactory", e);
-            }
-        }
         return registryService;
     }
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/service/OrchestratorService.java b/airavata-api/src/main/java/org/apache/airavata/service/OrchestratorService.java
index 2312204fed..918d25139c 100644
--- a/airavata-api/src/main/java/org/apache/airavata/service/OrchestratorService.java
+++ b/airavata-api/src/main/java/org/apache/airavata/service/OrchestratorService.java
@@ -83,10 +83,14 @@ import org.apache.zookeeper.data.Stat;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.MDC;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
 
+@Service
 public class OrchestratorService {
     private static final Logger logger = LoggerFactory.getLogger(OrchestratorService.class);
 
+    @Autowired
     private OrchestratorRegistryService orchestratorRegistryService;
     private SimpleOrchestratorImpl orchestrator;
     private CuratorFramework curatorClient;
@@ -97,7 +101,6 @@ public class OrchestratorService {
 
     public OrchestratorService() throws OrchestratorException {
         try {
-            this.orchestratorRegistryService = new OrchestratorRegistryService();
             // setAiravataUserName(ServerSettings.getDefaultUser());
             this.orchestrator = new SimpleOrchestratorImpl();
             this.publisher = MessagingFactory.getPublisher(Type.STATUS);
diff --git a/airavata-api/src/main/java/org/apache/airavata/service/RegistryService.java b/airavata-api/src/main/java/org/apache/airavata/service/RegistryService.java
index 5c13463aae..45b6a3d535 100644
--- a/airavata-api/src/main/java/org/apache/airavata/service/RegistryService.java
+++ b/airavata-api/src/main/java/org/apache/airavata/service/RegistryService.java
@@ -78,45 +78,81 @@ import org.apache.airavata.registry.cpi.WorkflowCatalogException;
 import org.apache.airavata.registry.cpi.utils.Constants;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
 
+@Service
 public class RegistryService {
     private static final Logger logger = LoggerFactory.getLogger(RegistryService.class);
 
-    private ApplicationDeploymentRepository applicationDeploymentRepository = new ApplicationDeploymentRepository();
-    private ApplicationInterfaceRepository applicationInterfaceRepository = new ApplicationInterfaceRepository();
-    private StorageResourceRepository storageResourceRepository = new StorageResourceRepository();
-    private UserResourceProfileRepository userResourceProfileRepository = new UserResourceProfileRepository();
-    private GatewayRepository gatewayRepository = new GatewayRepository();
-    private ProjectRepository projectRepository = new ProjectRepository();
-    private NotificationRepository notificationRepository = new NotificationRepository();
-    private ExperimentSummaryRepository experimentSummaryRepository = new ExperimentSummaryRepository();
-    private ExperimentRepository experimentRepository = new ExperimentRepository();
-    private ExperimentOutputRepository experimentOutputRepository = new ExperimentOutputRepository();
-    private ExperimentStatusRepository experimentStatusRepository = new ExperimentStatusRepository();
-    private ExperimentErrorRepository experimentErrorRepository = new ExperimentErrorRepository();
-    private ProcessRepository processRepository = new ProcessRepository();
-    private ProcessOutputRepository processOutputRepository = new ProcessOutputRepository();
-    private ProcessWorkflowRepository processWorkflowRepository = new ProcessWorkflowRepository();
-    private ProcessStatusRepository processStatusRepository = new ProcessStatusRepository();
-    private ProcessErrorRepository processErrorRepository = new ProcessErrorRepository();
-    private TaskRepository taskRepository = new TaskRepository();
-    private TaskStatusRepository taskStatusRepository = new TaskStatusRepository();
-    private TaskErrorRepository taskErrorRepository = new TaskErrorRepository();
-    private JobRepository jobRepository = new JobRepository();
-    private JobStatusRepository jobStatusRepository = new JobStatusRepository();
-    private QueueStatusRepository queueStatusRepository = new QueueStatusRepository();
-    private DataProductRepository dataProductRepository = new DataProductRepository();
-    private DataReplicaLocationRepository dataReplicaLocationRepository = new DataReplicaLocationRepository();
-    private WorkflowRepository workflowRepository = new WorkflowRepository();
-    private GatewayGroupsRepository gatewayGroupsRepository = new GatewayGroupsRepository();
-    private ParserRepository parserRepository = new ParserRepository();
-    private ParserInputRepository parserInputRepository = new ParserInputRepository();
-    private ParserOutputRepository parserOutputRepository = new ParserOutputRepository();
-    private ParsingTemplateRepository parsingTemplateRepository = new ParsingTemplateRepository();
-    private UserRepository userRepository = new UserRepository();
-    private ComputeResourceRepository computeResourceRepository = new ComputeResourceRepository();
-    private GatewayUsageReportingCommandRepository usageReportingCommandRepository =
-            new GatewayUsageReportingCommandRepository();
+    @Autowired
+    private ApplicationDeploymentRepository applicationDeploymentRepository;
+    @Autowired
+    private ApplicationInterfaceRepository applicationInterfaceRepository;
+    @Autowired
+    private StorageResourceRepository storageResourceRepository;
+    @Autowired
+    private UserResourceProfileRepository userResourceProfileRepository;
+    @Autowired
+    private GatewayRepository gatewayRepository;
+    @Autowired
+    private ProjectRepository projectRepository;
+    @Autowired
+    private NotificationRepository notificationRepository;
+    @Autowired
+    private ExperimentSummaryRepository experimentSummaryRepository;
+    @Autowired
+    private ExperimentRepository experimentRepository;
+    @Autowired
+    private ExperimentOutputRepository experimentOutputRepository;
+    @Autowired
+    private ExperimentStatusRepository experimentStatusRepository;
+    @Autowired
+    private ExperimentErrorRepository experimentErrorRepository;
+    @Autowired
+    private ProcessRepository processRepository;
+    @Autowired
+    private ProcessOutputRepository processOutputRepository;
+    @Autowired
+    private ProcessWorkflowRepository processWorkflowRepository;
+    @Autowired
+    private ProcessStatusRepository processStatusRepository;
+    @Autowired
+    private ProcessErrorRepository processErrorRepository;
+    @Autowired
+    private TaskRepository taskRepository;
+    @Autowired
+    private TaskStatusRepository taskStatusRepository;
+    @Autowired
+    private TaskErrorRepository taskErrorRepository;
+    @Autowired
+    private JobRepository jobRepository;
+    @Autowired
+    private JobStatusRepository jobStatusRepository;
+    @Autowired
+    private QueueStatusRepository queueStatusRepository;
+    @Autowired
+    private DataProductRepository dataProductRepository;
+    @Autowired
+    private DataReplicaLocationRepository dataReplicaLocationRepository;
+    @Autowired
+    private WorkflowRepository workflowRepository;
+    @Autowired
+    private GatewayGroupsRepository gatewayGroupsRepository;
+    @Autowired
+    private ParserRepository parserRepository;
+    @Autowired
+    private ParserInputRepository parserInputRepository;
+    @Autowired
+    private ParserOutputRepository parserOutputRepository;
+    @Autowired
+    private ParsingTemplateRepository parsingTemplateRepository;
+    @Autowired
+    private UserRepository userRepository;
+    @Autowired
+    private ComputeResourceRepository computeResourceRepository;
+    @Autowired
+    private GatewayUsageReportingCommandRepository usageReportingCommandRepository;
 
     public String getAPIVersion() {
         return org.apache.airavata.registry.api.registry_apiConstants.REGISTRY_API_VERSION;
diff --git a/airavata-api/src/main/java/org/apache/airavata/service/SharingRegistryService.java b/airavata-api/src/main/java/org/apache/airavata/service/SharingRegistryService.java
index 26effdc1b2..9ea2240ef5 100644
--- a/airavata-api/src/main/java/org/apache/airavata/service/SharingRegistryService.java
+++ b/airavata-api/src/main/java/org/apache/airavata/service/SharingRegistryService.java
@@ -28,7 +28,9 @@ import org.apache.airavata.sharing.db.utils.DBConstants;
 import org.apache.airavata.sharing.models.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
 
+@Service
 public class SharingRegistryService {
     private static final Logger logger = LoggerFactory.getLogger(SharingRegistryService.class);
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/service/TenantProfileService.java b/airavata-api/src/main/java/org/apache/airavata/service/TenantProfileService.java
index d0679cbe7d..8e119e9e4f 100644
--- a/airavata-api/src/main/java/org/apache/airavata/service/TenantProfileService.java
+++ b/airavata-api/src/main/java/org/apache/airavata/service/TenantProfileService.java
@@ -39,26 +39,21 @@ import org.apache.airavata.profile.tenant.core.repositories.TenantProfileReposit
 import org.apache.airavata.profile.tenant.cpi.exception.TenantProfileServiceException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
 
+@Service
 public class TenantProfileService {
     private static final Logger logger = LoggerFactory.getLogger(TenantProfileService.class);
 
+    @Autowired
     private TenantProfileRepository tenantProfileRepository;
     private DBEventPublisherUtils dbEventPublisherUtils = new DBEventPublisherUtils(DBEventService.TENANT);
+    @Autowired
     private CredentialStoreService credentialStoreService;
 
-    public TenantProfileService() throws TenantProfileServiceException {
+    public TenantProfileService() {
         logger.debug("Initializing TenantProfileService");
-        this.tenantProfileRepository = new TenantProfileRepository(Gateway.class, GatewayEntity.class);
-        try {
-            this.credentialStoreService = ServiceFactory.getInstance().getCredentialStoreService();
-        } catch (ServiceFactoryException e) {
-            String msg = "Error initializing TenantProfileService, reason: " + e.getMessage();
-            logger.error(msg, e);
-            var exception = new TenantProfileServiceException(msg);
-            exception.initCause(e);
-            throw exception;
-        }
     }
 
     public String addGateway(AuthzToken authzToken, Gateway gateway)
diff --git a/airavata-api/src/main/java/org/apache/airavata/service/UserProfileService.java b/airavata-api/src/main/java/org/apache/airavata/service/UserProfileService.java
index a9ab769f3d..82f603093c 100644
--- a/airavata-api/src/main/java/org/apache/airavata/service/UserProfileService.java
+++ b/airavata-api/src/main/java/org/apache/airavata/service/UserProfileService.java
@@ -39,15 +39,22 @@ import org.apache.airavata.security.SecurityManagerFactory;
 import org.apache.airavata.security.UserInfo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
 
+@Service
 public class UserProfileService {
     private static final Logger logger = LoggerFactory.getLogger(UserProfileService.class);
 
+    @Autowired
     private UserProfileRepository userProfileRepository;
+    
+    @Autowired
+    private IamAdminService iamAdminService;
+    
     private DBEventPublisherUtils dbEventPublisherUtils = new DBEventPublisherUtils(DBEventService.USER_PROFILE);
 
     public UserProfileService() {
-        userProfileRepository = new UserProfileRepository();
     }
 
     public String initializeUserProfile(AuthzToken authzToken) throws UserProfileServiceException {
@@ -293,17 +300,13 @@ public class UserProfileService {
         }
     }
 
-    private IamAdminService getIamAdminService() throws UserProfileServiceException, ServiceFactoryException {
-        try {
-            return ServiceFactory.getInstance().getIamAdminService();
-        } catch (ServiceFactoryException e) {
-            logger.error("Failed to create IAM Admin Service", e);
-            UserProfileServiceException ex = new UserProfileServiceException("Failed to create IAM Admin Service");
-            ex.initCause(e);
-            throw ex;
-        } catch (RuntimeException e) {
-            String message = "Failed to create IAM Admin Service: " + e.getMessage();
-            logger.error(message, e);
+    private IamAdminService getIamAdminService() throws UserProfileServiceException {
+        if (iamAdminService == null) {
+            String message = "IAM Admin Service not available";
+            logger.error(message);
+            throw new UserProfileServiceException(message);
+        }
+        return iamAdminService;
             UserProfileServiceException ex = new UserProfileServiceException();
             ex.setMessage(message);
             ex.initCause(e);
diff --git a/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/DomainRepository.java b/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/DomainRepository.java
index ef5c863d85..23f3e62ad0 100644
--- a/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/DomainRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/DomainRepository.java
@@ -23,7 +23,9 @@ import org.apache.airavata.sharing.db.entities.DomainEntity;
 import org.apache.airavata.sharing.models.Domain;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class DomainRepository extends AbstractRepository<Domain, DomainEntity, String> {
     private static final Logger logger = LoggerFactory.getLogger(DomainRepository.class);
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/EntityRepository.java b/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/EntityRepository.java
index 65554f4e6d..c79e67310e 100644
--- a/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/EntityRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/EntityRepository.java
@@ -18,6 +18,7 @@
 * under the License.
 */
 package org.apache.airavata.sharing.db.repositories;
+import org.springframework.stereotype.Repository;
 
 import java.util.*;
 import org.apache.airavata.sharing.db.entities.EntityEntity;
@@ -26,6 +27,7 @@ import org.apache.airavata.sharing.db.utils.DBConstants;
 import org.apache.airavata.sharing.db.utils.SharingRegistryJDBCConfig;
 import org.apache.airavata.sharing.models.*;
 
+@Repository
 public class EntityRepository extends AbstractRepository<Entity, EntityEntity, EntityPK> {
 
     public EntityRepository() {
diff --git a/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/EntityTypeRepository.java b/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/EntityTypeRepository.java
index 7589992e3c..7a2f65affc 100644
--- a/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/EntityTypeRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/EntityTypeRepository.java
@@ -24,7 +24,9 @@ import org.apache.airavata.sharing.db.entities.EntityTypePK;
 import org.apache.airavata.sharing.models.EntityType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class EntityTypeRepository extends AbstractRepository<EntityType, EntityTypeEntity, EntityTypePK> {
     private static final Logger logger = LoggerFactory.getLogger(EntityTypeRepository.class);
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/GroupAdminRepository.java b/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/GroupAdminRepository.java
index 6793678167..5685d1354e 100644
--- a/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/GroupAdminRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/GroupAdminRepository.java
@@ -24,7 +24,9 @@ import org.apache.airavata.sharing.db.entities.GroupAdminPK;
 import org.apache.airavata.sharing.models.GroupAdmin;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class GroupAdminRepository extends AbstractRepository<GroupAdmin, GroupAdminEntity, GroupAdminPK> {
 
     private static final Logger logger = LoggerFactory.getLogger(GroupAdminRepository.class);
diff --git a/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/GroupMembershipRepository.java b/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/GroupMembershipRepository.java
index 0808d44f17..9adb5f8a80 100644
--- a/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/GroupMembershipRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/GroupMembershipRepository.java
@@ -18,6 +18,7 @@
 * under the License.
 */
 package org.apache.airavata.sharing.db.repositories;
+import org.springframework.stereotype.Repository;
 
 import java.util.*;
 import org.apache.airavata.sharing.db.entities.GroupMembershipEntity;
@@ -27,6 +28,7 @@ import org.apache.airavata.sharing.db.entities.UserGroupEntity;
 import org.apache.airavata.sharing.db.utils.DBConstants;
 import org.apache.airavata.sharing.models.*;
 
+@Repository
 public class GroupMembershipRepository
         extends AbstractRepository<GroupMembership, GroupMembershipEntity, GroupMembershipPK> {
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/PermissionTypeRepository.java b/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/PermissionTypeRepository.java
index fbc8ec5ffa..d54c625b64 100644
--- a/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/PermissionTypeRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/PermissionTypeRepository.java
@@ -29,7 +29,9 @@ import org.apache.airavata.sharing.models.PermissionType;
 import org.apache.airavata.sharing.models.SharingRegistryException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class PermissionTypeRepository
         extends AbstractRepository<PermissionType, PermissionTypeEntity, PermissionTypePK> {
     private static final Logger logger = LoggerFactory.getLogger(PermissionTypeRepository.class);
diff --git a/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/SharingRepository.java b/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/SharingRepository.java
index 9dd4a4044e..618c9f8390 100644
--- a/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/SharingRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/SharingRepository.java
@@ -31,7 +31,9 @@ import org.apache.airavata.sharing.models.SharingRegistryException;
 import org.apache.airavata.sharing.models.SharingType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class SharingRepository extends AbstractRepository<Sharing, SharingEntity, SharingPK> {
     private static final Logger logger = LoggerFactory.getLogger(SharingRepository.class);
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/UserGroupRepository.java b/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/UserGroupRepository.java
index 4f13173665..7287aa09f4 100644
--- a/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/UserGroupRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/UserGroupRepository.java
@@ -34,7 +34,9 @@ import org.apache.airavata.sharing.models.SharingType;
 import org.apache.airavata.sharing.models.UserGroup;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class UserGroupRepository extends AbstractRepository<UserGroup, UserGroupEntity, UserGroupPK> {
     private static final Logger logger = LoggerFactory.getLogger(UserGroupRepository.class);
 
diff --git a/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/UserRepository.java b/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/UserRepository.java
index 1617211209..aa3177ca14 100644
--- a/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/UserRepository.java
+++ b/airavata-api/src/main/java/org/apache/airavata/sharing/db/repositories/UserRepository.java
@@ -33,7 +33,9 @@ import org.apache.airavata.sharing.models.SharingType;
 import org.apache.airavata.sharing.models.User;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Repository;
 
+@Repository
 public class UserRepository extends AbstractRepository<User, UserEntity, UserPK> {
     private static final Logger logger = LoggerFactory.getLogger(UserRepository.class);
 
diff --git a/pom.xml b/pom.xml
index d5cc2be601..b8ec26e529 100644
--- a/pom.xml
+++ b/pom.xml
@@ -574,6 +574,15 @@ under the License.
                 <artifactId>retries</artifactId>
                 <version>2.31.70</version>
             </dependency>
+
+            <!-- Spring Boot BOM -->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>3.2.0</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
         </dependencies>
     </dependencyManagement>