#spring #dependency-injection #jax-ws #javabeans
#spring #внедрение зависимостей #jax-ws #javabeans
Вопрос:
Я работаю над проектом JAX-WS, и теперь я хотел бы добавить внедрение зависимостей для одной из моих утилит.
Утилита имеет интерфейс; GeocodeUtil и две реализации: GeocodeUtilGoogleImpl и geocodeutilyahoo impl. Теперь в моем классе обслуживания у меня есть следующее:
public class MyService {
private GeocodeUtil geocodeUtil;
/* getter and setter for geocodeUtil */
}
В моем applicationContext.xml У меня есть следующее:
<bean id="geocodeUtil" class="com.company.GeocodeUtilGoogleImpl"/>
<bean id="myService" class="com.company.MyService">
<property name="geocodeUtil" ref="geocodeUtil" />
</bean>
Вот мой web.xml (только часть, относящаяся к Spring):
<!-- Spring context -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- Listeners -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
Когда я создаю экземпляр объекта MyService и пытаюсь использовать geocodeUtil, я получаю исключение NullPointerException, и мне кажется, что реализация не была внедрена.
Что мне кажется странным, так это то, что как только я удаляю средство получения / настройки, приложение вылетает при запуске, а Spring жалуется на отсутствие средства установки / получения, что наводит меня на мысль, что XML-конфигурация на самом деле правильная.
Я не использую никаких Java-аннотаций, связанных с spring.
Любая помощь приветствуется.
Ответ №1:
Хотя из вашего сообщения это неясно, я подозреваю, что вы не извлекаете экземпляр из контекста приложения. Если вы не используете никаких аннотаций, то коду, который вызывает ваш объект MyService, необходимо извлечь компонент из контекста приложения, выполнив что-то вроде этого :
ServletContext servletContext =this.getServletContext();
WebApplicationContext wac = WebApplicationContextUtils.
getRequiredWebApplicationContext(servletContext);
MyService user = (MyService)wac.getBean("myService");
Предоставленная вами конфигурация spring верна. Все, что вам нужно сделать, это убедиться, что контекст приложения создан, и что вы извлекаете свой объект из контекста приложения. Смотрите здесь для получения дополнительной информации:
Комментарии:
1. Спасибо за информативный ответ. Из того, что я понял из вашего ответа, я могу избежать необходимости получать компонент через AppContext с аннотациями? Раньше я использовал Spring только с проектами Wicket, и в этих проектах я мог бы использовать аннотацию с именем «@SpringBean». Существует ли эквивалент этой аннотации для простого Spring?
2. Вы можете использовать @Autowired для подключения сервисов или @Resource. У обеих аннотаций есть свои плюсы и минусы. Взгляните на документы spring. Однако вам необходимо настроить веб-интерфейс для внедрения зависимостей, что означает, что вы должны добавить что-то вроде этого: <context:annotation-config/> в контекст вашего приложения (см.: static.springsource.org/spring/docs/3.0.x / … ) вероятно, вам придется выполнить какую-то другую конфигурацию, потому что вы не используете spring-mvc.
Ответ №2:
Вы также должны получить экземпляр службы из контекста Spring.
Создание объекта service с помощью оператора new не приведет к запуску spring для внедрения объектов для этого экземпляра.