import { ClazzType } from '../../interface/declare';
import BeanPostProcessor from '../processor/BeanPostProcessor';
import BeanDefinition from './BeanDefinition';
import { BeanFactory } from './BeanFactory';
export declare const isIocRemovedSymbol: unique symbol;
export default abstract class AbstractBeanFactory implements BeanFactory {
    protected readonly id: number;
    private readonly createChains;
    constructor();
    private readonly beanPostProcessors;
    private readonly beanInstancesCache;
    /**
     * 是否包含指定名称bean定义
     * @param key
     */
    abstract containsBeanDefinition(beanName: string): any;
    /**
     * 根据bean名称获取对应的定义
     * @param beanName bean类型
     */
    abstract getBeanDefinition(beanName: string): BeanDefinition;
    /**
     * 注册一个bean
     * @param beanName bean名称
     * @param beanDefinition bean定义
     */
    abstract registerBeanDefinition(beanName: string, beanDefinition: BeanDefinition): any;
    /**
     * 移除bean定义
     */
    abstract removeBeanDefinition(beanName: string): BeanDefinition;
    /**
     * 获取所有已注册的bean定义key
     */
    abstract getBeanDefinitionNames(): IterableIterator<string>;
    /**
     * 判断传入名称的bean是否为单例
     * @param key
     */
    isSingleton(key: string): boolean;
    /**
     * 判断传入名称的bean是否为原型
     * @param key
     */
    isPrototype(key: string): boolean;
    /**
     * 指定指定名称的bean构造函数或者类
     * @param name
     */
    getType(name: string): ClazzType;
    /**
     * 是否包含指定名称的bean
     * @param key
     * @returns
     */
    containsBean(key: string): any;
    /**
     * 判定指定名称Bean是为beanType参数指定的类型
     * @param beanName bean定义名
     * @param espectBeanType 预期的bean类型
     */
    isTypeMatch(beanName: string, beanType: ClazzType): any;
    /**
     * 获取指定bean实例
     */
    getBean<T = any>(name: ClazzType | string): T;
    getBeansOfType<T extends abstract new () => any>(beanType: T): InstanceType<T>[];
    /**
     * 根据Bean定义创建Bean实例
     * @param definition Bean定义
     * @returns Bean的实例对象
     */
    private doGetBean;
    private createBean;
    private checkLoopDependencies;
    private doCreateBean;
    private createInstance;
    private createInstanceByMethod;
    private getProcessors;
    private resolveBeforeInstantiation;
    /**
     * 执行实例化before事件
     * @param targetType 当前bean类
     * @param beanName 当前bean名称
     * @returns 返回预创建创建的实例如果有的话
     */
    private applyBeanPostProcessorsBeforeInstantiation;
    /**
     * 执行实例化after事件
     * @param instance 当前bean实例
     * @param beanName 当前bean名称
     * @returns
     */
    private applyBeanPostProcessorsAfterInstantiation;
    /**
     * 执行初始化before事件
     * @param instance 当前bean实例
     * @param beanName 当前bean名称
     * @returns 要导出的bean实例
     */
    private applyBeanPostProcessorsBeforeInitialization;
    /**
     * 执行初始化结束事件
     * @param instance 当前bean实例
     * @param beanName 当前bean名称
     * @returns 要导出的bean实例
     */
    private applyBeanPostProcessorsAfterInitialization;
    private applyBeanPostProperties;
    private populateBean;
    private invokeAwareMethods;
    private invokeInitMethods;
    private initializeBean;
    /**
     * 添加一个或多个bean处理器
     */
    addBeanPostProcessor(...processors: BeanPostProcessor[]): void;
    removeBeanInstance(definition: BeanDefinition): void;
    protected debug(...args: any[]): void;
    /**
     * 销毁工厂
     */
    destory(): void;
}
