class AsyncProxyBeanPostProcessor implements BeanPostProcessor, InitializingBean,
                                        BeanFactoryAware, Ordered {

    private final AsyncInitMethodManager    asyncInitMethodManager;

    private ConfigurableListableBeanFactory beanFactory;

    public AsyncProxyBeanPostProcessor(AsyncInitMethodManager asyncInitMethodManager) {
        this.asyncInitMethodManager = asyncInitMethodManager;
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName)
                                                                               throws BeansException {<FILL_FUNCTION_BODY>}

    @Override
    public int getOrder() {
        return PriorityOrdered.HIGHEST_PRECEDENCE;
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = (ConfigurableListableBeanFactory) beanFactory;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        for (String beanName : beanFactory.getBeanDefinitionNames()) {
            BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName);
            String asyncInitMethodName = (String) beanDefinition
                .getAttribute(ASYNC_INIT_METHOD_NAME);
            if (StringUtils.hasText(asyncInitMethodName)) {
                asyncInitMethodManager.registerAsyncInitBean(beanFactory, beanName,
                    asyncInitMethodName);
            }
        }
    }

}

        String methodName = asyncInitMethodManager.findAsyncInitMethod(beanFactory, beanName);
        if (!StringUtils.hasText(methodName)) {
            return bean;
        }

        ProxyFactory proxyFactory = new ProxyFactory();
        proxyFactory.setTargetClass(bean.getClass());
        proxyFactory.setProxyTargetClass(true);
        AsyncInitializeBeanMethodInvoker asyncInitializeBeanMethodInvoker = new AsyncInitializeBeanMethodInvoker(
            asyncInitMethodManager, bean, beanName, methodName);
        proxyFactory.addAdvice(asyncInitializeBeanMethodInvoker);
        return proxyFactory.getProxy();
    
<no_super_class>