Spring依赖其IOC特征,轻松的管理着一堆非常有价值的bean,这些bean在spring容器中的依赖关系都已注入好,所以相互调用非常方便。 dedecms.com
但既然是有价值的bean,我们就想在Java代码的各处都能调用,实际中的确有这样的场景,比如:
内容来自dedecms
Struts的action要用其中的service;
织梦内容管理系统
充血领域模型的Hibernate实体会需要dao。
要调用这些bean,现在也确实有很多做法: copyright dedecms
以下代码描述的方式,被称为bad smell,是最不自然的方式,不被提倡;
JDBCDao jdbcDao = (JdbcDao)springContext.getBean("jdbcDao"); copyright dedecms
自然的调用方式是,你调用的bean,也是注入的: 本文来自织梦
struts2是通过一个spring plugin来做到的;
copyright dedecms
hibernate就没那么简单了,要用到annotation声明,要什么ASPectJ织入,概念复杂,麻烦之极;
copyright dedecms
我有一个简单的做法,至少对单件的bean很可行(一般我们需要的bean也就是单件的)。思路很简单,依靠spring的注入机制,把容器内的bean注入为静态变量。而静态变量天然就是各处可用的。以下是代码:
Java: dedecms.com
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容器配置注入好你的单件对象,并在任何地方使用之。 内容来自dedecms
复制地址和好友共享







