class DataSourceBeanPostProcessor implements BeanPostProcessor, PriorityOrdered {

    private String appName;

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

    @Override
    public int getOrder() {
        return LOWEST_PRECEDENCE;
    }

    public void setAppName(String appName) {
        this.appName = appName;
    }
}

        /*

         * filter bean which is type of {@link SmartDataSource}
         * filter bean which is not type of {@link DataSource}
         */
        if (!(bean instanceof DataSource) || bean instanceof SmartDataSource) {
            return bean;
        }

        String getUrlMethodName;
        String url;

        /*
         * Now DataSource Tracer only support the following type: Druid, C3p0, Dbcp, tomcat datasource, hikari
         */
        if (DataSourceUtils.isDruidDataSource(bean) || DataSourceUtils.isDbcpDataSource(bean)
            || DataSourceUtils.isDbcp2DataSource(bean) || DataSourceUtils.isTomcatDataSource(bean)) {
            getUrlMethodName = DataSourceUtils.METHOD_GET_URL;
        } else if (DataSourceUtils.isC3p0DataSource(bean)
                   || DataSourceUtils.isHikariDataSource(bean)) {
            getUrlMethodName = DataSourceUtils.METHOD_GET_JDBC_URL;
        } else {
            return bean;
        }

        try {
            Method urlMethod = ReflectionUtils.findMethod(bean.getClass(), getUrlMethodName);
            urlMethod.setAccessible(true);
            url = (String) urlMethod.invoke(bean);
        } catch (Throwable throwable) {
            throw new BeanCreationException(String.format("Can not find method: %s in class %s.",
                getUrlMethodName, bean.getClass().getCanonicalName()), throwable);
        }

        SmartDataSource proxiedDataSource = new SmartDataSource((DataSource) bean);
        Assert.isTrue(StringUtils.hasText(appName), TRACER_APPNAME_KEY + " must be configured!");
        proxiedDataSource.setAppName(appName);
        proxiedDataSource.setDbType(DataSourceUtils.resolveDbTypeFromUrl(url));
        proxiedDataSource.setDatabase(DataSourceUtils.resolveDatabaseFromUrl(url));

        // execute proxied datasource init-method
        proxiedDataSource.init();
        return proxiedDataSource;
    
<no_super_class>