Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Spring dependency injection в сервлетоы и фильтры, Как не делать context.getBean("...") 
V
    Опции темы
illarion
Дата 17.9.2009, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 27.2.2009

Репутация: нет
Всего: нет



В нашем проекте было очень много примеров неправильного использования Spring IoC, вида:

Код

MyClass instance = applicationContext.getBean("someBean");


Эти неявные зависимости я почти везде уже устранил, но столкнулся с тем, что в фильтры и сервлеты, жизненным циклом которых управляет контейнер (в нашем случае Tomcat), инжектить ничего нельзя. Официальная документация по этому поводу молчит. Как быть? Может кто-то уже сталкивался с такой ситуацией?
PM MAIL   Вверх
garbuz
Дата 17.9.2009, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 8
Всего: 11



Я недавно в сервлете бин доставал. Делал вот так
Код

 WebApplicationContext springContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
 ApplicationService applicationService =(ApplicationService)springContext.getBean("applicationService");

PM MAIL   Вверх
illarion
Дата 17.9.2009, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 27.2.2009

Репутация: нет
Всего: нет



Цитата(garbuz @ 17.9.2009,  12:55)
Я недавно в сервлете бин доставал. Делал вот так
Код

 WebApplicationContext springContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
 ApplicationService applicationService =(ApplicationService)springContext.getBean("applicationService");

Это как раз пример того, как сделано сейчас. Это не совсем корректно и не совсем красиво. Если бы спринг умел инстанцировать сервлеты и фильтры сам, то можно было бы их объявить как обычные бины, настроив для них properties. В самом же коде сервлета были бы лишь простые сеттеры.
PM MAIL   Вверх
garbuz
Дата 17.9.2009, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 8
Всего: 11



Цитата(illarion @  17.9.2009,  13:03 Найти цитируемый пост)
то как раз пример того, как сделано сейчас. Это не совсем корректно и не совсем красиво. Если бы спринг умел инстанцировать сервлеты и фильтры сам, то можно было бы их объявить как обычные бины, настроив для них properties. В самом же коде сервлета были бы лишь простые сеттеры. 

Видел где-то, сейчас к сожалению не найти, пример, где расширялся класс HttpServlet, экземпляры которого могли потом использоваться как простые бины, котрым было достаточно сеттеров. Т.е. то что вам надо. Советую поискать. Можно конечно самому попробывать реализовать smile
PM MAIL   Вверх
_sten_
Дата 23.9.2009, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 184
Регистрация: 29.9.2006

Репутация: 3
Всего: 3



думаю стоит почитать о Spring MVC
--------------------
WARNING: Condition 'to_be || !to_be' is always 'true' !
PM MAIL ICQ   Вверх
garbuz
Дата 24.9.2009, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 677
Регистрация: 22.1.2008

Репутация: 8
Всего: 11



Цитата(_sten_ @  23.9.2009,  23:56 Найти цитируемый пост)
думаю стоит почитать о Spring MVC 

Иногда полный Spring MVC бывает лишним, например нужен всего один сервлет для обработки ajax запросов, а в этот сервлет надо проинжектить объект какого-либо сервиса.
illarion, я кстати нашел ссылку. Метод номер 3 
http://andykayley.blogspot.com/2007/11/how...beans-into.html
PM MAIL   Вверх
MisterCleric
Дата 24.9.2009, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Цитата

я кстати нашел ссылку. Метод номер 3 

А чем этот способ отличается от:
Код

 WebApplicationContextUtils.getWebApplicationContext(getServletContext());


То же самое только инкапсулировано в определенном классе.
Я, к стати, тоже интересовался такими методами "автоваринга" для связки EJB3+Spring и там есть что-то подобное показанное garbuz.
Вешается на EJB интерцептор, который и будет производить инъект Spring-бинов в проперти, помеченные как @Autowired
Я думаю, все-таки, в данном случае надо смотреть в сторону Spring MVC.

Да, что бы далеко не ходить даже спринговцы используют "бракуемый" в данной теме способ. Вот пример исходников одного из их классов:
Код


package org.springframework.web.context.support;
public class HttpRequestHandlerServlet extends HttpServlet {

    private HttpRequestHandler target;


    public void init() throws ServletException {
        WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
        this.target = (HttpRequestHandler) wac.getBean(getServletName(), HttpRequestHandler.class);
    }
.....
}



--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
magicfly
Дата 28.9.2009, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 21.2.2007

Репутация: 1
Всего: 1



http://www.acegisecurity.org/acegi-securit...oBeanProxy.html

есть такая вещь, используется как видно в spring-security. Возможно стоит покопать туда
PM MAIL   Вверх
MisterCleric
Дата 29.9.2009, 09:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1043
Регистрация: 16.2.2006
Где: Харьков, Украина

Репутация: 33
Всего: 38



Привет.
Нашел: тебе действительно ничего писать не надо. Есть такой класс у Spring:
Код

<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>


где имя фильтра имя бина в Spring-контексте.

Добавлено через 4 минуты и 17 секунд
Твой бин всего лишь должен быть как " implements Filter", а дальше делаешь свои инджекшены как обычно


--------------------
ПРИШЕЛ, УВИДЕЛ - ПЕРЕПИСАЛ...
PM MAIL ICQ   Вверх
illarion
Дата 5.10.2009, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 27.2.2009

Репутация: нет
Всего: нет



Что же касается сервлета, то все еще проще - он должен реализовывать интерфейс HttpRequestHandler

Код

public class MyServlet extends HttpServlet implements HttpRequestHandler {

  private String myProperty;

  public void setMyProperty(String value){
    this.myProperty = value;
  }

...

}


в application context пишем:
Код

    <bean id="MyServlet" class="com.test.MyServlet">
        <property name="myProperty" value="test" />
    </bean>


а в web.xml пишем такое:

Код

    <servlet>
        <servlet-name>MyServlet</servlet-name>
        <display-name>MyServlet</display-name>
        <description></description>
        <servlet-class>org.springframework.web.context.support.HttpRequestHandlerServlet</servlet-class>
    </servlet>

PM MAIL   Вверх
illarion
Дата 9.10.2009, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 27.2.2009

Репутация: нет
Всего: нет



В общем, в итоге в проекте осталсь лишь SessionListener и еще парочку, в которые непонятно как инжектить. Фильтры и сервлеты работают через HttpRequestHandlerServlet и DelegatingFilterProxy. 
PM MAIL   Вверх
Старовъръ
Дата 10.10.2009, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.5.2008

Репутация: 1
Всего: 10



Если приложение большое, то, как советовали выше, нужно глядеть в сторону SpringMVC или другого MVC framework.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0968 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.