private void initialize(Object bean, Class<?> beanClass) {
   Set<Method> initializeMethods = BeanFactoryUtils.getBeanMethods(beanClass, PostConstruct.class);
   if (initializeMethods.isEmpty()) {
     return;
   }
   for (Method initializeMethod : initializeMethods) {
     log.debug("@PostConstruct Initialize Method : {}", initializeMethod);
     BeanFactoryUtils.invokeMethod(
         initializeMethod, bean, populateArguments(initializeMethod.getParameterTypes()));
   }
 }
  @Override
  @SuppressWarnings("unchecked")
  public <T> T getBean(Class<T> clazz) {
    Object bean = beans.get(clazz);
    if (bean != null) {
      return (T) bean;
    }

    BeanDefinition beanDefinition = beanDefinitions.get(clazz);
    if (beanDefinition != null && beanDefinition instanceof AnnotatedBeanDefinition) {
      Optional<Object> optionalBean = createAnnotatedBean(beanDefinition);
      optionalBean.ifPresent(b -> beans.put(clazz, b));
      initialize(bean, clazz);
      return (T) optionalBean.orElse(null);
    }

    Optional<Class<?>> concreteClazz = BeanFactoryUtils.findConcreteClass(clazz, getBeanClasses());
    if (!concreteClazz.isPresent()) {
      return null;
    }

    beanDefinition = beanDefinitions.get(concreteClazz.get());
    bean = inject(beanDefinition);
    beans.put(concreteClazz.get(), bean);
    initialize(bean, concreteClazz.get());
    return (T) bean;
  }
 private Optional<Object> createAnnotatedBean(BeanDefinition beanDefinition) {
   AnnotatedBeanDefinition abd = (AnnotatedBeanDefinition) beanDefinition;
   Method method = abd.getMethod();
   Object[] args = populateArguments(method.getParameterTypes());
   return BeanFactoryUtils.invokeMethod(method, getBean(method.getDeclaringClass()), args);
 }