Как вставить spring beans в jsp 2.0 SimpleTag?
В настоящее время мои теги jsp 2.0, которые нуждаются в spring beans, используют этот код:
ac = WebApplicationContextUtils.getWebApplicationContext( servletContext);
ac.getBeansOfType(MyRequestedClass.class);
Я просто получаю первое совпадение bean.
Этот код работает отлично, но имеет нежелательный недостаток, который я трачу примерно половину времени рендеринга страницы, просматривая spring beans, так как это происходит каждый раз при вызове тега. Я подумал, может быть, поставить bean в область приложения или по крайней мере на сеанс. Но какой действительно самый умный способ справиться с этой проблемой?
Ответы
Ответ 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:)