/// <summary>
        /// 전달된 <paramref name="instance"/> 인스턴스에서 Autowire 특성이 선언된 속성을 Spring Context에 등록하고, 주입합니다.
        /// </summary>
        /// <param name="instance">직접 생성한 인스턴스</param>
        /// <param name="rootContextName"></param>
        public static void Autowire(object instance, string rootContextName = DefaultRootContextName)
        {
            AbstractApplicationContext ctx = GetApplicationContext(rootContextName);

            foreach (AutowireTargetPropertyInfo info in AutowireTargetPropertyGetter.GetAutowireTargetPropertiesInfo(instance.GetType(), null))
            {
                CreateObjectDefinition(ctx, info);
                info.PropertyInfo.SetValue(instance, ctx.GetObject(info.ObjectInfo.Id));
            }
        }
        /// <summary>
        /// <paramref name="info"/> 정보를 분석하여 Spring Context에 등록합니다.
        /// </summary>
        /// <param name="ctx"></param>
        /// <param name="info"></param>
        private static void CreateObjectDefinition(AbstractApplicationContext ctx, AutowireTargetPropertyInfo info)
        {
            if (!ctx.IsObjectNameInUse(info.ObjectInfo.Id))
            {
                lock (_lockMap.GetOrAdd(info.ObjectInfo.Id, new object()))
                {
                    if (!ctx.IsObjectNameInUse(info.ObjectInfo.Id))
                    {
                        IObjectDefinition objectDefinition = GetOrCreateObjectDefinition(ctx, info);
                        // 병힙정의 찾기
                        IObjectDefinition mergeTargetObjectDefinition = null;
                        if (!string.IsNullOrEmpty(info.ObjectInfo.PropertyDefinedAutowireAttribute.MergeBase) && ctx.IsObjectNameInUse(info.ObjectInfo.PropertyDefinedAutowireAttribute.MergeBase))
                        {
                            mergeTargetObjectDefinition = ctx.GetObjectDefinition(info.ObjectInfo.PropertyDefinedAutowireAttribute.MergeBase);
                        }

                        // 병합정의가 있는경우 우선 처리
                        if (mergeTargetObjectDefinition != null)
                        {
                            foreach (PropertyValue propertyValue in mergeTargetObjectDefinition.PropertyValues)
                            {
                                if (info.ObjectInfo.ObjectType.GetProperty(propertyValue.Name) != null)
                                {
                                    // 현재 정의에 없다면 등록한다.
                                    if (!objectDefinition.PropertyValues.Contains(propertyValue.Name))
                                    {
                                        objectDefinition.PropertyValues.Add(mergeTargetObjectDefinition.PropertyValues.GetPropertyValue(propertyValue.Name));
                                    }
                                }
                            }
                        }

                        // 현재 정의의 객체나 프로퍼티에 선언된 Property 특성으로 부터 확인된 속성정의를 우선 등록한다.
                        foreach (var confirmedPropAttr in info.ObjectInfo.ConfirmedPropertyAttributes)
                        {
                            // 현재 정의에 이미 존재한다면, 제거하고 새로 등록한다.
                            if (objectDefinition.PropertyValues.Contains(confirmedPropAttr.Name))
                            {
                                objectDefinition.PropertyValues.Remove(objectDefinition.PropertyValues.GetPropertyValue(confirmedPropAttr.Name));
                            }
                            objectDefinition.PropertyValues.Add(confirmedPropAttr.Name, new RuntimeObjectReference(confirmedPropAttr.Ref));
                        }

                        // 현재 정의의 객체에 Autowire 특성을 가지고 있는 프로퍼티
                        foreach (AutowireTargetPropertyInfo inInfo in AutowireTargetPropertyGetter.GetAutowireTargetPropertiesInfo(info.ObjectInfo.ObjectType, info))
                        {
                            // 이미 정의되어 있으나 이 것이 MergeBase에 의한 것이라면 지운다
                            if (objectDefinition.PropertyValues.Contains(inInfo.PropertyInfo.Name))
                            {
                                if (mergeTargetObjectDefinition != null && mergeTargetObjectDefinition.PropertyValues.Contains(inInfo.PropertyInfo.Name))
                                {
                                    objectDefinition.PropertyValues.Remove(objectDefinition.PropertyValues.GetPropertyValue(inInfo.PropertyInfo.Name));
                                }
                            }

                            // 핸재 정의에 존재하지 않는다면 정의를 새로 생성한다.
                            if (!objectDefinition.PropertyValues.Contains(inInfo.PropertyInfo.Name))
                            {
                                CreateObjectDefinition(ctx, inInfo);
                                objectDefinition.PropertyValues.Add(inInfo.PropertyInfo.Name, new RuntimeObjectReference(inInfo.ObjectInfo.Id));
                            }
                        }
                    }
                }
            }
        }