javascript
Spring注意事项(各部分理解)
(1),每一個(gè)bean屬性,就是一個(gè)普通的java類。
類有屬性,有方法,如何交給容器管理。(注解的方式,xml方式配置)
(2),通過Bean來實(shí)例化對(duì)象的方式
1.通過構(gòu)造器(一般是無參的默認(rèn)構(gòu)造器)
<bean id="exampleBean" class="examples.ExampleBean"/>
<bean name="anotherExample" class="examples.ExampleBeanTwo"/>
2.使用靜態(tài)工廠方法實(shí)例化
下面的bean定義展示了如何通過工廠方法來創(chuàng)建bean實(shí)例。注意,此定義并 未指定返回對(duì)象的類型,僅指定該類包含的工廠方法。
在此例中, createInstance()必須是一個(gè)static方法。
<bean id="exampleBean"
class="examples.ExampleBean2"
factory-method="createInstance"/>
(3),使用實(shí)例工廠方法實(shí)例化
(4), 注入依賴
依賴注入(DI)背后的基本原理是對(duì)象之間的依賴關(guān)系(即一起工作的其它對(duì)象)只會(huì)通過以下幾種方式來實(shí)現(xiàn):
構(gòu)造器的參數(shù)、工廠方法的參數(shù),或給由構(gòu)造函數(shù)或者工廠方法創(chuàng)建的對(duì)象設(shè)置屬性。
因此,容器的工作就是創(chuàng)建bean時(shí)注入那些依賴關(guān)系。相對(duì)于由bean自己來控制其實(shí)例化、
直接在構(gòu)造器中指定依賴關(guān)系或者類似服務(wù)定位器(Service Locator)模式這3種自主控制依賴關(guān)系注入
的方法來說,控制從根本上發(fā)生了倒轉(zhuǎn),這也正是控制反轉(zhuǎn)(Inversion of Control, IoC) 名字的由來。
應(yīng)用DI原則后,代碼將更加清晰。而且當(dāng)bean自己不再擔(dān)心對(duì)象之間的依賴關(guān)系
(甚至不知道依賴的定義指定地方和依賴的實(shí)際類)之后,實(shí)現(xiàn)更高層次的松耦合將易如反掌。
DI主要有兩種注入方式,即Setter注入和構(gòu)造器注入
(5),在采用構(gòu)造器注入的方式配置bean時(shí),很有可能會(huì)產(chǎn)生循環(huán)依賴的情況。
比如說,一個(gè)類A,需要通過構(gòu)造器注入類B,而類B又需要通過構(gòu)造器注入類A。
如果為類A和B配置的bean被互相注入的話,那么Spring IoC容器將檢測(cè)出循環(huán)引用,
并拋出 BeanCurrentlyInCreationException異常。
對(duì)于此問題,一個(gè)可能的解決方法就是修改源代碼,將某些構(gòu)造器注入改為setter注入。
(6),依賴配置詳解
<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<!-- results in a setDriverClassName(String) call -->
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="masterkaoli"/>
</bean>
(7),各類數(shù)據(jù)類型的依賴注入
<bean id="moreComplexObject" class="example.ComplexObject"><!-- results in a setAdminEmails(java.util.Properties) call --><property name="adminEmails"><props><prop key="administrator">administrator@example.org</prop><prop key="support">support@example.org</prop><prop key="development">development@example.org</prop></props></property><!-- results in a setSomeList(java.util.List) call --><property name="someList"><list><value>a list element followed by a reference</value><ref bean="myDataSource" /></list></property><!-- results in a setSomeMap(java.util.Map) call --><property name="someMap"><map><entry><key><value>an entry</value></key><value>just some string</value></entry><entry><key><value>a ref</value></key><ref bean="myDataSource" /></entry></map></property><!-- results in a setSomeSet(java.util.Set) call --><property name="someSet"><set><value>just some string</value><ref bean="myDataSource" /></set></property> </bean>?
(8),自動(dòng)裝配
Spring IoC容器可以自動(dòng)裝配(autowire)相互協(xié)作bean之間的關(guān)聯(lián)關(guān)系。
因此,如果可能的話,可以自動(dòng)讓Spring通過檢查BeanFactory中的內(nèi)容,
來替我們指定bean的協(xié)作者(其他被依賴的bean)。autowire一共有五種類型。
由于autowire可以針對(duì)單個(gè)bean進(jìn)行設(shè)置,因此可以讓有些bean使用autowire,有些bean不采用。
?
(9)Bean的作用域
當(dāng)一個(gè)bean的作用域?yàn)閟ingleton, 那么Spring IoC容器中只會(huì)存在一個(gè)共享的bean實(shí)例,
并且所有對(duì)bean的請(qǐng)求,只要id與該bean定義相匹配,則只會(huì)返回bean的同一實(shí)例。
Singleton作用域是Spring中的缺省作用域;(缺省就是默認(rèn))
singleton 只有一個(gè)實(shí)例,也即是單例模式。
prototype訪問一次創(chuàng)建一個(gè)實(shí)例,相當(dāng)于new。
應(yīng)用場(chǎng)合:
1.需要回收重要資源(數(shù)據(jù)庫連接等)的事宜配置為singleton,如果配置為prototype需要應(yīng)用確保資源正常回收。
2.有狀態(tài)的Bean配置成singleton會(huì)引發(fā)未知問題,可以考慮配置為prototype。
對(duì)于prototype作用域的bean,有一點(diǎn)非常重要,那就是Spring不能對(duì)一個(gè)prototype bean的整個(gè)生命周期負(fù)責(zé):
容器在初始化、配置、裝飾或者是裝配完一個(gè)prototype實(shí)例后,將它交給客戶端,隨后就對(duì)該prototype實(shí)例不聞不問了。
(10)初始化web配置
要使用request、session和 global session作用域的bean(即具有web作用域的bean), 在開始設(shè)置bean定義之前,還要做少量的初始配置。請(qǐng)注意,假如你只想要“常規(guī)的”作用域,(singleton和prototype),就不需要這一額外的設(shè)置。
在目前的情況下,根據(jù)你的特定servlet環(huán)境,有多種方法來完成這一初始設(shè)置...
如果你用Spring Web MVC,即用SpringDispatcherServlet或DispatcherPortlet來處理請(qǐng)求,則不需要做特別的配置:DispatcherServlet 和 DispatcherPortlet已經(jīng)處理了所有有關(guān)的狀態(tài)
當(dāng)使用了Spring's DispatcherServlet以外的Servlet 2.4及以上的Web容器時(shí)(如使用JSF或Struts),你需要在Web應(yīng)用的'web.xml'文件中增加 javax.servlet.ServletRequestListener 定義
<web-app>
...
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
...
</web-app>
如果你用的是早期版本的web容器(Servlet 2.4以前的版本),那么你要使用一個(gè)javax.servlet.Filter的實(shí)現(xiàn)。請(qǐng)看下面的web.xml配置片段:
<web-app>
..
<filter>
<filter-name>requestContextFilter</filter-name>
<filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>requestContextFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
...
</web-app>
RequestContextListener和RequestContextFilter兩個(gè)類做的都是同樣的工作: 將HTTP request對(duì)象綁定到為該請(qǐng)求提供服務(wù)的Thread。 這使得具有request和session作用域的bean能夠在后面的調(diào)用鏈中被訪問到。
Request作用域
考慮下面bean定義:
<bean id="loginAction" class="com.foo.LoginAction" scope="request"/>
針對(duì)每次HTTP請(qǐng)求,Spring容器會(huì)根據(jù)loginAction bean定義創(chuàng)建一個(gè)全新的LoginAction bean實(shí)例, 且該loginAction bean實(shí)例僅在當(dāng)前HTTP request內(nèi)有效,因此可以根據(jù)需要放心的更改所建實(shí)例的內(nèi)部狀態(tài), 而其他請(qǐng)求中根據(jù)loginAction bean定義創(chuàng)建的實(shí)例,將不會(huì)看到這些特定于某個(gè)請(qǐng)求的狀態(tài)變化。 當(dāng)處理請(qǐng)求結(jié)束,request作用域的bean實(shí)例將被銷毀。
Session作用域
考慮下面bean定義:
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>
針對(duì)某個(gè)HTTP Session,Spring容器會(huì)根據(jù)userPreferences bean定義創(chuàng)建一個(gè)全新的userPreferences bean實(shí)例, 且該userPreferences bean僅在當(dāng)前HTTP Session內(nèi)有效。 與request作用域一樣,你可以根據(jù)需要放心的更改所創(chuàng)建實(shí)例的內(nèi)部狀態(tài),而別的HTTP Session中根據(jù)userPreferences創(chuàng)建的實(shí)例, 將不會(huì)看到這些特定于某個(gè)HTTP Session的狀態(tài)變化。 當(dāng)HTTP Session最終被廢棄的時(shí)候,在該HTTP Session作用域內(nèi)的bean也會(huì)被廢棄掉。
?
轉(zhuǎn)載于:https://www.cnblogs.com/lwy19998273333/p/5497614.html
總結(jié)
以上是生活随笔為你收集整理的Spring注意事项(各部分理解)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (计算机组成原理)第五章中央处理器-第五
- 下一篇: 正确理解Spring AOP中的Arou