但既然是有價值的bean,我們就想在Java代碼的各處都能調用,實際中的確有這樣的場景,比如:
Struts的action要用其中的service;
充血領域模型的Hibernate實體會需要dao.
要調用這些bean,現在也確實有很多做法:
以下代碼描述的方式,被稱為bad smell,是最不自然的方式,不被提倡;
JDBCDao jdbcDao = (JdbcDao)springContext.getBean("jdbcDao");
自然的調用方式是,你調用的bean,也是注入的:
struts2是通過一個spring plugin來做到的;
hibernate就沒那麼簡單了,要用到annotation聲明,要什麼ASPectJ織入,概念複雜,麻煩之極;
我有一個簡單的做法,至少對單件的bean很可行(一般我們需要的bean也就是單件的).思路很簡單,依靠spring的注入機制,把容器內的bean注入為靜態變數.而靜態變數天然就是各處可用的.以下是代碼:
Java:
public class JdbcDao { //靜態變數 private static JdbcDao instance; //靜態方法,獲取單件對象 public static JdbcDao get(){ return instance; } //對象方法,注入到靜態變數 public void setInstance(JdbcDao _inst){ instance = _inst; } public List query(String sql){ .... } } |
spring配置,將自身注入:
<bean id="jdbcDao" class="net.jacker.dao.JdbcDao"> <property name="instance"> <ref bean="jdbcDao" /> </property> </bean> |
這樣,只要spring容器啟動,構造好bean后,就會自行將其注入到靜態變數,然後在各處的調用就很簡單了:
public class UserAction { JdbcDao jdbcDao = JdbcDao.get(); public String execute(){ jdbcDao.query(); } ... } |
註:網上有一些思路也是從靜態變數入手的,但做法有所不同,有的需要依賴Web容器,就不多做介紹了.
要說的就是,這也是單件模式的一種實現,使用spring容器配置注入好你的單件對象,並在任何地方使用之.
[火星人 ] 自然的訪問spring容器中的bean已經有442次圍觀