Wie Frühjahr Bohnen in einen jsp 2,0 SimpleTag zu injizieren?
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?
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:)