慢慢來(lái)比較快,虛心學(xué)技術(shù)
前言:創(chuàng)建應(yīng)用對(duì)象之間協(xié)作關(guān)系的行為通常稱為裝配( wiring )斯撮,這也是依賴注入( DI )的本質(zhì)
Spring提供三種Bean裝配機(jī)制:
- 在 XML 中進(jìn)行顯式配置。
- 在 Java 中進(jìn)行顯式配置
- 隱式的 bean 發(fā)現(xiàn)機(jī)制和自動(dòng)裝配
*原文連接:https://blog.csdn.net/Laiguanfu/article/details/88046259
本文簡(jiǎn)單講解Spring中使用xml方式進(jìn)行顯式配置裝配Bean的步驟和內(nèi)容分析
使用xml進(jìn)行Bean的裝配是Spring最原始也是持續(xù)時(shí)間最長(zhǎng)的裝配方式踊东,該配置文件使用<beans>作為根節(jié)點(diǎn),配置處于應(yīng)用內(nèi)的Bean。
一呻粹、簡(jiǎn)單使用
本文使用最簡(jiǎn)單的配置,只為記錄xml顯式裝配bean的實(shí)現(xiàn)苏研,maven引用如下(其中${org.springframework.version}可替換成任意版本):
<!--spring框架引入-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework.version}</version>
</dependency>
①編寫(xiě)基礎(chǔ)類(lèi)CDBean代碼
public class CDBean {
/**
* 定義CD名
*/
private String title;
/**
* 定義CD作者
*/
private String author;
}
②編寫(xiě)接口類(lèi)CDPlayer
public interface CDPlayer {
/**
* 定義方法播放CD
* @param
*
* @return void
*
* @author xxx 2019/2/27
* @version 1.0
**/
void playCD();
}
③編寫(xiě)接口實(shí)現(xiàn)類(lèi)等浊,同時(shí)將CDBean作為屬性通過(guò)setter方法傳入
public class CDPlayerImpl implements CDPlayer {
private CDBean cdBean;
public void setCDBean(CDBean cdBean){
this.cdBean = cdBean;
}
@Override
public void playCD() {
System.out.println("正在播放:"+cdBean.getTitle()+" by "+cdBean.getAuthor());
}
}
④創(chuàng)建XML配置文件application.xml(命名隨意)
注:IDEA中可以選擇使用默認(rèn)的File菜單快速創(chuàng)建Spring默認(rèn)簡(jiǎn)單格式的配置文件
得到簡(jiǎn)單格式的xml文件如下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
⑤使用<bean>節(jié)點(diǎn)配置CDBean并使用<peroperty>節(jié)點(diǎn)進(jìn)行屬性默認(rèn)值注入
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--定義一個(gè)名為cdBean的Bean-->
<bean name="cdBean" class="com.my.spring.bean.CDBean">
<!--默認(rèn)值注入-->
<property name="title" value="The World!!"/>
<property name="author" value="Mr.D"/>
</bean>
</beans>
⑥ 用<bean>節(jié)點(diǎn)配置CDPlayer并使用<peroperty>節(jié)點(diǎn)進(jìn)行屬性默認(rèn)值注入
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean name="cdBean" class="com.my.spring.bean.CDBean">
<property name="title" value="The World!!"/>
<property name="author" value="Mr.D"/>
</bean>
<bean name="cdPlayer" class="com.my.spring.service.impl.CDPlayerImpl">
<!--將上面配置的cdBean類(lèi)通過(guò)ref屬性注入到cdPlayer中名為cdBean的屬性中-->
<property name="cdBean" ref="cdBean"/>
</bean>
</beans>
⑦通過(guò)上一篇文章提及的獲取配置文件應(yīng)用上下文ClassPathXmlApplicationContext中獲取目標(biāo)bean并進(jìn)行測(cè)試
public class App
{
public static void main(String[] args) {
/**
* 從根目錄的application.xml文件中構(gòu)建應(yīng)用上下文
*/
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/application.xml");
/**
*從應(yīng)用上下文中獲取所有bean的類(lèi)名
*/
String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
for (String className : beanDefinitionNames){
System.out.println(className);
}
/**
* 從應(yīng)用上下文中提取目標(biāo)實(shí)體
*/
CDPlayer cdPlayer = applicationContext.getBean(CDPlayer.class);
/**
* 執(zhí)行方法進(jìn)行測(cè)試
*/
cdPlayer.playCD();
}
}
⑧測(cè)試結(jié)果,cdBean和cdPlayer成功裝配摹蘑,且cdBean默認(rèn)屬性注入和cdPlayer的cdBean屬性依賴注入成功
cdBean
cdPlayer
正在播放:The World!! by Mr.D
二筹燕、xml文件分析
節(jié)點(diǎn)<bean>:裝配Bean的根本性節(jié)點(diǎn)
|======屬性 class -------注明當(dāng)前裝配的Bean的class類(lèi)型
|======屬性 id -------為當(dāng)前裝配的Bean添加一個(gè)唯一性標(biāo)識(shí)
|======屬性 name-------為當(dāng)前裝配的Bean添加一個(gè)別名,可等同id
|======屬性 parent -------指定當(dāng)前裝配的Bean的父類(lèi)在xml文件中對(duì)應(yīng)的name/id
<bean id = "bean1" name = "alis1" class = "com.xxx.類(lèi)名" parean = "beanParent"></bean>
|======子節(jié)點(diǎn) <property>: 為bean注入屬性操作而服務(wù)
|===========屬性 name ------對(duì)應(yīng)于Bean實(shí)體中的屬性名稱
|===========屬性 value ------name指定屬性的默認(rèn)字面量值
|===========屬性 **ref **-------name指定屬性同樣是一個(gè)被裝配的類(lèi)衅鹿,ref的值是目標(biāo)Bean的id
<bean id = "bean2" name = "alis2" class = "com.xxx.類(lèi)名">
<property name = "p" value = "testProperty">
<property name = "q" ref = "bean1">
</bean>
|======子節(jié)點(diǎn) <constructor-arg>: 從bean的構(gòu)造函數(shù)中注入?yún)?shù)(以下)
|===========屬性 name ------對(duì)應(yīng)于構(gòu)造函數(shù)中的參數(shù)名稱
|===========屬性 value ------name指定參數(shù)的默認(rèn)字面量值
|===========屬性 ref -------name指定參數(shù)同樣是一個(gè)被裝配的類(lèi)撒踪,ref的值是目標(biāo)Bean的id
|===========屬性 index ------指定當(dāng)前參數(shù)在構(gòu)造函數(shù)中的下標(biāo)
|===========屬性 type ------指定目標(biāo)參數(shù)的類(lèi)型
<bean id = "bean3" name = "alis3" class = "com.xxx.類(lèi)名">
<constructor-arg name = "param1" value = "value1"/>
<constructor-arg index = 1 value = "value2"/>
<constructor-arg index = 2 ref = "bean2"/>
<constructor-arg type = "com.xxx.類(lèi)名" ref = "value2"/>
</bean>
三、屬性注入
① 簡(jiǎn)單示例里面的注入方式塘安,實(shí)際上使用的是bean里面的setter方法注入糠涛,要求對(duì)應(yīng)屬性在bean中必須存在setter方法,否則無(wú)法注入
② 使用構(gòu)造器注入
public class CDPlayerImpl implements CDPlayer {
private CDBean cdBean;
public CDPlayerImpl() {
super();
}
public CDPlayerImpl(CDBean cdBean) {
super();
this.cdBean = cdBean;
}
}
xml配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--定義一個(gè)名為cdBean的Bean-->
<bean name="cdBean" class="com.my.spring.bean.CDBean">
<!--默認(rèn)值注入-->
<property name="title" value="The World!!"/>
<property name="author" value="Mr.D"/>
</bean>
<bean name="cdPlayer" class="com.my.spring.service.impl.CDPlayerImpl">
<!--將上面配置的cdBean類(lèi)通過(guò)ref屬性注入到cdPlayer構(gòu)造方法中名為cdBean的參數(shù)中-->
<constructor-arg name = "cdBean" ref = "cdBean"/>
</bean>
</beans>
③ 注入列表參數(shù)
此處涉及到<list>和<set>節(jié)點(diǎn)兼犯,用于注入列表或者數(shù)組
假設(shè)CDPlayerImpl類(lèi)中有屬性cdBeans
public class CDPlayerImpl implements CDPlayer {
private List<CDBean> cDBeans;
public void setCDBeans(List<CDBean> cDBeans){
this.cDBeans = cDBeans;
}
}
xml配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--定義一個(gè)名為cdBean1的Bean-->
<bean name="cdBean1" class="com.my.spring.bean.CDBean">
<!--默認(rèn)值注入-->
<property name="title" value="One"/>
<property name="author" value="Mr.D"/>
</bean>
<!--定義一個(gè)名為cdBean2的Bean-->
<bean name="cdBean2" class="com.my.spring.bean.CDBean">
<!--默認(rèn)值注入-->
<property name="title" value="Two"/>
<property name="author" value="Mr.D"/>
</bean>
<bean name="cdPlayer" class="com.my.spring.service.impl.CDPlayerImpl">
<property name="cDBeans">
<list>
<ref bean = "cdBean1">
<ref bean = "cdBean2">
</list>
</property>
</bean>
</beans>
注:無(wú)論類(lèi)中使用的是list還是使用set或者數(shù)組作為屬性忍捡,xml中都可以使用list或set進(jìn)行注入
四、小結(jié)
1.spring依靠xml文件進(jìn)行顯式裝配切黔,xml文件的根節(jié)點(diǎn)是<beans>,包含多個(gè)<bean>節(jié)點(diǎn)
2.xml文件中每個(gè)bean節(jié)點(diǎn)可以指定對(duì)應(yīng)組件的類(lèi)型砸脊,名稱
3.xml文件中,通過(guò)bean的property子節(jié)點(diǎn)實(shí)現(xiàn)屬性初始化或依賴注入
4.xml文件中纬霞,通過(guò)bean的constructor-arg子節(jié)點(diǎn)實(shí)現(xiàn)構(gòu)造器參數(shù)初始化或依賴注入
5.xml文件中凌埂,通過(guò)property或constructor-arg的子節(jié)點(diǎn)<list>或<set>實(shí)現(xiàn)列表的注入
6.所有通過(guò)xml顯式配置的bean,在代碼中通過(guò)上一篇文章所描述的應(yīng)用上下文實(shí)現(xiàn)ClassPathXmlApplicationContext從容器中獲取實(shí)體
參考文檔:
【1】《Spring 實(shí)戰(zhàn)(第 4 版)》·Craig Walls