如何将 spring bean 注入 jsp 2.0 SimpleTag?
Posted
技术标签:
【中文标题】如何将 spring bean 注入 jsp 2.0 SimpleTag?【英文标题】:How to inject spring beans into a jsp 2.0 SimpleTag? 【发布时间】:2010-11-20 17:31:13 【问题描述】:目前我需要spring bean的jsp 2.0标签使用这个代码:
ac = WebApplicationContextUtils.getWebApplicationContext( servletContext);
ac.getBeansOfType(MyRequestedClass.class);
我刚刚得到第一个匹配的 bean。
这段代码运行良好,但有一个不受欢迎的缺点,即我花了大约一半的页面渲染时间来查找 spring bean,因为每次调用标签时都会发生这种情况。我在想也许将 bean 放入应用程序范围或至少会话范围。但真正处理这个问题的最聪明的方法是什么?
【问题讨论】:
'[***.com/questions/3445908/…' 对此有一个很好的答案。 [1]:***.com/questions/3445908/… 【参考方案1】:我的第一个想法是,你确定调用 spring 很昂贵吗?这些东西已经过大量优化,所以在尝试优化之前确保它确实是一个问题。
假设它是一个问题,那么替代方案是InternalResourceViewResolver
的exposeContextBeansAsAttributes
和exposedContextBeanNames
属性。您可以使用其中一种(但不能同时使用)将部分或全部 bean 公开为 JSP 属性。
这增加了将 Spring bean 实际注入标记类的可能性。例如,在您的 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"/>
所以如果MyTag
定义了MyClass
类型的属性thing
,则myBean
spring bean 应该作为普通的 JSP 属性注入。
【讨论】:
是的,它们相对昂贵。特别是因为标签是在循环中使用的。我们正在谈论使用 60-70% 的执行时间对上述逻辑进行 1-200 次调用。其余代码简洁优雅。【参考方案2】:更简单的方法是在标签类上使用@Configurable 注解,这将使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;
在您的应用程序上下文中,您必须同时注册两者,以便 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>
很酷,现在我们的 JSP 标签中可以看到 aService 了 :)
【讨论】:
以上是关于如何将 spring bean 注入 jsp 2.0 SimpleTag?的主要内容,如果未能解决你的问题,请参考以下文章