code: public static <T> T unwrap(DataSource dataSource, Class<T> target) {
  		if (target.isInstance(dataSource)) {
  			return target.cast(dataSource);
  		}
  		T unwrapped = safeUnwrap(dataSource, target);
  		if (unwrapped != null) {
  			return unwrapped;
  		}
  		if (DELEGATING_DATA_SOURCE_PRESENT) {
  			DataSource targetDataSource = DelegatingDataSourceUnwrapper
  					.getTargetDataSource(dataSource);
  			if (targetDataSource != null) {
  				return unwrap(targetDataSource, target);
  			}
  		}
  		if (AopUtils.isAopProxy(dataSource)) {
  			Object proxyTarget = AopProxyUtils.getSingletonTarget(dataSource);
  			if (proxyTarget instanceof DataSource) {
  				return unwrap((DataSource) proxyTarget, target);
  			}
  		}
  		return null;
  	}
docs: Return an object that implements the given {@code target} type, unwrapping delegate
  or proxy if necessary.
  @param dataSource the datasource to handle
  @param target the type that the result must implement
  @param <T> the target type
  @return an object that implements the target type or {@code null}