一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - Spring中屬性注入詳解

Spring中屬性注入詳解

2020-06-24 11:57玄玉 JAVA教程

這篇文章主要為大家詳細(xì)介紹了Spring中屬性注入,演示了int、String、數(shù)組、list等屬性的注入,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文演示了int、String、數(shù)組、list、set、map、Date等屬性的注入。
其中Date類型的注入則是借助了Spring提供的屬性編輯器來實現(xiàn)的,首先是用到的五個實體類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package com.jadyer.model;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
 * 常見屬性的注入
 * @see 包括int,String,Array,list,set,map,Date的注入
 */
public class Bean11 {
  private Integer intValue;
  private String strValue;
  private String[] arrayValue;
  private List listValue;
  private Set setValue;
  private Map mapValue;
  private Date dateValue;
  /* 七個屬性的setter和getter略 */
}
 
 
package com.jadyer.model;
public class Bean22 {
  private Bean33 bean33;
  private Bean44 bean4422; //注入:與屬性名無關(guān),與setBean44()有關(guān)
  private Bean55 bean55;
  /* 三個屬性的setter和getter略 */
}
 
 
package com.jadyer.model;
public class Bean33 {
  private Integer id;
  private String name;
  private String sex;
  /* 三個屬性的setter和getter略 */
}
 
 
package com.jadyer.model;
public class Bean44 {
  private Integer id;
  private String name;
  private String sex;
  private Integer age;
  /* 四個屬性的setter和getter略 */
}
 
 
package com.jadyer.model;
public class Bean55 {
  private String password;
  /* 關(guān)于password的setter和getter略 */
}

然后是我們自定義的java.util.Date類型轉(zhuǎn)換器

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.jadyer.util;
 
import java.beans.PropertyEditorSupport;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
 
/**
 * java.util.Date屬性編輯器。相當(dāng)于類型轉(zhuǎn)換器。這里是將String轉(zhuǎn)為Date型
 * @see ----------------------------------------------------------------------------------------
 * @see 該示例主要讓大家知道Spring也有這種機(jī)制,不是讓大家以后寫屬性編輯器
 * @see 需要寫屬性編輯器的幾率太少了,只要知道Spring也有類似的機(jī)制就可以了
 * @see ----------------------------------------------------------------------------------------
 * @see 所謂的屬性編輯器,就是將Spring配置文件中的字符串轉(zhuǎn)換成相應(yīng)的Java對象
 * @see Spring內(nèi)置了一些屬性編輯器,也可以自定義屬性編輯器
 * @see 自定義屬性編輯器事,須繼承PropertyEditorSupport類并覆寫setAsText()方法
 * @see 最后再將自定義的屬性編輯器注入到Spring中,即可
 * @see ----------------------------------------------------------------------------------------
 */
public class UtilDatePropertyEditor extends PropertyEditorSupport {
  private String pattern; //將轉(zhuǎn)換的格式放到配置文件中,讓Spring注入進(jìn)來
  public void setPattern(String pattern) {
    this.pattern = pattern;
  }
   
  @Override
  public void setAsText(String text) throws IllegalArgumentException {
    System.out.println("======UtilDatePropertyEditor.setAsText()======" + text);
    try {
      Date date = new SimpleDateFormat(pattern).parse(text);
      this.setValue(date); //注意:這里放進(jìn)去的是一個java.util.Date對象,故輸出的時間是默認(rèn)的格式
    } catch (ParseException e) {
      e.printStackTrace();
      throw new IllegalArgumentException(text); //繼續(xù)向上拋參數(shù)非法的異常
    }
  }
}

用到的針對所有實體類的applicationContext-beans.xml文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
      default-lazy-init="true">
  <!-- default-lazy-init="true"屬性的說明,詳見InjectionTest.java類的第49行 -->
  <!-- default-autowire="byName或byType",這是Spri0ng提供的自動裝配bean的兩種方式byName和byType,詳解略 -->
   
  <!-- ***********************【LAZY====延遲初始化】*********************************************************************** -->
  <!-- 執(zhí)行testInjection22()時默認(rèn)的會輸出======UtilDatePropertyEditor.setAsText()======2010年06月04日 -->
  <!-- 即此時并未設(shè)置default-lazy-init="true",這說明Bean11中的dateValue屬性的值被注入了 -->
  <!-- 事實上,默認(rèn)的Spring在創(chuàng)建ApplicationContext時,會將配置文件中所有的對象實例化并進(jìn)行注入 -->
  <!-- 這樣做的好處是如果Spring配置文件中的某些配置寫錯了,它立刻就能檢測出來 -->
  <!-- 而Struts1.X的配置文件,如果某個類寫錯了,是不會出問題的,只有在真正執(zhí)行的時候,才會出問題 -->
  <!-- 對于Spring而言,也可以采用相關(guān)的屬性延遲配置文件的初始化,即default-lazy-init="true" -->
  <!-- 即只有真正使用的時候,再去New這個對象,再為屬性注入。這時就涉及到LAZY,即延遲初始化 -->
  <!-- 只需修改Spring配置文件即可,如<beans xsi:schemaLocation="http://www...." default-lazy-init="true"> -->
  <!-- 這時的作用范圍即整個配置文件,同理也可對各個<bean>標(biāo)簽的lazy-init屬性進(jìn)行單獨配置 -->
  <!-- 但一般都不會這么設(shè)置,而是在BeanFactory創(chuàng)建的時候,即完成注入,這樣也便于檢查出錯誤 -->
  <!-- ***************************************************************************************************************** -->
   
  <bean id="bean11" class="com.jadyer.model.Bean11">
    <property name="intValue" value="123"/><!-- 注入時,字符串123會自動轉(zhuǎn)換為int型 -->
    <property name="strValue" value="Hello_Spring"/>
    <property name="arrayValue">
      <list>
        <value>array11</value>
        <value>array22</value>
      </list>
    </property>
    <property name="listValue">
      <list>
        <value>list11</value>
        <value>list22</value>
      </list>
    </property>
    <property name="setValue">
      <set>
        <value>set11</value>
        <value>set22</value>
      </set>
    </property>
    <property name="mapValue">
      <map>
        <entry key="key11" value="value11"/>
        <entry key="key22" value="value22"/>
      </map>
    </property>
    <property name="dateValue" value="2010年06月04日"/><!-- 這里Date格式應(yīng)與applicationContext-editor.xml配置的相同 -->
  </bean>
   
  <bean id="bean22" class="com.jadyer.model.Bean22">
    <property name="bean33" ref="bean33"/>
    <property name="bean44" ref="bean44"/>
    <property name="bean55" ref="bean55"/>
  </bean>
   
  <bean id="bean55" class="com.jadyer.model.Bean55">
    <property name="password" value="123"/>
  </bean>
</beans>

用到的針對公共實體類的applicationContext-common.xml文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
       
  <!-- 利用抽象bean提取出公共配置 -->
  <!-- 首先指定<bean>標(biāo)簽的abstract屬性為true,然后在其它<bean>中指定其parent即可 -->
  <bean id="AbstractBean" abstract="true">
    <property name="id" value="2"/>
    <property name="name" value="張起靈"/>
    <property name="sex" value="男"/>
  </bean>
  <bean id="bean33" class="com.jadyer.model.Bean33" parent="AbstractBean"/>
  <bean id="bean44" class="com.jadyer.model.Bean44" parent="AbstractBean">
    <property name="age" value="26"/>
  </bean>
</beans>
 
<!-- 使用AbstractBean之前的bean33和bean44的原形如下 -->
<!-- 
<bean id="bean33" class="com.jadyer.model.Bean33">
  <property name="id" value="100"/>
  <property name="name" value="張三"/>
  <property name="sex" value="男"/>
</bean>
<bean id="bean44" class="com.jadyer.model.Bean44">
  <property name="id" value="100"/>
  <property name="name" value="張三"/>
  <property name="sex" value="男"/>
  <property name="age" value="90"/>
</bean>
 -->

用到的針對java.util.Date屬性編輯器的applicationContext-editor.xml文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
       
  <bean id="utilDatePropertyEditor" class="com.jadyer.util.UtilDatePropertyEditor">
    <property name="pattern" value="yyyy年MM月dd日"/>
  </bean>
   
  <!-- 查看源碼得知,在CustomEditorConfigurer類的131行提供了一個setCustomEditors方法,所以就能夠注入了 -->
  <bean id="customEditors" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
    <property name="customEditors">
      <map>
        <entry key="java.util.Date" value-ref="utilDatePropertyEditor"/>
      </map>
    </property>
  </bean>
</beans>
 
<!-- 也可以使用內(nèi)部<bean>把utilDatePropertyEditor寫在內(nèi)部 -->
<!-- 這樣就只有它自己有權(quán)使用了,外部就無法使用了 -->
<!-- 由于不提供外界訪問,所以內(nèi)部<bean>沒有id屬性 -->
<!-- 示例如下 -->
<!-- 
<bean id="customEditors" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
  <property name="customEditors">
    <map>
      <entry key="java.util.Date">
        <bean class="com.jadyer.util.UtilDatePropertyEditor">
          <property name="pattern" value="yyyy年MM月dd日"/>
        </bean>
      </entry>
    </map>
  </property>
</bean>
 -->

 

最后是使用JUnit3.8寫的單元測試類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package com.jadyer.junit;
 
import junit.framework.TestCase;
 
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
 
import com.jadyer.model.Bean11;
import com.jadyer.model.Bean22;
 
public class PropertyInjectionTest extends TestCase {
  private ApplicationContext factory;
 
  @Override
  protected void setUp() throws Exception {
    /****====讀取單一的配置文件====****/
    //factory = new ClassPathXmlApplicationContext("applicationContext.xml");
     
    /****====利用數(shù)組讀取多個配置文件====****/
    //這樣就會把兩個配置文件作為一個來使用,表面上看是作為兩個使用的
    //其實內(nèi)部是作為一個使用的,所以在多個配置文件中,里面的id不能重復(fù)
    //但是name屬性可以重復(fù),就好像人的身份證編號和名字的區(qū)別是一樣的
    //String[] configLocations = new String[]{"applicationContext.xml", "applicationContext-editor.xml"};
    //factory = new ClassPathXmlApplicationContext(configLocations);
     
    /****=====利用 * 匹配模式讀取多個配置文件====****/
    //業(yè)界流行的一句話:約定優(yōu)于配置
    //所以說當(dāng)有了一個統(tǒng)一的比較好的約定之后,就可以利用框架提供的功能,減少配置量
    //另外:如果沒有讀取到applicationContext-*.xml,此時即便存在applicationContext.xml,它也不會讀的
    factory = new ClassPathXmlApplicationContext("applicationContext-*.xml");
  }
 
  /**
   * 該方法演示的是常見屬性的注入,包括int,String,Array,list,set,map,Date的注入
   * @see 其中Date類型的注入則是借助了Spring屬性編輯器來實現(xiàn)的
   */
  public void testInjection11() {
    //Bean11 bean11 = new Bean11(); //若簡單的new,那么它的屬性是不會被注入的。注入的前提必須是從IoC容器中拿出來的,才會注入
    Bean11 bean11 = (Bean11)factory.getBean("bean11"); //此時bean11就是從IoC容器中獲取到的,所以它的依賴就會被全部注入
    System.out.println("bean11.intValue=" + bean11.getIntValue());
    System.out.println("bean11.strValue=" + bean11.getStrValue());
    System.out.println("bean11.arrayValue=" + bean11.getArrayValue());
    System.out.println("bean11.listValue=" + bean11.getListValue());
    System.out.println("bean11.setValue=" + bean11.getSetValue());
    System.out.println("bean11.mapValue=" + bean11.getMapValue());
    System.out.println("bean11.dateValue=" + bean11.getDateValue());
  }
   
  /**
   * 該方法主要演示的是將公共的配置進(jìn)行抽象,以減少配置量
   */
  public void testInjection22() {
    Bean22 bean22 = (Bean22)factory.getBean("bean22");
    System.out.println("bean22.bean33.id=" + bean22.getBean33().getId());
    System.out.println("bean22.bean33.name=" + bean22.getBean33().getName());
    System.out.println("bean22.bean33.sex=" + bean22.getBean33().getSex());
    System.out.println("bean22.bean44.id=" + bean22.getBean44().getId());
    System.out.println("bean22.bean44.name=" + bean22.getBean44().getName());
    System.out.println("bean22.bean44.sex=" + bean22.getBean44().getSex());
    System.out.println("bean22.bean44.age=" + bean22.getBean44().getAge());
    System.out.println("bean22.bean55.password=" + bean22.getBean55().getPassword());
  }
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美破处摘花 | 国产精品美女久久久久网站 | 亚洲精品一二三四 | haodiaose在线精品免费视频 | 精品国产免费第一区二区三区日韩 | 日韩视频一区二区三区 | 日本www色| 男人j放进女人的p视频免费 | 国产外围| 亚洲区视频在线观看 | 性色AV一区二区三区V视界影院 | 日韩欧美一区二区三区免费看 | 久久午夜夜伦痒痒想咳嗽P 久久无码AV亚洲精品色午夜麻豆 | 亚洲欧美激情日韩在线 | 冰山美人调教耻辱h | 欧美高清国产 | 免费观看一区二区 | 国产香蕉一区二区精品视频 | 亚洲天堂伦理 | 婷婷色在线 | 免费观看伦理片 | 天天舔天天干天天操 | 红杏劫| 亚洲 日韩经典 中文字幕 | 我和么公的秘密小说免费 | 99夜色| 精品一区二区三区五区六区 | 91精品免费国产高清在线 | 国产在线步兵一区二区三区 | 日韩精品免费一区二区三区 | 2020年国产精品午夜福利在线观看 | 免费亚洲成人 | 美女下面被cao出水 美女污视频 | 侮辱丰满美丽的人妻 | 饭冈加奈子黑人解禁在线播放 | 日韩精品中文字幕久久 | 色综合 成人| 精品视频在线免费观看 | narutotsunade全彩雏田 | www.九九热 | 沟厕okn系列在线播放 |