spring筆記6 spring IOC的中級知識
1,spring ioc的整體流程,xml配置

| 步驟編號 | 完成的工作 |
| 1 | spring容器讀取配置文件,解析稱注冊表 |
| 2 | 根據注冊表,找到相應的bean實現類實例化bean |
| 3 | 把實例化之后的bean放到spring容器中 |
| 4 | spring開放準備好的bean供程序使用 |
配置方法:

常見的自定義命名空間:
增加自定義的命名空間很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不推薦使用;
依賴注入主要有兩種,即屬性注入和構造函數注入,工廠方法注入,具體選擇視實際情況來;
屬性注入:在xml中的bean節點中,通過<property name="xxx" value="xxx"/> 屬性設置方法的前兩個字符要全部大寫或者小寫;
構造函數注入:在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工具,本應用開發采用注解來配置;

浙公網安備 33010602011771號