我有一堆java自定義標籤,使用彈簧管理bean ..因爲我無法找到一種方法來注入自定義標籤,我創建了一個幫助類,爲我需要的所有spring bean對象提供靜態方法給「getTheObjectINeedBean()」。我不喜歡這種方法。有沒有一個優雅的方式來注入一個Java自定義/簡單標記彈簧管理bean
我真的希望能夠注入託管bean到自定義標籤
彈簧有沒有辦法?至於我的研究去,我知道有沒有辦法做到這一點,因爲自定義標籤是容器管理
感謝,
比利
我有一堆java自定義標籤,使用彈簧管理bean ..因爲我無法找到一種方法來注入自定義標籤,我創建了一個幫助類,爲我需要的所有spring bean對象提供靜態方法給「getTheObjectINeedBean()」。我不喜歡這種方法。有沒有一個優雅的方式來注入一個Java自定義/簡單標記彈簧管理bean
我真的希望能夠注入託管bean到自定義標籤
彈簧有沒有辦法?至於我的研究去,我知道有沒有辦法做到這一點,因爲自定義標籤是容器管理
感謝,
比利
你是正確的沒有一個簡單的方法在jstl標籤中使用依賴注入,因爲它們不是由spring管理的,也不是。然而,有(至少)兩種解決方法:
@Configurable
- AspectJ的允許您在加載時插拔韋弗/編譯時間,所以,即使不是由春實例化對象可以是春天認識。請參閱here
您可以爲您的項目創建基本標記類,並從每個doStartTag(..)
方法中調用init(..)
方法。在那裏,您可以從pageContext
獲得ServletContext
,從而獲得彈簧ApplicationContext
(通過ApplicationContextUtils
)。然後:
AutowireCapableBeanFactory factory = appCtx.getAutowireCapableBeanFactory();
factory.autowireBean(this);
無論選項是完美的,因爲它們需要或者一些額外的代碼,或者一些「黑魔法」
爲了擴大對@ Bozho的帖子,我已經得到了這個,像這樣的工作: (春季3.0沒有ApplicationContextUtils,我能找到)上述工程的描述,然而一些背景知識和額外的代碼片段,很可能的,有用的
public class LocationTag extends RequestContextAwareTag {
@Autowired
PathComponent path;
...
@Override
protected int doStartTagInternal() throws Exception {
if (path == null) {
log.debug("Autowiring the bean");
WebApplicationContext wac = getRequestContext().getWebApplicationContext();
AutowireCapableBeanFactory acbf = wac.getAutowireCapableBeanFactory();
acbf.autowireBean(this);
}
return SKIP_BODY;
}
}
感謝「getRequestContext()。getWebApplicationContext()」解決了我的問題 – TrueCoke 2013-01-04 22:03:09
的解決方案。
1)從doStartTag方法調用doStartTagInternal方法。 2)我被迫在調用doStartTag之前先設置pageContext 3)我做了一個bean的查找,而不是自動裝配。對我來說,這似乎更直白:(YourBeanProxy)autowireCapableBeanFactory.getBean( 「yourBeanName」)
希望這額外的信息是非常有用的。
Duplicate http://stackoverflow.com/questions/1296052/how-to-inject-spring-beans-into-a-jsp-2-0-simpletag – skaffman 2010-08-10 07:18:34