Spring零碎知識複習

自學了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>
相關文章
相關標籤/搜索