首先胰丁,加載bean需要先寫好配置文件(其實用注解也可以,只是不方便理解)
配置
<beans>
<!--導(dǎo)入其他資源XML-->
<import resource=”resource1.xml”/>
<!--Bean定義曲尸,class定義Bean的實現(xiàn)類雀费,id稱為標(biāo)識符,其余id為別名-->
<bean id=”bean1”class=””></bean>
<bean id=”bean2”class=””></bean>
<!--指定name忿磅,這樣name就是“標(biāo)識符”-->
<bean name=”bean2”class=””></bean>
<!--alias為bean指定別名-->
<alias alias="bean3" name="bean2"/>
<!--導(dǎo)入其他依賴-->
<import resource=”resource2.xml”/>
</beans>
多個配置文件是可以編制成數(shù)組糯彬,交給ApplicationContext加載的。
但是大家現(xiàn)在用習(xí)慣了注解
SpringMVC的IoC容器中葱她,管理的bean 內(nèi)部表示為BeanDefinition
一個bean需要以下屬性
- 全限定類名(FQN):用于定義Bean的實現(xiàn)類;
- Bean行為定義:這些定義了Bean在容器中的行為撩扒;包括作用域(單例、原型創(chuàng)建)吨些、是否惰性初始化及生命周期等搓谆;
- Bean創(chuàng)建方式定義:說明是通過構(gòu)造器還是工廠方法創(chuàng)建Bean;
- Bean之間關(guān)系定義:即對其他bean的引用豪墅,也就是依賴關(guān)系定義泉手,這些引用bean也可以稱之為同事bean 或依賴bean,也就是依賴注入但校。
bean使用時必須有一個唯一的指定:
id必須唯一不可重復(fù)螃诅,一個bean可以有多個id,其余的id是別名状囱;
沒有id可以用唯一不重復(fù)的name术裸,若有需要可以使用alias來指定別名,或者用,
隔開亭枷;
同時指定id和name袭艺,id就是標(biāo)識符,而name就是別名叨粘,總之必須在IoC容器中唯一猾编;
若id和name都沒有指定,則bean在使用的時候會使用全限定的類名進(jìn)行注入升敲。
實例化
SpringMVC是通過反射來實例化bean的答倡。
1.通過構(gòu)造器實例化bean:
Spring IoC容器即能使用默認(rèn)空構(gòu)造器也能使用有參數(shù)構(gòu)造器兩種方式創(chuàng)建Bean,無參數(shù)的直接在XML文件中直接定義bean節(jié)點驴党,帶參數(shù)的可以在XML文件中bean節(jié)點下增加constructor-arg
參數(shù)屬性:
<bean name="test" class="com.zing.test.HelloMvc">
<!-- 指定構(gòu)造器參數(shù) -->
<constructor-arg index="0" value="第一個參數(shù)"/>
</bean>
index是參數(shù)所在的位置瘪撇,value表示注入常量值,也可以指定引用,指定引用使用ref來引用另一個Bean定義倔既,當(dāng)然注入還可以根據(jù)參數(shù)類型和名字來配置
<!-- 根據(jù)變量名注入 -->
<constructor-arg name="testIoC" value="第一個參數(shù)"/>
<!-- 根據(jù)參數(shù)類型注入-->
<constructor-arg type="java.lang.String" value="第一個參數(shù)"/>
<!--構(gòu)造器里注入另一個bean-->
<!-- 通過構(gòu)造器注入 -->
<bean id="helloApi" class="com.zing.test.NormalBean"/>
<bean id="bean2" class="com.zing.test.TestProperty">
<property name="helloApi"><ref bean=" helloApi"/></property>
</bean>
2.使用靜態(tài)工廠來實例化bean
需要編寫工廠方法恕曲,這樣實例化的時候即可使用工廠方法來實例化bean
package com.zing.test.factory_test;
import com.zing.test.hello.HelloImpl;
//工廠類
public class HelloIoCFactory {
public static HelloImpl newInstance(String name) {
System.out.println(name);
return new HelloImpl(name);
}
}
第一種工廠配置
<!--為bean配置工廠方法-->
<bean class="com.zing.test.factory_test.HelloIoCFactory" id="helloIoC" factory-method="newInstance">
<constructor-arg index="0" value="哈哈"/>
</bean>
第二種工廠配置
<bean id="instanceFactory" class="com.zing.test.factory_test.HelloIoCFactory"/>
<bean id="byIndex" factory-bean="instanceFactory" factory-method="newInstance">
<constructor-arg index="0" value="Hello World!"/>
<constructor-arg index="1" value="1"/>
</bean>
//通過工廠獲取實例
BeanFactory beanFactory = new ClassPathXmlApplicationContext("spring-config.xml");
HelloInterface hello = beanFactory.getBean("helloIoC",HelloImpl.class);
hello.sayHello();
3.通過setter方法進(jìn)行注入
個人覺得:有必要嗎?都是用注解的好不好渤涌,就列一下佩谣,不詳細(xì)記錄了
<!-- 通過setter方式進(jìn)行依賴注入 -->
<bean id="bean" class="com.zing.test.factory_test.HelloImpl4">
<property name="message" value="Hello World!"/>
<property name="index">
<value>1</value>
</property>
</bean>
4.延時實例化
延時初始化又叫惰性初始化,作用是消除資源占用巨大的bean在程序初始化時的影響实蓬,防止因為這個bean茸俭,導(dǎo)致啟動緩慢。延遲初始化的Bean通常會在第一次使用時被初始化瞳秽;
配置如下:
<!-- 通過配置lazy-init="true"實現(xiàn)惰性初始化 -->
<bean id="helloApi" class="com.zing.test.HelloImpl" lazy-init="true"/>
自動裝配
自動裝配就是指由Spring來自動地注入依賴對象瓣履,無需人工參與率翅。
目前Spring3.0支持no
练俐、byName
、byType
冕臭、constructor
四種自動裝配腺晾,默認(rèn)是“no”指不支持自動裝配的,其中Spring3.0已不推薦使用之前版本的autodetect
自動裝配辜贵,推薦使用Java 5+支持的(@Autowired
)注解方式代替悯蝉;
<bean id="helloApi" class="com.zing.test.HelloImpl"/>
<bean id="bean" class="com.zing.test.bean.HelloApiDecorator" autowire="byName"/>
-
byName
使用setter方法根據(jù)參數(shù)名稱注入 - 根據(jù)類型注入,在根據(jù)類型注入時托慨,將把當(dāng)前自己排除在外鼻由!如果是
List
,Map
這樣的類型厚棵,用autowire-candidate
屬性為false
來讓指定的Bean
放棄作為自動裝配的候選者蕉世。使用primary
屬性為true
來指定某個Bean
為首選Bean
-
constructor
構(gòu)造器注入,只用在構(gòu)造器中婆硬。 autodetect
自動匹配狠轻,不推薦使用!
不是所有的類型都支持自動匹配彬犯,
Object
向楼、基本數(shù)據(jù)類型(Date、CharSequence谐区、Number湖蜕、URI、URL宋列、Class昭抒、int
不支持
<bean>
標(biāo)簽的autowire-candidate屬性可被設(shè)為false,這個bean將不能作為可依賴注入的參數(shù)
數(shù)組類型、集合(Set戈鲁、Collection仇参、List
)接口類型:將根據(jù)泛型獲取匹配的所有候選者并注入到數(shù)組或集合中
字典(Map)接口類型:同樣根據(jù)泛型信息注入,鍵必須為String
類型的Bean
名字婆殿,值根據(jù)泛型信息獲取
缺點
如果你用的是自動裝配的話诈乒,出了問題會比較難找。不知道是哪里注入進(jìn)來的婆芦,唉怕磨,這就是我等菜比為什么要先從配置開始看。現(xiàn)在流行用注解消约,會好不少肠鲫。
依賴檢查
用于檢查Bean定義的屬性都注入數(shù)據(jù)了,不管是自動裝配的還是配置方式注入的都能檢查或粮,如果沒有注入數(shù)據(jù)將報錯导饲,從而提前發(fā)現(xiàn)注入錯誤,只檢查具有setter方法的屬性氯材。
對于注解來說沒什么用渣锦,簡單介紹一下
<bean id="test"/>
<!-- 注意我們沒有注入,所以測試時會報錯 -->
<bean id="bean" dependency-check="objects">
<property name="message" value="Haha"/>
</bean>
dependency-check
配置檢查類型氢哮,一共有4種:null袋毙,object,simple冗尤,all
null=不檢查听盖,為默認(rèn)配置。
object=檢查除基本類型外的依賴對象裂七。
simple=對基本類型進(jìn)行依賴檢查皆看,包括數(shù)組類型,其他依賴不報錯碍讯;
all=所有類型都檢查