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); }