Проблема автоматического подключения @Service к сторонней библиотеке - PullRequest
2 голосов
/ 21 сентября 2011

На данный момент я Autowiring myService в различные объекты в моем приложении, и он отлично работает.

@Autowired
private MyService myService;

используя эту конфигурацию:

<context:component-scan base-package="com.myapp.mypackage" />

Однако я добавил стороннюю библиотеку и хочу Autowire myService также для некоторых объектов в этом пакете, но она не работает.

Я внес это изменение в свой компонент сканирования, но я получаю NullPointerException для myService, когда я пытаюсь получить к нему доступ в стороннем пакете:

<context:component-scan 
base-package="com.myapp.mypackage, com.thirdparty.thirdpartypackage" />

Я думал, что это будет работать?

Ответы [ 3 ]

4 голосов
/ 21 сентября 2011

В сторонних библиотеках обычный подход заключается в использовании xml:

<bean class="com.thirdparty.Foo">
    <property name="somePropertyWithASetter" ref="myService" />
</bean>

Вы не можете полагаться на аннотации, поскольку сторонняя библиотека, скорее всего, не использует @Autowired.

0 голосов
/ 26 сентября 2011

Вы пытались использовать шаблон адаптера в качестве альтернативы?Я считаю, что вы можете использовать @Autowired на адаптере.

0 голосов
/ 21 сентября 2011

Если сторонний пакет с пружинным управлением, пожалуйста, проигнорируйте остальную часть ответа

Я думаю, что вопрос, который вы должны задать себе перед выполнением инъекций зависимостей, заключается в том, управляется ли объектная пружина, чтобы сделать это, либо определите их в весеннем контексте xml, либо аннотируйте объект с помощью (@component, @service spring, стерео тип)

Давайте посмотрим на случай в руке

  1. У вас есть доступ к этому стороннему исходному коду?
  2. Использует ли третье лицо инъекцию зависимости?
  3. Если ответ на поставленные выше вопросы отрицательный, сделать это нелегко.
  4. Давайте рассмотрим пример (MyService), что если этот сервисный объект имеет состояние (так как пружинные объекты одноэлементные), также, если у этой службы есть взаимодействующие объекты, которые не вводятся

    публичный класс MyService {

      //depending on how MyServiceOne is managed makes it hard to retrofit 
      //MyService as a spring bean
      private MyServiceOne serviceone;
    
      //this also would have an adverse affect if you try use this as a spring managed
      //since all spring beans are singleton
      private String someState;
    
    
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...