Spring bean-инъекция без явного объявления зависимостей? - PullRequest
0 голосов
/ 22 декабря 2011

Я работал над проектом в течение нескольких месяцев, даже не замечая этого, и вчера, после редактирования файла класса (вставка нового компонента зависимостей с его getter / setter), я забыл явно добавить:

<property name="deviceService" ref="deviceService"/>

в соответствующем весеннем контексте xml.
Я опубликовал свое веб-приложение на tomcat, ввел отладку, и в тот момент, когда я увидел строку кода, использующую этот компонент службы, я понял, что забыл объявить его как зависимость.
Но затем произошла странная вещь - боб все же был введен ...
Такое поведение меня немного смущает. Я, конечно, не весенний эксперт, я использую его в течение последних нескольких месяцев, однако я не ожидал, что это станет возможным. Название поля класса, как можно видеть, совпадает с вводимым компонентом, если это имеет значение. В отладчике я увидел нечто подобное для поля зависимости:

deviceService=$Proxy5 (id=107)
   * h=JdkDynamicAopProxy (id=147)

так что я предполагаю, что это как-то связано с пружинным АОП.

Я должен добавить, что я не запускал этот проект с нуля, он уже был настроен, он использует spring-aop для разграничения транзакций и некоторых целей ведения журнала.

EDIT
Некоторая дополнительная информация: проект объединяет ZK Ajax и Hibernate. Этот служебный бин по сути является оберткой вокруг бина DAO; DAO bean, в свою очередь, является оболочкой для весеннего HibernateTemplate. Служебные и DAO-бины имеют одностороннюю область действия. Сервис, который внедряется, внедряется в bean-компонент контроллера MVC с прототипом. Служебный компонент входит в пакет, используемый для разграничения транзакций БД:

<tx:advice id="serviceTxAdvice" transaction-manager="transactionManager">
    <tx:attributes>
    <tx:method name="*" propagation="REQUIRED" />
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut id="serviceMethodsRMS"
        expression="execution(* org.irvas.amregina.backend.service.*.*(..))" />
    <aop:advisor advice-ref="serviceTxAdvice" pointcut-ref="serviceMethodsRMS" />
</aop:config>

Так, может кто-нибудь объяснить мне, что происходит, или что может быть причиной этого?
Спасибо.

Ответы [ 3 ]

2 голосов
/ 22 декабря 2011

В корневом теге bean-компонентов xml есть атрибут default-autowire-byname / default-autowire-bytype .Если для этого параметра установлено значение true, то пружина автоматически вставит зависимости.По умолчанию установлено значение false - я предполагаю, что в вашем случае один из приведенных выше флагов установлен в значение true.

AOP не участвует в внедрении зависимости.Вы видите прокси, потому что объект, который вводится, использует некоторую особенность Spring, которая требует aop (например, транзакция, безопасность и т. Д.).

1 голос
/ 22 декабря 2011

Проверьте одно из следующих значений в ваших конфигурациях.

context: annotation-config или context: component-scan вместе с

  1. @ Autowired аннотация вместе с @Component на пружинных бобах для автопереработки по типу.

  2. @ Resource аннотация, которая выполняет автоматическую разводку по имени + @Component в ваших bean-компонентах Spring, поскольку вы не определили никаких bean-компонентов в конфигурации Spring. У вас, у которых есть бобы, будет первая буква имени класса в нижнем регистре.

  3. default-autowire = "bytype", как обсуждал @gkamal.

  4. default-autowire = "byname" + an @ Component.

  5. по умолчанию-autowire = "автоопределение".

0 голосов
/ 22 декабря 2011
...