by default, use is absolute, that is, it starts resolving the path from the crate root. use self:: makes it relative, instead resolving the path from the spot you're at.
sounds like your options are what you wrote, or use foo::bar::aaaaa;
I've seen cases like std::io::{self,Cursor}; which means explicitly use std::io::Cursor and also use std::io itself. Thus, Cursor need not be prefixed but you'd still need to do io::BufReader and so on.
Using the absolute path foo::bar::aaaaa will break when you decide to move foo inside another module.
Consider this example with mods foo and bar, and a function in foo using a function in bar with an absolute path:
Here is what happens when we move foo inside a module. The function in foo is no longer able to use the function in bar because the absolute path broke: