參考資料:<<Spring源碼深度解析>>
一蔫缸、給容器注冊(cè)組件的三種方式:
- xml包掃描+@Component/@Controller/@Service/@Repository
- 配置@Bean,可以對(duì)第三放jar進(jìn)行注入
- @Import 方式注入
- 使用Spring提供的FactoryBean(工廠(chǎng)bean)
1.默認(rèn)獲取到的是工廠(chǎng)bean調(diào)用 getObject 創(chuàng)建的對(duì)象
2.要獲取工廠(chǎng)bean本身独旷,需要給 id 前加一個(gè) " & " 標(biāo)識(shí)
二匣椰、 注解使用
1龙致、配置文件注解@Configuration/@Bean:
- 創(chuàng)建一個(gè)類(lèi)绩脆,用@Configuration,可以將該類(lèi)注冊(cè)為配置類(lèi)暇藏,等同于原來(lái)的.xml配置文件蜜笤。
-
在配置類(lèi)中可以填充實(shí)體bean,創(chuàng)建一個(gè)返回值為實(shí)體bean的方法盐碱,并在方法體上用@Bean注解把兔,其中方法名稱(chēng)為bean的默認(rèn)id。
-
在main()函數(shù)中如何調(diào)用瓮顽,使用AnnotationConfigApplicationContext县好,將配置類(lèi)傳入調(diào)用。
2暖混、包掃描注解@ComponentScan以及包掃描規(guī)則
- 當(dāng)添加了@ComponentScan注解后缕贡,
@Controller
@Service
@Compnent
@Repository
以上標(biāo)簽均可以在創(chuàng)建的相應(yīng)類(lèi)上使用
-
在配置類(lèi)上添加@ComponentScan注解,并定義需要掃描的包路徑拣播,如下圖:
-
指定需要掃描或者排除的組件
- FilterType 指定規(guī)則
FilterType.ANNOTATION :指定過(guò)濾注解的組件
FilterType.ASSIGNABLE_TYPE:按照指定的類(lèi)型
FilterType.CUSTOM:自定義過(guò)濾規(guī)則晾咪,需要實(shí)現(xiàn) TypeFilter 接口
3、@Scope注解的使用
- Spring默認(rèn)添加的組件都是單實(shí)例的
- 可以使用@Scope()注解诫尽,為注入的bean提供作用域的范圍:
session:同一次session創(chuàng)建一個(gè)實(shí)例
request:同一個(gè)請(qǐng)求創(chuàng)建一個(gè)實(shí)例
prototype:多實(shí)例禀酱,ioc容器啟動(dòng)時(shí)候不會(huì)調(diào)用方法創(chuàng)建創(chuàng)建對(duì)象炬守,而是在
每次獲取的時(shí)候才會(huì)調(diào)用方法創(chuàng)建對(duì)象
singleton:?jiǎn)螌?shí)例牧嫉,ioc容器啟動(dòng)的時(shí)候就會(huì)調(diào)用方法創(chuàng)建對(duì)象放入ioc容器中,以后每次獲取就直接從容器中拿
4减途、@Lazy懶加載
- 單實(shí)例bean酣藻,默認(rèn)容器啟動(dòng)的時(shí)候就創(chuàng)建對(duì)象,
-
懶加載指的是鳍置,容器啟動(dòng)不創(chuàng)建對(duì)象,在第一次使用(獲攘删纭)bean的時(shí)候,再去創(chuàng)建對(duì)象税产,并進(jìn)行初始化
5怕轿、 @Conditional 按照條件給容器中注冊(cè)bean
- 按照一定的條件進(jìn)行判斷,滿(mǎn)足條件給容器注冊(cè)bean
-
獲取環(huán)境變量:os.name --> 操作系統(tǒng) 的key
-
創(chuàng)建Conditional的實(shí)現(xiàn)類(lèi)
-
在實(shí)體bean前添加@Conditional注解辟拷,滿(mǎn)足條件后撞羽,才能進(jìn)行注入
6、@Import:快速的導(dǎo)入組件,id默認(rèn)是組件的全類(lèi)名
-
直接在配置類(lèi)上添加@Import(xxx.class)衫冻,id默認(rèn)是組件的全類(lèi)名(使用spring4.0.0版本該注解調(diào)用有誤诀紊,切換成4.3.12)
-
實(shí)現(xiàn) ImportSelector 接口,返回需要導(dǎo)入的組件的全類(lèi)名數(shù)組
-
實(shí)現(xiàn) ImportBeanDefinitionRegistrar 接口隅俘,手動(dòng)注冊(cè)bean到容器中
7邻奠、FactoryBean工廠(chǎng)bean注入spring容器中
- 實(shí)現(xiàn) FactoryBean 接口笤喳,用戶(hù)可定制化bean的邏輯
T getObject() 方法,返回由FactoryBean創(chuàng)建的bean實(shí)例碌宴,如果isSingleton()返回true杀狡,則該實(shí)例會(huì)放到Spring容器中單實(shí)例緩存池中;
boolean isSingleton():返回由BeanFactory創(chuàng)建的bean的作用域是singleton還是prototype贰镣;
Class<T> getObjectType():返回由FactotyBean創(chuàng)建的bean的類(lèi)型捣卤。
-
要獲取工廠(chǎng)bean本身,需要給id前加一個(gè) '&' 標(biāo)識(shí)
- BeanFactory 與 FactoryBean的區(qū)別