Способ, которым Spring обрабатывает транзакцию через Annotation, использует AOP, как вы сказали.
Бит AOP реализован с использованием динамических прокси (см. doc )
Таким образом, для этого вам нужно получить экземпляр вашего класса (здесь Pojo) через контейнер Spring, поскольку для его работы Spring вернет вам динамический прокси поверх вашего Pojo, который будет автоматически окружать любые аннотированные метод с кодом управления транзакциями.
Если вы просто сделаете
Pojo p = new Pojo();
p.doInTransaction();
Spring не играет здесь никакой роли, и ваш вызов метода не будет внутри транзакции.
так что вам нужно сделать что-то вроде этого
ApplicationContext springContext = ...;
Pojo p = (Pojo) springContext.getBean("your.pojo.id");
p.doInTransaction();
Примечание: это пример, вы должны предпочесть внедрение зависимостей вместо того, чтобы извлекать ваш бин вручную из контекста
Таким образом, и с правильно настроенным Spring Context, Spring должен иметь возможность проверять ваши классы на наличие транзакционных аннотаций и автоматически оборачивать ваши бины в экземпляры динамических прокси с поддержкой аннотаций. С вашей точки зрения, это ничего не меняет, вы все равно приведете свой объект к своим собственным классам, но если вы попытаетесь распечатать имя класса вашего пружинного контекста Pojo, вы получите что-то вроде Proxy $. .. а не ваше первоначальное имя класса.
Взгляните на эту ссылку в любом случае: текст ссылки