Spring依賴其IOC特征,輕松的管理著一堆非常有價(jià)值的bean,這些bean在spring容器中的依賴關(guān)系都已注入好,所以相互調(diào)用非常方便。
但既然是有價(jià)值的bean,我們就想在Java代碼的各處都能調(diào)用,實(shí)際中的確有這樣的場(chǎng)景,比如:
struts的action要用其中的service;
充血領(lǐng)域模型的hibernate實(shí)體會(huì)需要dao。
要調(diào)用這些bean,現(xiàn)在也確實(shí)有很多做法:
以下代碼描述的方式,被稱為bad smell,是最不自然的方式,不被提倡;
JdbcDao jdbcDao = (JdbcDao)springContext.getBean("jdbcDao");
自然的調(diào)用方式是,你調(diào)用的bean,也是注入的:
struts2是通過一個(gè)spring plugin來做到的;
hibernate就沒那么簡(jiǎn)單了,要用到annotation聲明,要什么AspectJ織入,概念復(fù)雜,麻煩之極;
我有一個(gè)簡(jiǎn)單的做法,至少對(duì)單件的bean很可行(一般我們需要的bean也就是單件的)。思路很簡(jiǎn)單,依靠spring的注入機(jī)制,把容器內(nèi)的bean注入為靜態(tài)變量。而靜態(tài)變量天然就是各處可用的。以下是代碼:
Java:
public class JdbcDao {

//靜態(tài)變量
private static JdbcDao instance;
//靜態(tài)方法,獲取單件對(duì)象
public static JdbcDao get(){
return instance;
}
//對(duì)象方法,注入到靜態(tài)變量
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容器啟動(dòng),構(gòu)造好bean后,就會(huì)自行將其注入到靜態(tài)變量,然后在各處的調(diào)用就很簡(jiǎn)單了:
public class UserAction {
JdbcDao jdbcDao = JdbcDao.get();
public String execute(){
jdbcDao.query();
}
...
}
注:網(wǎng)上有一些思路也是從靜態(tài)變量入手的,但做法有所不同,有的需要依賴web容器,就不多做介紹了。
最后要說的就是,這也是單件模式的一種實(shí)現(xiàn),使用spring容器配置注入好你的單件對(duì)象,并在任何地方使用之。