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容器配置注入好你的单件对象,并在任何地方使用之。