1,spring ioc的總體流程,xml配置java
步驟編號 | 完成的工做 |
1 | spring容器讀取配置文件,解析稱註冊表 |
2 | 根據註冊表,找到相應的bean實現類實例化bean |
3 | 把實例化以後的bean放到spring容器中 |
4 | spring開放準備好的bean供程序使用 |
配置方法:web
常見的自定義命名空間:spring
增長自定義的命名空間很easy,若是所示,獨家祕籍····數據庫
簡稱 | 說明 |
beans | 配置bean |
aop | aop的配置 |
tx | 聲明式事物 |
mvc | mvc的配置 |
util | 簡化某些標準配置 |
jee | java EE的EJB,jndi |
jdbc | 配置數據庫提供的schema |
jms | jms配置 |
lang | 支持Jruby,Groovy的配置 |
oxm | xml映射的配置 |
task | 任務調度的配置 |
tool | 有用工具定義的配置 |
2,依賴注入,注入參數,方法注入緩存
通常配置bean指定id,name不推薦使用;ruby
依賴注入主要有兩種,即屬性注入和構造函數注入,工廠方法注入,具體選擇視實際狀況來;session
屬性注入:在xml中的bean節點中,經過<property name="xxx" value="xxx"/> 屬性設置方法的前兩個字符要所有大寫或者小寫;mvc
構造函數注入:在xml中的bean節點中,經過<constructor-arg index="n" type="XXX" value="XXX"/>,對於構造函數的循環依賴,把其中一個改形成屬性注入便可解決;函數
工廠方法注入:經過屬性 factory-bean factory-method指定工具
注入參數:
字面值直接使用<value>來指定,特殊字符&xxx;來解決;好比大於 < 小於 > 連字符 & 單引號 '雙引號 "
引用<ref bean="xxx"/> 引用存在於本配置文件或者父配置文件中;
內部引用可直接定義bean
特殊的null值經過<null>來指定
支持級聯的屬性賦值;
集合類型支持到List,Set,Map,Properties
強類型同map
集合還可經過 merge 屬性指定合併,可經過util命名空間來簡化集合配置,使用p空間來簡化屬性配置;
自動裝配:在bean中指定 autowire 類型能夠是 byName,byType,constructor,autodetect,不推薦自動裝配
方法注入:
lookup,通常用在單例的屬性是原型的實例,視狀況須要是否引入CGLib依賴
<replace-method name="方法名" replacer="替換接口實現類"> 能夠替換方法,接口是MethodReplacer;
3,bean之間的關係
bean之間的關係分三類,分別是繼承,依賴,引用
繼承經過在父bean中加個 abstract屬性,子bean中加一個parent屬性;
依賴經過增長屬性 depends-on="xxx"
引用經過<idref bean="xxx">
4,整合配置文件,bean的做用域,FactoryBean
經過在主配置文件中增長<import resource="classpath:XXXX"/> 來整合
bean的做用域,若是是web應用,除了singleton和prototype以外還有request,session,globalSession
singleton是單例無狀態的,spring的dao均可以採用單例的模式,spring放在了容器的緩存池裏面;
prototype每次都會實例化一個對象;
要在web環境下使用其它的三種做用域,須要在web.xml中配置一個RequestContextListener;
若是單例的或者原型的實例依賴web做用域的某個實例,在web做用的bean裏面增長<aop:scoped-proxy/>
若是實例化比較複雜,可使用FactoryBean來定義實例;
5,基於註解的配置
四類註解來標識bean
@Component 標識通常的bean
@Repository 標識dao
@Service 標識service
@Controller 標識控制層
配置掃描:<context:compnent-scan base-package="xxx" resource-patter="xxx"> 它的過濾方式有多種,annotation,assignable,aspectj,regex,custom;
自動注入:
@Autowired 有required屬性標識缺失是否報錯,Qualifier標識名稱;可對屬性和方法進行標註;
其它的好比:@Inject @Resource功能同樣,可是功能沒它強大,可忽略;
生命週期的支持:經過@PostConstruct 來定義init-method ,經過@PreDestroy來定義 destroy-method
@Scope來定義做用域
@Value來引用其它的bean的屬性
@Lazyl來定義是否延遲加載
6,基於java類的配置
這裏省略,用的很少;
7,小結
最經常使用的是採用xml配置第三方的bean工具,本應用開發採用註解來配置;