I doubt that this can be considered an objective issue, but let's laugh at it.
I had quite some discussion about this, and this, of course, wasn’t just what you thought.
Yes, this makes IoC somewhat pointless. This still makes the job easier because you don’t need to determine the ideal wiring order yourself, but you lose the advantage of switching implementations by modifying the configuration file, which is one of the reasons we started with IoC in the first place.
There seem to be two main approaches to switching between implementations:
You can add an annotation to your implementation, and another to the injection point, which will tell the container you want to use. You should still change your code in two places, but in the same way as implement the sub-interface and wiring, which are by type. It is also still hardcoded.
Spring has this beanconfigurer concept, which simply replaces the old xml files. You can handle the configuration in a specific class that will tell the container how to connect. I don’t see an advantage over the old style (for this reason, the xml syntax is more readable), but I think this is a matter of taste.
For me, the only way to use autowiring by type in decent mode is to play with the classpath so that you can set mocks instead of implementations, including another class. But since the java classpath has such a user-friendly interface, I also don't think it is easier than the old xml way of doing things.
So, in the end, I think it comes down to taste. Yes, auto-negotiation with annotations is a lot easier, but it hardcodes your configuration into your code, as you say. The question becomes, does it really change that often it requires a soft coding approach?