Frage

Zur Zeit meiner jsp 2.0-Tags, die Feder Bohnen müssen diesen Code verwenden:

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

Das bekomme ich nur die erste passende Bohne.

Dieser Code funktioniert gut, hat aber den unerwünschten Nachteil, dass ich etwa die Hälfte meiner Seite Rendering-Zeit verbringen Frühjahr Bohnen aufzublicken, da diese jedes Mal ein Tag aufgerufen wird, geschieht. Ich dachte, vielleicht die Bohne in Anwendungsbereich zu setzen oder zumindest Sitzungsbereich. Aber was ist wirklich der cleverste Weg, dieses Problem zu umgehen?

War es hilfreich?

Lösung

Mein erster Gedanke ist, sind Sie sicher, dass die Anrufe Frühjahr teuer sind? Dieses Zeug ist ziemlich stark optimiert, so stellen Sie sicher, dass es tatsächlich ein Problem, bevor Sie versuchen, es zu optimieren.

Unter der Annahme, es ist ein Problem, dann eine Alternative ist die exposeContextBeansAsAttributes und exposedContextBeanNames Eigenschaften von InternalResourceViewResolver. Sie können eine oder das andere verwenden (aber nicht beides) einige oder alle Ihre Bohnen freizulegen, wie JSP-Attribute.

Dies wirft die möglicherweise tatsächlich Injektion Frühling Bohnen in Ihren Tag Klassen. Zum Beispiel im Frühjahr Kontext können Sie haben:

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

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

Ihre JSP:

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

SO, wenn MyTag definiert ein Attribut thing vom Typ MyClass sollte die myBean Frühling Bohne als ein normales JSP-Attribut injiziert bekommen.

Andere Tipps

Eine einfachere Art und Weise @Configurable Anmerkung auf Ihrem Tag Klasse zu verwenden sei, würde dies machen Frühling automatisch die Abhängigkeiten in verdrahten, wenn der Tag initialisiert wird. Alle erforderlichen Abhängigkeiten werden dann mit @AutoWired Annotation und Frühling markiert werden wird in der Abhängigkeit Draht, auch wenn der Tag nicht innerhalb des Feder Container initialisiert wird.

Eine andere Möglichkeit, dies zu erreichen, ist eine statische Eigenschaft verwenden, um die Abhängigkeit zu halten. Genau wie folgt:

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;     
} 
}

Sie Application, haben Sie beide zu registrieren, so dass der JSP-Tag eine Chance bekommen kann von Frühling eingeleitet werden. Wir wir gehen mit der Magie ...

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

Cool huh, jetzt Aservice ist sichtbar in unserem JSP-Tag:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top