Spring 基礎入門-day02

day01的練習

需要使用枚舉類型,限制suit的 賦值只能爲四種花色。

//Suit.java 枚舉類型
public enum Suit {
	黑桃,紅桃,梅花,方片
}

在Card.java封裝類的無參構造方法中設置參數時只能使用Suit.花色的方式賦值或null,其它非枚舉內的值都不能賦值。

配置文件和測試文件參照day01的寫法完成。

1.什麼是DI???

     Dependence   Injection   依賴注入

     解決的是組件之間的裝配問題,把合適值推到合適的位置

2.實現依賴注入的方式

        2.1setter注入--->相當於給對象賦值

                      參考是這個對象對應的類型中的set方法。 成員變量+get方法+set方法=屬性

                 準則是把set去掉 然後首字母小寫。

                 注意:簡單值(String 枚舉 八種基本類型 基本類型封裝類) 可以使用value直接賦值。

<bean id="card" class="com.xdl.bean.Card">
	<property name="point" value="A"></property>
        <property name="suit" value="梅花"></property>
</bean>

               或者在無參構造方法中調用枚舉,傳參。(優先級沒有在配置文件的屬性標籤賦值的有優先級高)         

public Card() {
		super();
		this.suit = Suit.梅花;
}

                測試類運行結果:Card [suit=梅花, point=A]

               複雜值 需要使用ref="容器中組件的id" 來進行賦值

<bean id="card" class="com.xdl.bean.Card">
		<property name="point" value="A"></property>
		<property name="suit" value="黑桃"></property>
</bean>
<bean id="player" class="com.xdl.bean.Player">
		<property name="id" value="1"></property>
		<property name="name" value="發哥"></property>
		<property name="age" value="55"></property>
		<property name="money" value="1"></property>
		<property name="card" ref="card"></property>
</bean>

          2.2 構造器注入

          參考類型中對應的構造方法

         配置文件中 只要把property改成constructor-arg即可,可以寫name="變量名" 或 index="下標(從0開始)"與有參構造順序一一對應的方式給值。

其它規則與上面相同。給card賦值。

	<bean id="card2" class="com.xdl.bean.Card">
		<constructor-arg index="0" value="方片"></constructor-arg>
		<constructor-arg index="1" value="K"></constructor-arg>
	</bean>

                                 給player賦值。複雜值 需要使用ref="容器中組件的id" 來進行賦值。

<bean id="player2" class="com.xdl.bean.Player">
		<constructor-arg name="id" value="2"></constructor-arg>
		<constructor-arg name="name" value="陳小刀"></constructor-arg>
		<constructor-arg name="age" value="35"></constructor-arg>
		<constructor-arg name="money" value="153"></constructor-arg>
		<constructor-arg name="card" ref="card2"></constructor-arg>
</bean>

          2.3自動化注入(一般只支持複雜值)

         在bean 標籤中 加一個屬性 autowire="對應的取值"

         對應的取值 有 no 這是默認的 代表不自動化注入

         byName 按照名字進行自動注入 參考的是set方法

         byType   按照成員變量對應的類型  如果類型匹配則自動化注入

         constructor     這是參考構造方法進行自動化注入 直接對參數進行

                                類型的匹配當有兩個相同類型的時候程序崩潰

例子:使用byName 前提是Player.java中有一個setCard方法。

<bean id="card" class="com.xdl.bean.Card">
		<constructor-arg index="0" value="方片"></constructor-arg>
		<constructor-arg index="1" value="K"></constructor-arg>
</bean>
<bean id="player2" class="com.xdl.bean.Player" autowire="byName">  <!-- 或者使用byType-->
		<property name="id" value="1"></property>
		<property name="name" value="發哥"></property>
		<property name="age" value="55"></property>
		<property name="money" value="1"></property>
</bean>

例子:使用constructor 

<bean id="card" class="com.xdl.bean.Card">
		<constructor-arg index="0" value="方片"></constructor-arg>
		<constructor-arg index="1" value="K"></constructor-arg>
</bean>
<bean id="player3" class="com.xdl.bean.Player" autowire="constructor">
		<constructor-arg name="id" value="2"></constructor-arg>
		<constructor-arg name="name" value="陳小刀"></constructor-arg>
		<constructor-arg name="age" value="35"></constructor-arg>
		<constructor-arg name="money" value="153"></constructor-arg>
</bean>

3.參數注入

          3.1 簡單值和複雜值的注入

                做一個案例  構建一個數據源對象也叫連接池對象。就是使用db.properties文件中的數據連接到Oracle數據庫。

<!-- 配置文件中配置-->	
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName" value="oracle.jdbc.OracleDriver"></property>
		<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:MLDN"></property>
		<property name="username" value="system"></property>
		<property name="password" value="123456"></property>
</bean>
//測試類
public static void main(String[] args) throws Exception {
		ApplicationContext app = 
				new ClassPathXmlApplicationContext("applicationContext.xml");
		DataSource dataSource = app.getBean("dataSource",DataSource.class);
		System.out.println(dataSource.getConnection());
}

       3.2 集合參數的注入

           如果java類中的成員變量 或者 set方法的參數是一個集合類型 

           那Spring配置文件 有對應的標記可以給集合類型參數注入值

           list列表中數據可以重複,set列表中數據不能重複(自動去重)根據自己的需求選擇合適的列表

           但是要注意的是list列表對應封裝類中的私有成員變量也爲list。set類型的對應的成員變量也爲set類型的

<bean id="msgBean" class="com.xdl.bean.MsgBean">
		<property name="title" value="王者榮耀"></property>
		<property name="length" value="190"></property>
		<property name="friends">
			<list>
				<value>李偉傑</value>
				<value>朱亞孟</value>
				<value>桓曉曼</value>
				<value>朱亞孟</value>
			</list>
		</property>
		<property name="friends2">
			<set>
				<value>李偉傑</value>
				<value>朱亞孟</value>
				<value>桓曉曼</value>
				<value>朱亞孟</value>
			</set>
		</property>
	</bean>

 

//測試類
public static void main(String[] args) {
		ApplicationContext app = 
				new ClassPathXmlApplicationContext("applicationContext.xml");
		MsgBean  msgBean = app.getBean("msgBean",MsgBean.class);
		System.out.println(msgBean+":"+msgBean.getFriends2());
}
//測試結果
MsgBean [title=王者榮耀, length=190, friends=[小喬, 大喬, 王昭君, 大喬]]:[小喬, 大喬, 王昭]

         

<!-- 配置map 和property的死格式-->
</property>
			<property name="phones">
			<map>
				<entry key="1303798456" value="小李"></entry>
				<entry key="1303789789" value="小裏"></entry>
				<entry key="1303798458" value="小離"></entry>
			</map>
		</property>
<property name="phones2">
			<props>
				<prop key="1565465465">小朱</prop>
				<prop key="1565465464">小曼</prop>
			</props>
</property>

 

//測試用例
public static void main(String[] args) {
		ApplicationContext app = 
				new ClassPathXmlApplicationContext("applicationContext.xml");
		MsgBean  msgBean = app.getBean("msgBean",MsgBean.class);
		System.out.println(msgBean+":"+msgBean.getFriends2()+":"+msgBean.getPhones()+":"+msgBean.getPhones2());
}

四種配置xml文件的格式

List    -------  <list>
                       <value>值</value>
                   </list>   
   
  Set      ------- <set>
                       <value>值</value>
                   </set>  

  Map     --------- <map>
                       <entry  key=""  value="" /> 
                    </map>   
  Properties  ------<props>
                       <prop  key="">值</prop>  
                    </props>   

       3.3集合的單獨定義(集合數據)

<util:list id="">

                <values></values>.....

</util:list>

 Set  還有 Map  和上面類似  只有 Properties特殊
 <util:properties id="" >
           <prop  key=""> 值 </prop>
 </util:properties>     

需要賦值相同的集合數據的時候,可以使用。用法:在標籤中加入ref="id"

        3.4其實Properties 單獨定義時 可以加載一個. properties配置文件

     <!--  Properties 集合單獨定義 並關聯一個db.properties 文件  -->
    <util:properties  id="ref_db"  location="classpath:db.properties">//類文件下文件夾下找
    </util:properties>

 

 4 Spring EL 表達式

只要把 EL表達式中的 $  換成 #      就可以把一個對象對用的屬性取出來。在容器中取!

<bean id="player" class="com.xdl.bean.Player">
        <properry name="name" value="system"></property>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName" value="oracle.jdbc.OracleDriver"></property>
		<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:MLDN"></property>
		<property name="username">
               <value>#{player.name}</value>
        </property>
		<property name="password" value="123456"></property>
</bean>

5  組件掃描

         5.1 什麼是組件掃描

             Spring框架提供的一套基於標註(註解)的技術,是爲了簡化XML編寫繁瑣問題的技術。

        5.2如何實現組件掃描

             a.建立一個項目 導入jar包(ioc aop)拷貝配置文件到src下            

             b.在Spring容器對應的配置文件中 開啓文件掃面

                    <context:component-scan   base-package="包名" />

              c.建立一個類 

                     在類上加對應的標註

                @Component 通用層標註

                 @Repository 持久層標註 DAO   dao類的實現Impl類

                 @Service 服務層標註 業務層標註

                 @Controller  控制層標註

             d.構建一個Spring容器 然後從容器中獲取對應的組件

 

            

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章