Spring的各種變量注入配置文件代碼(詳見項目:spring_injection):
<property name="strValue" value= "hello"/> 注入string類型的變量
<property name="intValue"value = "123"/> 注入int類型的變量
<property name="listValue">
<list>
<value>list1</value>
<value>list2</value>
</list>
</property> 注入list類型的變量
<property name="setValue">
<set>
<value>set1</value>
<value>set2</value>
<value>set3</value>
</set>
</property> 注入set類型的變量
<property name="arrayValue">
<list>
<value>array1</value>
<value>array2</value>
</list>
</property> 注入數(shù)組類型的變量
<property name="mapValue">
<map>
<entry key="k1"value="v1"/>
<entry key="k2"value="v2"/>
</map>
</property> 注入map類型的變量
如何定義屬性編輯器?
(1).繼承類PropertyEditorSupport,覆寫方法setAsText();
(2).將屬性編輯器注入到spring配置文件中。
如:如果有日期類型的屬性需要注入的話,則需要寫屬性編輯器,繼承PropertyEditorSupport類,覆寫相應(yīng)的方法—setAsText()
Spring公共屬性注入描述方法(詳見項目:spring_common):
(1).通過<bean>標(biāo)簽定義公共屬性,制定屬性abstract = true;
(2).具有相同屬性的類,只需在<bean>標(biāo)簽中指定其parent屬性即可
公共屬性注入配置文件中的代碼:
<bean id = "AbstractBean" abstract="true">
<property name="id"value="20044455"/>
<property name="name"value="Jack"/>
</bean> ---------------此處相當(dāng)于java中父類
<bean id = "bean2" class= "com.bjsxt.spring.Bean2"parent="AbstractBean">
<property name="name" value="Jack"/> -------相當(dāng)于函數(shù)覆寫了一樣
<property name="password"value="123456"/>
</bean> --------相當(dāng)于子類繼承了AbstractBean,擁有它的屬性
<bean id = "bean3" class= "com.bjsxt.spring.Bean3"parent="AbstractBean"/>
(*)依賴對象的注入方法可以有:
(1).ref屬性
(2).<ref>標(biāo)簽
(3).內(nèi)部<bean>來定義,此時無需標(biāo)注id
Spring Bean的作用域(詳見項目:spring_self_injection):
作用域?qū)傩?/span>scope可以取值:
(i).singleton-----表示每次調(diào)用getBean時,返回相同的實例;(系統(tǒng)默認(rèn)情況下是singleton的)
(ii).prototype-----表示每次調(diào)用getBean時,返回不同的實例;
Spring 對AOP知識(①采用annotation方式)
1、 引用相應(yīng)的spring 架包
2、 采用Aspect定義切面
3、 在Aspect類中定義Pointcut和Advice
4、 啟用Aspect對annotation的支持,并且將Aspect類和目標(biāo)對象配置到Ioc容器中。
注意:這種方式定義中,切入點的方法是不被執(zhí)行的,僅起到標(biāo)識作用(即Advice通過該方法名找到相應(yīng)切入點)
Spring 對AOP知識(②采用配置文件方式)(詳見項目:spring_aop2):在配置文件中寫入相應(yīng)的aspect切面(給出具體的所引對象)、Pointcut(切入點)(給定他的id(用于標(biāo)識,便于advice找到在哪個切入點)和表達式(操作于哪些方法))和advice(具體的放法)(必須指定它的method(即自己添加的方法,與業(yè)務(wù)無關(guān))和Pointcut-ref(指出切入點))。
配置文件中代碼如下:
<aop:config>
<aop:aspect id = "securityAspect"ref="securityHandler">
<aop:pointcut id="allMethods"expression="execution(* com.bjsxt.spring.UserManagerImpl.add*(..))"/>
<aop:after method="checkSecurity"pointcut-ref="allMethods"/>
</aop:aspect>
</aop:config>
Spring對AOP的支持(詳見項目:spring_aop2):
Aspect在默認(rèn)情況下不用實現(xiàn)接口,但目標(biāo)對象必須實現(xiàn)接口,如果沒有實現(xiàn)接口,則必須引入CGLIB庫
我們可以通過在advice的具體方法中添加JoinPoint參數(shù),這個值可以由spring自動傳入,從JoinPoint中可以獲得參數(shù)值和方法名等等。(詳見項目:spring_aop3)
spring注入(setXxx()方法或構(gòu)造函數(shù)法)
屬性注入即通過setXxx()方法注入Bean的屬性值或依賴對象,由于屬性注入方式具有可選擇性和靈活性高的優(yōu)點,因此屬性注入是實際應(yīng)用中最常用的注入方式。
代碼如下:
public class Foo {
private String name;
public void setName(String name) {
this.name = name;
}
public String toStirng(){
return "Foo Name is :" + this.name;
}
}
相應(yīng)配置文件中代碼如下:
<bean id="foo" class="com.tony.test.Foo">
<property name="name" value="Foo"/>
</bean>
構(gòu)造函數(shù)注入
構(gòu)造函數(shù)注入是除屬性注入之外的另一種常用注入方式,它保證一些必要的屬性在Bean實例化時就得到設(shè)置,它保證了Bean實例在實例化后就可以使用
代碼:
public class Foo {
private String name;
private int age;
public Foo(String name,int age){
this.name = name;
this.age = age;
}
public String toStirng(){
return "Foo Name is :" + this.name;
}
}
相應(yīng)配置文件中代碼:
<bean id="foo" class="com.tony.test.Foo">
<constructor-arg type="int">
<value>20</value>
</constructor-arg>
<constructor-arg type="java.lang.String">
<value>Foo</value>
</constructor-arg>
</bean>
Spring配置中<bean>的id和name屬性區(qū)別
1、在BeanFactory的配置中,<bean>是我們最常見的配置項,它有兩個最常見的屬性,即id和name,1.id屬性命名必須滿足XML的命名規(guī)范,因為id其實是XML中就做了限定的??偨Y(jié)起來就相當(dāng)于一個Java變量的命名:不能以數(shù)字、符號打頭,不能有空格,如123,?ad,"ab "等都是不規(guī)范的,Spring在初始化時就會報錯,諸如:代碼
org.xml.sax.SAXParseException: Attribute value "?ab" of type ID mustbe a name.
2.name屬性則沒有這些限定,你可以使用幾乎任何的名稱,如?ab,123等,但不能帶空格,如"a b","abc",,這時,雖然初始化時不會報錯,但在getBean()則會報出諸如以下的錯誤:代碼
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named'a b' is defined
3.配置文件中不允許出現(xiàn)兩個id相同的<bean>,否則在初始化時即會報錯,如:
代碼
org.xml.sax.SAXParseException: Attribute value "aa" of type ID mustbe unique within the document.
4.但配置文件中允許出現(xiàn)兩個name相同的<bean>,在用getBean()返回實例時,后面一個Bean被返回,應(yīng)該是前面那個<bean>被后面同名的 <bean>覆蓋了。有鑒于此,為了避免不經(jīng)意的同名覆蓋的現(xiàn)象,盡量用id屬性而不要用name屬性。
5.name屬性可以用’,’隔開指定多個名字,如<beanname="b1,b2,b3">,相當(dāng)于多個別名,這時通過getBean("a1") getBean("a2")getBean("a3")返回的都是同一個實例(假設(shè)是singleton的情況)
6.如果id和name都沒有指定,則用類全名作為name,如<beanclass="com.stamen.BeanLifeCycleImpl">,則你可以通過
getBean("com.stamen.BeanLifeCycleImpl")返回該實例。
7.如果存在多個id和name都沒有指定,且實例類都一樣的<bean>,如:
代碼
<bean class="com.stamen.BeanLifeCycleImpl"/>
<bean class="com.stamen.BeanLifeCycleImpl"/>
<bean class="com.stamen.BeanLifeCycleImpl"/>
則第一個bean通過getBean("com.stamen.BeanLifeCycleImpl")獲得,
第二個bean通過getBean("com.stamen.BeanLifeCycleImpl#1")獲得,
第三個bean通過getBean("com.stamen.BeanLifeCycleImpl#2")獲得,以此類推。
手工配置ssh事務(wù)管理器:
<!-- 配置事務(wù)管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<refbean="sessionFactory"/>
</property>
</bean>
這里創(chuàng)建了一個id為transactionManager的事務(wù)管理器,它匹配一個session工廠,<ref bean="sessionFactory"/>這個sessionFactory是指session工廠的ID。
3) 對事務(wù)管理器進行事務(wù)設(shè)置。增加如下代碼:
<tx:advice id="smAdvice"transaction-manager="transactionManager">
<tx:attributes>
<tx:methodname="save*" propagation="REQUIRED"/>
<tx:methodname="del*" propagation="REQUIRED"/>
<tx:methodname="update*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
這里創(chuàng)建了一個advice(通知),對事務(wù)管理器進行事務(wù)設(shè)置,這里意思是指,對于以save、del、update開頭的方法應(yīng)用事務(wù)。
4) 下面就把事務(wù)應(yīng)用到具體的類??慈缦麓a:
<aop:config>
<aop:pointcut id="smMethod"
expression="execution(* test.service.impl.*.*(..))"/>
<aop:advisorpointcut-ref="smMethod" advice-ref="smAdvice"/>
</aop:config>
這里配置的作用是把我們上面創(chuàng)建的advice應(yīng)用到具體的類中。以上代碼的意思指,給test.service.impl下的所有類的所有方法應(yīng)用smAdvice。
5) 示例:使用Session。
幾種事物的傳播特性
1. PROPAGATION_REQUIRED: 如果存在一個事務(wù),則支持當(dāng)前事務(wù)。如果沒有事務(wù)則開啟。
2. PROPAGATION_SUPPORTS: 如果存在一個事務(wù),支持當(dāng)前事務(wù)。如果沒有事務(wù),則非事務(wù)的執(zhí)行。
3. PROPAGATION_MANDATORY: 如果已經(jīng)存在一個事務(wù),支持當(dāng)前事務(wù)。如果沒有一個活動的事務(wù),則拋出異常。
4. PROPAGATION_REQUIRES_NEW: 總是開啟一個新的事務(wù)。如果一個事務(wù)已經(jīng)存在,則將這個存在的事務(wù)掛起。
5. PROPAGATION_NOT_SUPPORTED: 總是非事務(wù)地執(zhí)行,并掛起任何存在的事務(wù)。
6. PROPAGATION_NEVER: 總是非事務(wù)地執(zhí)行,如果存在一個活動事務(wù),則拋出異常。
7. PROPAGATION_NESTED:如果一個活動的事務(wù)存在,則運行在一個嵌套的事務(wù)中. 如果沒有活動事務(wù), 則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執(zhí)行。