Анотації використовують їх, але вони не є однією срібною кулею для вбивства конфігурації XML. Я рекомендую змішати два!
Наприклад, якщо ви використовуєте Spring, використовувати XML для частини ін'єкції залежності вашої програми цілком інтуїтивно. Це позбавляє залежності коду від коду, який буде ним користуватися, навпаки, використання якоїсь анотації в коді, яка потребує залежності, робить код відомим про цю автоматичну конфігурацію.
Однак, замість використання XML для управління транзакціями, маркування методу як транзакційного з анотацією має ідеальний сенс, оскільки це інформація, яку, мабуть, хотів би знати програміст. Але що інтерфейс буде вводитись як SubtypeY замість SubtypeX, не слід включати до класу, тому що, якщо тепер ви хочете вставити SubtypeX, ви повинні змінити свій код, тоді як раніше у вас був контракт на інтерфейс, так що з XML вам просто потрібно буде змінити відображення XML, і це зробити досить швидко і безболісно.
Я не використовував анотації JPA, тому не знаю, наскільки вони хороші, але я б стверджував, що залишати відображення бобів у базі даних у XML також добре, оскільки об’єкт не повинен перейматися, звідки надходить його інформація. , вона повинна просто дбати про те, що вона може зробити зі своєю інформацією. Але якщо вам подобається JPA (я не маю жодного досвіду з цим), будь-ласка, займіться цим.
Загалом: Якщо анотація забезпечує функціональність і виступає як коментар сама по собі, і не прив'язує код до певного конкретного процесу, щоб нормально функціонувати без цієї анотації, тоді перейдіть до анотацій. Наприклад, транзакційний метод, позначений як транзакційний, не вбиває його логіки роботи, а також слугує хорошим коментарем на рівні коду. В іншому випадку ця інформація, ймовірно, найкраще виражається як XML, оскільки, хоча вона з часом вплине на функціонування коду, вона не змінить основної функціональності коду, а значить, не належить до вихідних файлів.
@Component
і@Autowired
, це хибна дихотомія. Є й інші способи створення вашої конфігурації, включаючи JavaConfig та groovy config.