Spring AOP создает дополнительный боб - PullRequest
5 голосов
/ 01 ноября 2011

Я играю с Spring AOP.

Вот простой класс

public class CModel extends Car {
    private double torqueMeasure = 1;

    public CModel() {
        System.out.println(" C-Model constructor");        
    }
}

И конфигурация Spring такая

<aop:config>
    <aop:aspect ref="audit">
        <aop:before pointcut="execution(* com.test.main..*(..))" method="firstControl"/>
            ...
    </aop:aspect>
</aop:config>

Хорошо, теперь; когда я добавляю aop: config и перехватывает CModel, тогда Spring дважды вызывает конструктор CModel. Это означает, что Spring создает 2 объекта CModel, верно?

Если я удаляю конфигурацию AOP, Spring создает только один объект CModel.

Есть идеи, почему это так?

Спасибо.

Ответы [ 2 ]

5 голосов
/ 01 ноября 2011

Хотя я не уверен, я думаю, что Spring сначала создает экземпляр обычного класса, а затем создает прокси-сервер CGLIB, который является подклассом. Обратите внимание, что для инициализации вы должны использовать @PostConstruct, который гарантированно будет использоваться один раз.

Чтобы проверить мою гипотезу, добавьте точку останова в конструктор и посмотрите, когда она вызывается - один из случаев, когда она должна быть сразу после CModel$EnhancedByCGLIB что-то

3 голосов
/ 01 ноября 2011

Когда Spring создает прокси для вашего класса, он использует CGLIB для генерации класса, который подклассов CModel. Чистый эффект - ваш конструктор будет вызван дважды.

Ознакомьтесь с документацией Spring для более подробной информации (в частности, третий пункт): http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-proxying

В качестве примечания, Spring будет использовать механизм прокси JDK, если ваш класс реализует интерфейс - и механизм прокси JDK не будет вызывать ваш конструктор.

...