There are two main annotations that prove useful when wiring services via annotations: @Inject and @Autowired. While they generally function in about the same manner, there are subtle differences. These two annotations have different origins, @Inject being based on JSR-330 - a standard for Java dependency injection - and @Autowired is a Spring proprietary annotation to have similar functionality. The main difference between the two is that @Inject does not have the ability to toggle whether a wiring is required or not - so on failure, an exception will be thrown.
In order to allow for annotations without following the XML method that is showed in the link given, I would recommend looking into the @ComponentScan annotation. When used in configuration files in the initialization of your project, @ComponentScan will search the packages listed in its declaration to find certain annotations and register the class as a valid bean. Those annotations are: @Repository, @Service, @Controller, @Configuration, @Component. This tutorial/walkthrough gives a fantastic example, with identical configurations done within XML to compare, of utilization @ComponentScan & other annotations in order to auto-wire classes.
I believe the issue you mentioned about problems autowiring things in certain locations probably has to do with where the components are being registered and not registered - but I'm not entirely certain based on what I know about the situation.
Honestly, I don't have any recommendations for best practices utilizing dependency injection; the internet doesn't seem to have many thoughts either. The general consensus seems to be that you shouldn't 'abuse' it - but it's there, and it works, and if constraints are necessary, those can be configured.