Sturts2學習:理解bean元素的作用

在看struts2bean元素配置時一直對這個元素的作用不是很清楚,儘管官方文檔說它有兩個作用:對象注入和值注入,當時說的都相當抽象。於是上網查了很多資料,並且查了下webwork in action這本書,發現bean元素是struts2裏面才引入的,無意間又看了下官方文檔中plug-in這節,這纔對bean元素的作用有了一點領悟,下面談下個人理解。在這之前,首先說下struts2中的依賴注入(dependency injection)

其實依賴注入就是我們常說的反轉控制(IoC),在bean配置的那節中一開始就提到,框架使用它自己的依賴注入容器,原文是這樣的:Internally, the framework uses its own dependency injection container.這個容器負責裝載一些關鍵的框架對象,因此框架的任何部分都能以一種標準有序的方式被取代、擴展和移去。我查看了文檔中overview中的dependency injection這節,struts2內置的IoC容器是基於Google Guice的。我查了下相關資料,發現Google GuiceGoogle公司最近發佈的一個輕量級IoC容器,與spring相比它具有如下特點:1.速度快,號稱是srping100倍;2.無需配置文件,完全依賴jdk5.0的泛型和註釋(Annotation)來描述依賴;3.簡單代碼量少。在Struts2中已經集成了Google Guice容器。創建我們所請求的action的對象以及將頁面上文本框中的值按照名字注入到action對象的各個域中去應該都歸功於這個Google Guice容器吧,不然我們的action是由誰創建的呢?action中各個屬性的值又是誰給我們注入的呢?

現在我們再來談bean配置到底什麼作用的?因爲bean的兩個作用對象注入和值注入都跟注入扯上了關係,因此我想bean的作用和那個內容的IoC容器是有關係的。接着我們看plugin那節中對sitemesh的講述。Struts-plugin.xml文件中bean配置是這樣的:

<struts>

<bean

   class="org.apache.struts2.sitemesh.FreeMarkerPageFilter"

   static="true" optional="true"/>

<bean class="org.apache.struts2.sitemesh.VelocityPageFilter"

      static="true" optional="true"/>

</struts>

接着有這麼一段話:這個兩個bean元素,通過使用”static”標記來告訴struts框架在啓動的時候將當前的設置和框架對象注入到它們的靜態的屬性設置器(setter)中。這樣的話,FreeMarkerPageFilter類就會得到一個StrutsFreemarkerManager類的實例以及當前的編碼設置。原文如下:

    The two bean elements, with the "static" flag enabled, tell Struts to inject the current settings and framework objects into static property setters on startup. This allows, for example, the FreeMarkerPageFilter class to get an instance of the Struts FreemarkerManager and the current encoding setting.

怎麼去理解呢?打開struts發佈包中關於sitemesh的文檔,找到FreeMarkerPageFilter這個類,看一下它的靜態的屬性設置方法,共有下面兩個:

static void

setFreemarkerManager(org.apache.struts2.views.freemarker.Freema

                     rkerManager mgr)

static void

setCustomEncoding(java.lang.String enc)

上面說框架在啓動的時候會將一個StrutsFreemarkerManager類的實例注入到FreeMarkerPageFilter中去,那麼這個FreemarkerManager類的實例從哪兒來呢?這正是我們在struts-default.xml定義的一個bean,如下所示:

<bean class="org.apache.struts2.views.freemarker.FreemarkerManager" name="struts"

     optional="true"/>

這樣的話,bean元素的第一個作用----對象注入就能夠很容易的理解了:bean(FreemarkerManager)由框架容器創建並被注入到其它的內部框架對象(FreeMarkerPageFilter)中去。那麼第二個作用值注入怎麼理解呢?前面已經說了,框架會在啓動的時候將當前的編碼設置注入到FreeMarkerPageFilter中,這個編碼設置是我們的一個框架常量,而這正式值注入的作用:有利於那些不是由容器創建的對象接收框架常量(如編碼)。這樣的話值注入也就能夠很容易的理解了。另外,要注意的一點就是,一個bean要想被注入的話,必須定義它的”static”屬性。

 
發佈了113 篇原創文章 · 獲贊 6 · 訪問量 49萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章