public InternalConfiguration(
      XmlConfig xmlConfig,
      ClusterManager clusterManager,
      ServerCacheManager cacheManager,
      SpiBackgroundExecutor backgroundExecutor,
      ServerConfig serverConfig,
      BootupClasses bootupClasses,
      PstmtBatch pstmtBatch) {

    this.xmlConfig = xmlConfig;
    this.pstmtBatch = pstmtBatch;
    this.clusterManager = clusterManager;
    this.backgroundExecutor = backgroundExecutor;
    this.cacheManager = cacheManager;
    this.serverConfig = serverConfig;
    this.bootupClasses = bootupClasses;
    this.expressionFactory = new DefaultExpressionFactory();

    this.typeManager = new DefaultTypeManager(serverConfig, bootupClasses);
    this.binder = new Binder(typeManager);

    this.resourceManager = ResourceManagerFactory.createResourceManager(serverConfig);
    this.deployOrmXml = new DeployOrmXml(resourceManager.getResourceSource());
    this.deployInherit = new DeployInherit(bootupClasses);

    this.deployCreateProperties = new DeployCreateProperties(typeManager);
    this.deployUtil = new DeployUtil(typeManager, serverConfig);

    this.beanDescriptorManager = new BeanDescriptorManager(this);
    beanDescriptorManager.deploy();

    this.debugLazyLoad = new DebugLazyLoad(serverConfig.isDebugLazyLoad());

    this.transactionManager =
        new TransactionManager(
            clusterManager,
            backgroundExecutor,
            serverConfig,
            beanDescriptorManager,
            this.getBootupClasses());

    this.cQueryEngine =
        new CQueryEngine(serverConfig.getDatabasePlatform(), binder, backgroundExecutor);

    ExternalTransactionManager externalTransactionManager =
        serverConfig.getExternalTransactionManager();
    if (externalTransactionManager == null && serverConfig.isUseJtaTransactionManager()) {
      externalTransactionManager = new JtaTransactionManager();
    }
    if (externalTransactionManager != null) {
      externalTransactionManager.setTransactionManager(transactionManager);
      this.transactionScopeManager =
          new ExternalTransactionScopeManager(transactionManager, externalTransactionManager);
      logger.info("Using Transaction Manager [" + externalTransactionManager.getClass() + "]");
    } else {
      this.transactionScopeManager = new DefaultTransactionScopeManager(transactionManager);
    }
  }