I didn't actually read the docs of BasicDataSource, I didn't realize it had an internal pool.  I just read: 

http://stackoverflow.com/questions/7496391/difference-between-basicdatasource-and-poolingdatasource

and that indicates that BasicDataSource wraps a PoolingDataSource.  So I guess PoolingDataSource is only useful more configuration.

That was just one example implementation.  Suppose you wanted to use JNDI to look up a datasource, then you could wire up that implementation via spring configuration rather than requiring java code changes.