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容器 然後從容器中獲取對應的組件