怎么把想要的bean(而要注入的bean包括自己項(xiàng)目中的娇妓、第三方的)注冊(cè)到spring容器像鸡,讓spring替我們管理這些bean呢?
總結(jié)起來(lái)有四大方式:
一哈恰、通過(guò)包掃描特定注解的方式
二只估、@Import 注解
三、@Bean 注解
四着绷、FactoryBean 接口
一仅乓、通過(guò)包掃描特定注解的方式
特定注解包括:@Controller、@Service蓬戚、@Component夸楣、@Repository。
結(jié)合@ComponentScan注解配置相應(yīng)的路徑即可將需要的bean注入容器子漩。
這個(gè)之前寫(xiě)過(guò)一篇詳細(xì)的文章豫喧,詳情見(jiàn):@ComponentScan配置老掃描不到Bean,這下徹底搞懂幢泼!
二紧显、@Import注解
@Import注解注入bean有三種方式:
1.@Import(要注入的bean的class對(duì)象),生成的bean的id默認(rèn)是這個(gè)類(lèi)的全類(lèi)名
2.@Import(ImportSelector實(shí)現(xiàn)類(lèi)的class對(duì)象)缕棵,導(dǎo)入的組件全類(lèi)名數(shù)組
3.@Import(ImportBeanDefinitionRegistrar實(shí)現(xiàn)類(lèi)的class對(duì)象)孵班,手動(dòng)注冊(cè)需要的bean到容器
比如,我們要導(dǎo)入A招驴、B篙程、C、D别厘、E幾個(gè)類(lèi):
2.1? @Import(要注入的bean的class對(duì)象)
可以看到A虱饿、B兩個(gè)類(lèi)已經(jīng)注入容器,且id為全類(lèi)名。
2.2 @Import(ImportSelector實(shí)現(xiàn)類(lèi)的class對(duì)象)
可以看到C氮发、D兩個(gè)類(lèi)是通過(guò) ImportSelector 接口的實(shí)現(xiàn)類(lèi) MyImportSelector 注入的渴肉。
AnnotationMetadata :@import注解所在類(lèi)的所有注解信息。這里我們也打印了一下爽冕,正好就是 ImportTestConfig02 上面的兩個(gè)注解:
2.3 @Import(ImportBeanDefinitionRegistrar實(shí)現(xiàn)類(lèi)的class對(duì)象)
可以看到仇祭,E這個(gè)類(lèi)型的bean是通過(guò) ImportBeanDefinitionRegistrar 接口的實(shí)現(xiàn)類(lèi) MyRegistry 注入的。且id為類(lèi)名颈畸,非全類(lèi)名前塔。
三、@Bean 注解
如果要注入的bean來(lái)自第三方承冰,類(lèi)沒(méi)有使用@Controller、@Service食零、@Component困乒、@Repository等注解去修飾,那就意味著spring掃描時(shí)就不會(huì)識(shí)別這是個(gè)要注入的bean贰谣,那就可以使用@bean注解去實(shí)現(xiàn)注入:
假設(shè)這個(gè)CarDTO來(lái)自第三方娜搂,那就可以這樣輸入。
四吱抚、FactoryBean 接口
可以看到:
1百宇、這里getBean("myFactoryBean"),是小寫(xiě)的秘豹,@Bean注解沒(méi)有指定value時(shí)携御,默認(rèn)方法名為id
2、@Bean注解是加在返回類(lèi)型為MyFactoryBean類(lèi)型的方法上的既绕,但是getBean("myFactoryBean")時(shí)返回的bean并不是MyFactoryBean類(lèi)型的組件啄刹,實(shí)際返回的是它里面的getObject()方法產(chǎn)生的CarDTO類(lèi)型的bean
3、因?yàn)镸yFactoryBean中的isSingleton()方法返回值為true凄贩,即單例模式誓军,容器中只有一份實(shí)例,多次獲取的是同一實(shí)例
若把MyFactoryBean中的 isSingleton()方法返回值設(shè)為false:
因?yàn)镸yFactoryBean中的isSingleton()方法返回值為false疲扎,即多例模式昵时,每次獲取的是不同實(shí)例。
好了有了上面的說(shuō)明椒丧,還怕你的bean不能注入嗎壹甥!