Подтвердить что ты не робот

Как вставить spring beans в jsp 2.0 SimpleTag?

В настоящее время мои теги jsp 2.0, которые нуждаются в spring beans, используют этот код:

ac = WebApplicationContextUtils.getWebApplicationContext( servletContext);
ac.getBeansOfType(MyRequestedClass.class);

Я просто получаю первое совпадение bean.

Этот код работает отлично, но имеет нежелательный недостаток, который я трачу примерно половину времени рендеринга страницы, просматривая spring beans, так как это происходит каждый раз при вызове тега. Я подумал, может быть, поставить bean в область приложения или по крайней мере на сеанс. Но какой действительно самый умный способ справиться с этой проблемой?

4b9b3361

Ответ 1

Моя первая мысль: уверены ли вы, что звонки на spring дороги? Этот материал довольно сильно оптимизирован, поэтому перед его оптимизацией убедитесь, что это действительно проблема.

Предполагая, что это проблема, альтернативой являются exposeContextBeansAsAttributes и exposedContextBeanNames свойства InternalResourceViewResolver. Вы можете использовать один или другой (но не оба), чтобы выставить некоторые или все ваши beans как атрибуты JSP.

Это повышает вероятность фактического ввода spring beans в ваши классы тегов. Например, в вашем spring контексте вы можете:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="exposeContextBeansAsAttributes" value="true"/>
</bean>

<bean id="myBean" class="com.x.MyClass"/>

Ваш JSP:

<MyTag thing="${myBean}"/>

SO, если MyTag определяет атрибут thing типа MyClass, myBean spring bean должен быть введен как нормальный JSP-атрибут.

Ответ 2

Более простым способом было бы использовать @Configurable annotation в вашем классе тегов, это сделало бы Spring автоматически связать зависимости, когда тег инициализируется. Любые требуемые зависимости могут быть помечены аннотацией @AutoWired, а Spring будет подключаться в зависимости, даже если тег не инициализирован в контейнере Spring.

Ответ 3

Другим способом достижения этого является использование статического свойства для хранения зависимости. Как показано ниже:

public class InjectedTag extends SimpleTagSupport {
//In order to hold the injected service, we have to declare it as static
    private static AService _service;   
/***/   
@Override   
public void doTag() throws IOException {    
          getJspContext().getOut().
          write("Service injected: " + _service + "<br />");    
}   
public void setService(AService service) { 
        _service = service;     
} 
}

В вашем приложении applicationcontext вам необходимо зарегистрировать оба, чтобы тег JSP мог получить один шанс для запуска с помощью Spring. Мы идем с магией...

<bean id="aService" class="com.foo.AService">
  <!-- configure the service. -->
</bean>
<bean class="com.foo.InjectedTag" >
  <property name="service"><ref local="aService"/></property>
</bean>

Прохладный huh, теперь aService виден в нашем теге JSP:)