Spring依賴其IOC特征,輕松的管理著一堆非常有價值的bean,這些bean在spring容器中的依賴關系都已注入好,所以相互調用非常方便。
但既然是有價值的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容器配置注入好你的單件對象,并在任何地方使用之。