13

現在、Spring Bean を必要とする私の jsp 2.0 タグは、次のコードを使用しています。

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

最初に一致する Bean を取得します。

このコードは問題なく動作しますが、Spring Bean の検索にページのレンダリング時間の約半分を費やすという望ましくない欠点があります。これは、タグが呼び出されるたびに発生するためです。Bean をアプリケーション スコープまたは少なくともセッション スコープに入れることを考えていました。しかし、この問題を処理する最も賢い方法は何でしょうか?

4

3 に答える 3

11

私の最初の考えは、春への呼び出しは本当に高いですか? このようなものはかなり最適化されているため、最適化を試みる前に実際に問題があることを確認してください。

それが問題であると仮定すると、代替手段はexposeContextBeansAsAttributesとのexposedContextBeanNamesプロパティですInternalResourceViewResolver。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}"/>

SOが typeMyTagの属性を定義する場合、Spring Bean は通常の JSP 属性として注入される必要があります。thingMyClassmyBean

于 2009-08-18T21:11:49.810 に答える
8

より簡単な方法は、タグクラスで@Configurableアノテーションを使用することです。これにより、タグが初期化されるときに、Springが依存関係を自動的にワイヤリングします。必要な依存関係は@AutoWiredアノテーションでタグ付けでき、タグがSpringコンテナ内で初期化されていない場合でも、Springは依存関係をワイヤリングします。

于 2010-10-22T00:44:12.357 に答える
5

これを実現する別の方法は、静的プロパティを使用して依存関係を保持することです。以下のように:

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 によって開始される機会を 1 回得ることができるように、両方を登録する必要があります。We We Go with the magic...

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

これで aService が JSP タグに表示されるようになりました :)

于 2011-04-08T07:48:42.480 に答える