裝配bean的概念
spring到底做了啥?
spring容器負(fù)責(zé)創(chuàng)建應(yīng)用程序中的bean,并通過di來協(xié)調(diào)bean相互之間的關(guān)系,所以spring提供了三種方式:
1:通過xml顯示配置,這種方式在以前的編碼中經(jīng)常用到,但是現(xiàn)在已經(jīng)漸漸的被第二種方式所取代了,所以本篇文章我們就不討論這種配置方式了。因?yàn)?,我也忘了是如何配置的了?br>
2:在JAVA中顯示配置,這是現(xiàn)在常用的一種裝配bean的方式,相比于xml她會(huì)更加的簡(jiǎn)潔并且易讀。
3:隱式的bean發(fā)現(xiàn)機(jī)制和自動(dòng)裝配
那現(xiàn)在就讓我們先來聊一聊第三種方式,spring自動(dòng)裝配
spring通過兩個(gè)角度來實(shí)現(xiàn)自動(dòng)化配置
1、組件掃描(component scanning)spring會(huì)自動(dòng)發(fā)現(xiàn)應(yīng)用上下文中的所創(chuàng)建的bean并將他們加載進(jìn)來。
2、自動(dòng)裝配(autowiring)spring自動(dòng)滿足bean之間的依賴關(guān)系。
接下來我們用例子來說明,首先我們先來創(chuàng)建兩個(gè)東西,一個(gè)是游戲機(jī),一個(gè)是游戲光盤
/**
* 這是一個(gè)游戲光盤的實(shí)現(xiàn)
*/
@Component
public class GameDisc implements Disc{
@Override
public void play() {
System.out.println("來一起玩真三國無雙吧");
}
}
@Configuration
@ComponentScan
public class DiscConfig {
}
可以看出,我們?cè)贕ameDisc上加了@Component注解,這個(gè)注解的意思就是將這個(gè)類聲明成一個(gè)組件,Spring就可以自動(dòng)裝配這個(gè)Bean,我們?cè)贒iscConfig上加了一個(gè)@ComponentScan注解表示在Spring中開啟了組件掃描,就可以掃描到這個(gè)GameDisc的Bean了。這就是Spring的自動(dòng)裝配機(jī)制。
接下來我們來看看顯示的JAVA配置是如何實(shí)現(xiàn)的。
現(xiàn)在我們把config上面的@ComponentScan去掉,這樣他就不能自動(dòng)掃描bean了,這個(gè)時(shí)候再測(cè)試的時(shí)候就會(huì)報(bào)出BeanCreationException。這樣的話我們就需要自己手動(dòng)配置這個(gè)bean了
@Configuration
public class DiscConfig {
@Bean
public Disc gameDisc(){
return new GameDisc();
}
}
默認(rèn)狀態(tài)Spring創(chuàng)建的bean是單例的,也就是說如果這樣
@Configuration
public class DiscConfig {
@Bean
public Disc gameDisc(){
return new GameDisc();
}
@Bean
public Disc anotherGameDisc(){
return new GameDisc();
}
}
這種情況如果第一次已經(jīng)創(chuàng)建了這個(gè)bean的話,第二次就不會(huì)再創(chuàng)建這個(gè)bean了,當(dāng)然也可以手動(dòng)調(diào)節(jié)為多例的。所以一般情況下我們沒必要去創(chuàng)建第二個(gè)相同的bean。
(tips @Bean可以以任何JAVA的形式去創(chuàng)建bean,構(gòu)造器和setter等,這里存在的可能性只是受到了java語言的限制)
關(guān)于xml的配置方式就不說了,懶得看了。。。。多說一句,一般來說能用自動(dòng)配置盡量用自動(dòng)配置,畢竟比較方便,而用到j(luò)avaconfig主要是因?yàn)楸热缫肓似渌膉ar,但是它的類上面又沒有@Component所以只能自己配置了。
關(guān)于Spring裝配bean就說這些了。