As anotações têm seu uso, mas elas não são a única bala de prata para matar a configuração XML. Eu recomendo misturar os dois!
Por exemplo, se estiver usando o Spring, é totalmente intuitivo usar XML para a parte de injeção de dependência do seu aplicativo. Isso afasta as dependências do código do código que o usará, pelo contrário, usando algum tipo de anotação no código que precisa das dependências, torna o código ciente dessa configuração automática.
No entanto, em vez de usar XML para gerenciamento transacional, marcar um método como transacional com uma anotação faz todo sentido, pois essas são as informações que um programador provavelmente gostaria de saber. Mas que uma interface será injetada como um SubtypeY em vez de um SubtypeX não deve ser incluída na classe, porque se agora você deseja injetar o SubtypeX, precisará alterar seu código, enquanto o contrato da interface era anterior, então com XML, você precisaria apenas alterar os mapeamentos XML, e é bastante rápido e fácil de fazer isso.
Como não usei anotações JPA, não sei se elas são boas, mas eu diria que deixar o mapeamento de beans no banco de dados em XML também é bom, pois o objeto não deve se importar de onde vieram as informações. , ele deve se preocupar apenas com o que pode fazer com suas informações. Mas se você gosta de JPA (eu não tenho nenhuma experiência com ele), por todos os meios, faça isso.
Em geral: se uma anotação fornecer funcionalidade e agir como um comentário por si só, e não vincular o código a algum processo específico para funcionar normalmente sem essa anotação, faça anotações. Por exemplo, um método transacional marcado como transacional não elimina sua lógica operacional e também serve como um bom comentário no nível do código. Caso contrário, essas informações provavelmente serão melhor expressas como XML, porque, embora acabem afetando o funcionamento do código, não alteram a funcionalidade principal do código e, portanto, não pertencem aos arquivos de origem.
@Component
e@Autowired
, essa é uma dicotomia falsa. Existem outras maneiras de criar sua configuração, incluindo JavaConfig e groovy config.