2009-08-18 8 views
13

Obecnie moje znaczniki JSP 2.0, które wymagają fasoli wiosenne użyć tego kodu:Jak wstrzyknąć fasolę szparagową w JSP 2.0 SimpleTag?

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

I po prostu pierwszy pasujący Bean.

Ten kod działa poprawnie, ale ma niepożądany wady, że spędzam około połowę czasu renderowania strony, szukając fasoli szparagowej, ponieważ dzieje się tak za każdym razem, gdy wywoływany jest tag. Zastanawiałem się, może umieścić fasolę w zakresie zastosowania lub co najmniej w zakresie sesji. Ale jaki jest naprawdę najmądrzejszy sposób radzenia sobie z tym problemem?

+0

„[http://stackoverflow.com/questions/3445908/is-there- an-elegancka-droga-do-wstrzyknięcia-wiosna-zarządzana-fasola-do-java-custom-simpl] [1] 'ma dobrą odpowiedź. [1]: http://stackoverflow.com/questions/3445908/is-there-an-elegant-way-to-inject-a-spring-managed-bean-into-a-java- custom-simpl – Angus

Odpowiedz

11

Moja pierwsza myśl brzmi: czy na pewno dzwonki do wiosny są drogie? Te rzeczy są dość mocno zoptymalizowane, więc upewnij się, że to problem, zanim spróbujesz go zoptymalizować.

Zakładając, że jest problemem, wówczas alternatywą jest exposeContextBeansAsAttributes i exposedContextBeanNames właściwości InternalResourceViewResolver. Możesz użyć jednego lub drugiego (ale nie obu), aby odsłonić niektóre lub wszystkie twoje ziarna jako atrybuty JSP.

Powoduje to prawdopodobnie wstrzyknięcie fasoli Spring do twoich klas znaczników. Na przykład, w kontekście wiosennej można mieć:

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

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

Twój JSP:

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

więc jeśli MyTag definiuje atrybut thing typu MyClass, fasola myBean wiosna powinien dostać wstrzykiwane jako normalna JSP atrybut.

+0

Tak, są stosunkowo drogie. Zwłaszcza, że ​​znaczniki są używane w pętlach. Mówimy o 1-200 wywołaniach wyżej wymienionej logiki, wykorzystując 60-70% mojego czasu wykonania. Reszta kodu jest czysta i elegancka. – krosenvold

8

Najprostszym sposobem byłoby użycie adnotacji przy użyciu funkcji Konfiguruj na swojej klasie znaczników, co sprawiłoby, że Spring automatycznie powiąże zależności w momencie zainicjowania tagu. Wszelkie wymagane zależności można następnie oznaczyć za pomocą @AutoWired adnotacji, a Spring będzie łączyć w zależności, nawet jeśli tag nie został zainicjowany w kontenerze Spring.

+0

Czy możesz rozwinąć? Dzięki –

5

Innym sposobem na osiągnięcie tego jest użycie właściwości statycznej do utrzymania zależności. Podobnie jak poniżej:

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

W ty ApplicationContext, musisz zarejestrować się zarówno tak, że znacznik JSP można dostać tylko jedną szansę, aby zostać zainicjowane przez wiosnę. My idziemy z magią ...

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

Chłodny huh, teraz ÁTRYB jest widoczny w naszym tagu JSP :)