歡迎您光臨本站 註冊首頁

自然的訪問spring容器中的bean

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0
  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容器配置注入好你的單件對象,並在任何地方使用之.


[火星人 ] 自然的訪問spring容器中的bean已經有442次圍觀

http://coctec.com/docs/java/show-post-61256.html