Hi,
Part of me thinks, if you prefer spring and XML use that or guice and annotations use that. All of the points in the article can be argued both ways and depends on what you are written and personal perference.
Here is mine
1. XML definitions give you complete flexibility to alter wiring of an application without having to change code, this can be advantage if you are enhancing an exist product or framework (particually if you don't have the source). If you use annotation or code configuration (which i believe is how it works in guice) then how to you override or replace configuration to satisfy requirements. NOTE. I'm not a annotation or guice expert so please provide these answers so I can broaden my knowledge :-). I do agree the refactoring is a pain with XML configurations but that is price to pay for flexibility.
You could argue that you don't want to expose the wiring and this is, of course, your choice but you could similary argue that every class and parameter be final to prevent extending existing functionality which is just crazy. Everything has its place as do XML definitions.
2. I think this is a weak point, yes it is nice that you can use annotations which are handled by IDE's but ultimaly the annotation servers the same function as a string it is still a unique identifier for the injection (in the example example.pizza.PayPal). If you are in anyway serious about creating large applications with large numbers of wiring then you need some sort of naming for packages so why doesn't the same apply to spring configuration.
3. I agree that nullable and required are stupid and passing null values to a constructor is also stupid. Constructor variables should always be none null, if you want to pass null then create a new contrustor just with those arguments. If you have values which can function with no value, or have a default value, then make then gets and sets. e.g. connectionTimeout could be set 60 seconds in a class, it will function find with this but if you want to override it provide a setter which can override the default.
This is my personal rule, Constructor=Required, Property=Optional
4. Again I agree passing and recieveing nulls is stupid but this has nothing to do with dependancy injection. You methods, constuctors included, should ensure that whas is passed to them is correct and throw an exception otherwise (there is no guarentee you class is going to be used within an IOC). Same applies for return values, if you should not return null but you code allows it then use assert to prevent it.
Some will disagree to this sort of "contract" coding but you always know where you, unit tests are simplified and runtime bugs are easier to indentify.
5. I see this as a week point, most organisation will pick a IOC framework and stick with it. If you want to change then refactoring and retesting will be required anyway so that is all part of the effort. Also note that XML config does not have this problem.
6. I don't really see how this differs in Guice as if you implement a ProductCatalog and then want to introduce a CachingProductCatalog to a class where it is being injected but leave all the other instances then you have to change all the annotations (correct me if I am wrong). You also have the flip side that you can change the binding once and it changes everywhere, which could cause incorrect behaviour.
7. I would argue the other way, Spring is not just DI but other things too, i don't know if Guice supports aspects or not but these are all things to consider.
In summary, pick the one you like and like working with if it satifies your needs. Also remember that no matter what framework you use you can make mistakes or use it poorly which will create bugs and you can't blame that on the framework.