自學了Spring也有一段時間了,多多少少掌握了一些Spring的知識,如今手上也沒有不少的項目練手,就將就着把這些學到的東西先收集起來,方便往後用到的時候沒地方找。java
一、spring的國際化spring
主要是配置文件:sql
1 <bean id="messageSource" 2 class="org.springframework.context.support.ResourceBundleMessageSource"> 3 4 <!-- 傳入資源文件 --> 5 <!-- 類中的方法加載資源文件 setBasenames (String[] basenames) --> 6 <!-- 該方法的參數爲數組 利用list --> 7 <property name="basenames"> 8 <list> 9 <value>mess</value> 10 </list> 11 </property> 12 </bean>
獲取國際化信息:數組
System.out.println(cfx.getMessage("hello", new String[]{"chentao"},Locale.US));//第一個參數爲key,第二個參數表示佔位符,第三個參數表示Locale 兩個國際化資源文件 dom
mess_en_US.propertieside
hello={0} hello,you are welcome loginTitle={0},congratulations,{1}
mess_zh_CN.propertiesthis
hello={0} \u6B22\u8FCE\u60A8 loginTitle={0},\u606D\u559C\u60A8,{1}
二、spring資源訪問spa
1 //加載資源功能 2 Resource r = cfx.getResource("classpath:ct.txt");//從類加載路徑 3 4 BufferedReader br = new BufferedReader(new InputStreamReader(r.getInputStream())); 5 String line = null; 6 while((line = br.readLine())!=null){ 7 System.out.println(line); 8 }
三、spring命名空間prototype
配置文件的頭部添加:code
xmlns:p="http://www.springframework.org/schema/p"
四、spring嵌套Bean、依賴注入集合:
1 <bean id="person" class="com.csu.spring.domain.Person"> 2 <!-- 嵌套bean --> 3 <property name="userDao"> 4 <bean class="com.csu.spring.dao.UserDaoHibernate"/> 5 </property> 6 7 <property name="schools"> 8 <list> 9 <value>小學</value> <!-- String爲標量類型,用value表示 --> 10 <value>中學</value> 11 <value>大學</value> 12 </list> 13 </property> 14 15 <property name="scores"> 16 <map> 17 <entry key="數學" value="98.9" /> 18 <entry key="語文" value="88" /> 19 </map> 20 </property> 21 22 <property name="health"> 23 <props> 24 <prop key="姓名">**</prop> 25 <prop key="年齡">20</prop> 26 </props> 27 </property> 28 29 30 <property name="items"> 31 <set> 32 <value>個人電腦</value> 33 <list> 34 <value>筆記本</value> 35 </list> 36 </set> 37 </property> 38 39 </bean>
五、利用靜態工廠方法和實例工廠方法實例化Bean對象:
配置文件
1 <!-- 利用靜態工廠方法實例化Bean對象 --> 2 <!-- 3 當設置了factory-method屬性以後, 4 userService_2 = com.csu.spring.service.UserServiceFactory.createUserService() 5 --> 6 <bean id="userService_2" 7 class="com.csu.spring.service.UserServiceFactory" 8 factory-method="createUserService"> 9 <!-- 若是工廠方法有參數,經過constructor-arg元素傳入 --> 10 <constructor-arg value="陳濤"/> 11 </bean> 12 13 <!-- 實例工廠方法 --> 14 <bean id="userServiceFactory" class="com.csu.spring.service.UserServiceFactory"/> 15 <bean id="userService_3" factory-bean="userServiceFactory" factory-method="createUserService_2"/>
工廠類:
1 public class UserServiceFactory { 2 3 //利用靜態工廠方式實例化Bean,,之前在配置文件中都是調用Bean實現類的構造器 4 5 //假定有參數 6 public static UserService createUserService(String name){ 7 System.out.println("參數值爲:" +name +"*********靜態工廠方法*************"); 8 return new UserService(); 9 } 10 11 public UserService createUserService_2(){ 12 System.out.println("*********實例工廠方法*************"); 13 return new UserService(); 14 } 15 16 }
六、抽象Bean:
1 <!-- 由於模板只是一些通用的信息,因此告訴Sring不要建立Bean模板的實例, 2 增長abstract="true" --> 3 <bean id="template" abstract="true"> 4 <property name="school" value="csu"></property> 5 </bean>
<bean id="person" class="com.csu.spring.doamin.Person" parent="template"...(略)...>
七、協調做用域不一樣的Bean
先簡單介紹一下Bean的生命週期:
Bean有4個做用域:Singleton Prototype Request Session
當Singleton的Bean依賴Prototype的Bean,因爲Singleton只有一次初始化機會,這樣就會致使Singleton的Bean永遠依賴於最開始的注入的Prototype的Bean
解決辦法:
(1)放棄依賴注入:
自定義一個方法,即Spring容器在獲取singleton Bean時,都從新從Spring容器中獲取一個Prototype Bean, 那麼該方法要首先獲取Spring容器,再獲取並返回Prototype Bean:
singleton Bean要實現ApplicationContextAware接口:
1 import org.springframework.beans.BeansException; 2 import org.springframework.context.ApplicationContext; 3 import org.springframework.context.ApplicationContextAware; 4 5 public class Person implements ApplicationContextAware{ 6 7 private ApplicationContext cxt; 8 9 10 private Cat cat; 11 12 13 public void setCat(Cat cat) { 14 this.cat = cat; 15 } 16 17 18 //解決bean做用域不一樣步的問題 19 public Cat createCat(){ 20 //調用Spring容器從新獲取prototype的Bean 21 return (Cat) cxt.getBean("cat"); 22 } 23 24 public void getcat(){ 25 System.out.println("獲得貓的種類: "+createCat()); 26 } 27 28 //該方法由Spring調用,並且Spring把自身做爲參數傳入 29 @Override 30 public void setApplicationContext(ApplicationContext arg0) throws BeansException { 31 // TODO Auto-generated method stub 32 this.cxt = arg0; 33 } 34 35 }
(2)使用Lookup注入:
1 public abstract class Person { 2 3 4 private Fish fish; 5 6 7 public void setFish(Fish fish) { 8 this.fish = fish; 9 } 10 11 12 public abstract Fish createFish(); 13 14 15 public void getFish(){ 16 System.out.println("獲得魚的種類:" + createFish()); 17 } 18 19 20 }
1 <bean id="fish" class="com.csu.spring.doamin.Fish" scope="prototype"/> 2 3 <bean id="person" class="com.csu.spring.doamin.Person" parent="template"> 4 5 <lookup-method name = "createFish" bean="fish"/> 6 7 </bean>
lookup-method元素告訴Spring,須要先建立Person的子類,並且該子類要實現name指定的方法,這樣每次在調用Person Bean的時候,都會獲得新的Fish Bean.
八、FactoryBean:
FactoryBean接口是工廠Bean的標準接口,實現該接口的Bean一般做爲工廠Bean使用,當咱們把工廠Bean部署在容器中,並經過getBean方法來獲取時,容器不會返回FactoryBean實例,
而是返回FactoryBean產品。
1 import org.springframework.beans.factory.FactoryBean; 2 3 //用於返回指定類,指定靜態field的值 4 public class GetFieldFactoryBean implements FactoryBean { 5 6 private String field; 7 private String targetClass; 8 9 10 public void setField(String field) { 11 this.field = field; 12 13 } 14 15 16 17 public void setTargetClass(String targetClass) { 18 this.targetClass = targetClass; 19 20 21 } 22 23 24 25 //獲取返回值 26 @Override 27 public Object getObject() throws Exception { 28 // TODO Auto-generated method stub 29 //return "hello world "; 30 Class clazz = Class.forName(targetClass); 31 32 //返回clazz類的field的值 33 return clazz.getField(field).get(clazz); 34 } 35 36 //判斷返回值的類型 37 @Override 38 public Class getObjectType() { 39 // TODO Auto-generated method stub 40 return null; 41 } 42 43 //判斷是不是單例 44 @Override 45 public boolean isSingleton() { 46 // TODO Auto-generated method stub 47 return false; 48 } 49 }
1 <!-- 2 若是GetFieldFactoryBean實現了FactoryBean接口。 3 那麼下面的代碼等於: 4 建立實例後, 5 getFieldFactoryBean = com.csu.spring.util.GetFieldFactoryBean.getObject() 6 --> 7 <bean id="getFieldFactoryBean" class="com.csu.spring.util.GetFieldFactoryBean" 8 p:field="out" p:targetClass="java.lang.System"> 9 </bean>
九、Spring調用get方法
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <!-- 整個Spring 文件的根元素就是beans --> 4 <beans xmlns="http://www.springframework.org/schema/beans" 5 xmlns:p="http://www.springframework.org/schema/p" 6 xmlns:util="http://www.springframework.org/schema/util" 7 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 8 xsi:schemaLocation="http://www.springframework.org/schema/beans 9 http://www.springframework.org/schema/beans/spring-beans.xsd 10 11 http://www.springframework.org/schema/util 12 http://www.springframework.org/schema/util/spring-util.xsd"> 13 14 <bean id="person" class="com.csu.spring.getter_test.Person" scope="prototype"> 15 <property name="age"> 16 <value>30</value> 17 </property> 18 19 <property name="son"> 20 <bean class="com.csu.spring.getter_test.Son"> 21 <property name="age"> 22 <value>16</value> 23 </property> 24 </bean> 25 </property> 26 </bean> 27 28 <!--以下將會將person的屬性son的屬性age傳入son1實例的age屬性--> 29 <bean id="son1" class="com.csu.spring.getter_test.Son"> 30 <property name="age"> 31 <!--如下是訪問bean屬性的簡單方式,這樣能夠將person這個bean的age屬性賦值給son1這個bean的age屬性--> 32 <!-- 此處的id是指person.getSon().getAge()的返回值 --> 33 <bean id="person.son.age" class="org.springframework.beans.factory.config.PropertyPathFactoryBean"/> 34 </property> 35 </bean> 36 37 <!-- 如下將會得到結果son,它將是person bean的son的數值--> 38 <bean id="son2" class="org.springframework.beans.factory.config.PropertyPathFactoryBean"> 39 <property name="targetBeanName"> 40 <value>person</value> 41 </property> 42 <property name="propertyPath"> 43 <value>son</value> 44 </property> 45 </bean> 46 47 <!-- 如下將會得到結果16,它將是person bean的son的age屬性--> 48 <bean id="son3" class="org.springframework.beans.factory.config.PropertyPathFactoryBean"> 49 <property name="targetBeanName"> 50 <value>person</value> 51 </property> 52 <property name="propertyPath"> 53 <value>son.age</value> 54 </property> 55 </bean> 56 57 <!-- 如下會得到結果爲30 ,它將是得到該bean的內部bean的age屬性--> 58 <bean id="son4" class="org.springframework.beans.factory.config.PropertyPathFactoryBean"> 59 <property name="targetObject"> 60 <bean class="com.csu.spring.getter_test.Person"> 61 <property name="age"> 62 <value>30</value> 63 </property> 64 </bean> 65 </property> 66 <property name="propertyPath"> 67 <value>age</value> 68 </property> 69 </bean> 70 71 <!--訪問實例Field的 --> 72 <bean id="dog" class="com.csu.spring.getter_test.Dog" p:age="2"/> 73 <bean id="age" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean" 74 p:targetObject-ref="dog" p:targetField="age"/> 75 76 <!-- 調用普通方法 --> 77 <bean id="jf" class="javax.swing.JFrame" p:title="個人窗口"/> 78 <bean class="org.springframework.beans.factory.config.MethodInvokingBean" 79 p:targetObject-ref="jf" 80 p:targetMethod="setBounds"><!-- targetMethod就是指定方法名 ,不要對方法名進行任何修改--> 81 <property name="arguments"> 82 <list> 83 <value>40</value> 84 <value>40</value> 85 <value>200</value> 86 <value>300</value> 87 </list> 88 </property> 89 </bean> 90 <bean class="org.springframework.beans.factory.config.MethodInvokingBean" 91 p:targetObject-ref="jf" 92 p:targetMethod="add"><!-- targetMethod就是指定方法名 ,不要對方法名進行任何修改--> 93 <property name="arguments"> 94 <list> 95 <bean class="javax.swing.JButton"> 96 <constructor-arg value="文本框"/> 97 </bean> 98 <value>North</value> 99 </list> 100 </property> 101 </bean> 102 103 <bean class="org.springframework.beans.factory.config.MethodInvokingBean" 104 p:targetObject-ref="jf" 105 p:targetMethod="add"><!-- targetMethod就是指定方法名 ,不要對方法名進行任何修改--> 106 <property name="arguments"> 107 <list> 108 <bean class="javax.swing.JButton"> 109 <constructor-arg value="個人按鈕"/> 110 </bean> 111 112 <value>South</value> 113 </list> 114 </property> 115 </bean> 116 117 118 <bean class="org.springframework.beans.factory.config.MethodInvokingBean" 119 p:targetObject-ref="jf" 120 p:targetMethod="setVisible"><!-- targetMethod就是指定方法名 ,不要對方法名進行任何修改--> 121 <property name="arguments"> 122 <list> 123 <value>true</value> 124 </list> 125 </property> 126 </bean> 127 128 <bean id="out" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean" 129 p:targetClass="java.lang.System" 130 p:targetField="out"/> 131 132 <util:constant id="out2" static-field="java.lang.System.out" /> 133 <util:constant id="out3" static-field="java.sql.Connection.TRANSACTION_SERIALIZABLE"/> 134 <util:property-path id="pAge" path="person.age"/> 135 <util:list id="mylist" list-class="java.util.ArrayList"> 136 <value>哈哈</value> 137 <bean class="java.util.Date"></bean> 138 <value></value> 139 </util:list> 140 141 142 </beans>