Spring實戰學習1-裝配bean
1、spring裝配bean的機制
Spring容器負責建立應用程式中的bean並通過DI來協調這些物件的關係。
它提供了三種主要的裝配機制:
(1)在XML中進行顯示配置
(2)在java中進行顯示配置[推薦]
(3)隱式的bean發現機制和自動裝配[強烈推薦]
2、隱式的bean發現機制和自動裝配
2.1、自動化裝配bean
Spring從兩個角度來實現自動化裝配
(1)元件掃描:Spring會自動發現應用上下文所建立的bean
(2)自動裝配:Spring自動滿足bean之間的依賴
註解:
@Component:該註解表明該類會作為元件類,並告知Spring要為這個類建立bean
注:元件掃描預設是不開啟的,需要顯式配置一下
@ComponentScan:在Spring中啟用元件掃描,如果沒有其他配置的話,該註解預設會掃描與配置類相同的包。
public interface CompactDisc{ void play();} //Spring容器建立bean @Component public class SgtPeppers implements CompactDisc { private String title = "Sgt.Pepper"; private String artist = "The Beatles"; @Override public void play() { // TODO Auto-generated method stub System.out.println("title:"+title+"artist:"+artist); } } //啟動component掃描 @Configuration @ComponentScan public class CDPlayerConfig { }
2.2為元件掃描的bean命名
Spring應用上下文中所有的bean都會給定一個ID,預設ID為類名的第一個字母變成小寫。
如果想要設定不同的ID,需要將期望的ID作為值傳遞給@Component註解。
@Component("myLoveCd")
public class SgtPeppers implements CompactDisc {
}
還有另外一種bean命名方式,使用java依賴注入中所提到的@Named註解來設定bean的ID
@Named("myLoveCd")
public class SgtPeppers implements CompactDisc {
}
推薦使用@Component
2.3設定元件掃描的基礎包
@Configuration
@ComponentScan("spring")
public class CDPlayerConfig {
}
清晰的說明你設定的是基礎包,通過basePackages屬性進行配置,當然也可以這是多個包
@Configuration
@ComponentScan(basePackages = {"spring","hello"})
public class CDPlayerConfig {
}
除了包設定為簡單的String型別之外,@ComponentScan還提供了另外的方法,將其指定為包中所包含的類或介面
@Configuration
//@ComponentScan(basePackages = {"spring","hello"})
@ComponentScan(basePackageClasses= {CDPlayer.class,DVDPlayer.class})
public class CDPlayerConfig {
}
3、通過java程式碼裝配bean
3.1建立配置類
@Configuration
public class CDPlayerConfig {
}
建立JavaConfig類的關鍵在於為其新增@Configuration註解,該註解表明這個類是一個配置類,該類應該包含在Spring應用上下文中如何建立bean的細節。
3.2宣告簡單的bean
在JavaConfig宣告bean,編寫一個方法,然後給這個方法新增@Bean註解
@Bean(name="sgt")
public CompactDisc sgtPeppers() {
return new SgtPeppers();
}
@Bean註解會告訴Spring這個方法會返回一個物件,該物件要註冊為Spring應用上下文中的bean。
預設情況下,bean的ID與帶有@Bean註解的方法名是一樣的。也可以重新命名該方法,通過name屬性指定一個不同的名字
3.3藉助JavaConfig實現注入
在JavaConfig中裝配bean的最簡單的方法就是引用建立bean的方法
@Bean
public CDPlayer cdPlayer() {
return new CDPlayer(sgtPeppers());
}
//或者
@Bean
public CDPlayer cdPlayer(CompactDisc sgtPeppers) {
return new CDPlayer(sgtPeppers);
}
使用Setter方法實現注入
@Bean
public CDPlayer cdPlayer2(CompactDisc cd) {
CDPlayer cdPlayer = new CDPlayer(cd);
cdPlayer.setCd(cd);
return cdPlayer;
}
4、在JavaConfig中引用XML配置
最為簡單的Spring XML配置如下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
用來裝配bean的最基本的XML元素包含在spring-北安市模式之中,在上面這個XML檔案中,它被定義為根名稱空間。是該模式中的一個元素,它是所有Spring配置檔案的根元素。
4.1、宣告一個簡單的
<bean class="com.example.demo.spring.CDPlayer">
</bean>
這裡宣告一個簡單的bean,建立這個bean的類通過class屬性來指定,並且使用全限定類名
可以藉助id屬性,為每隔bean設定一個自己定義的名字:
<bean id = "cdPlayer" class="com.example.demo.spring.CDPlayer">
</bean>
4.2藉助構造器注入初始化bean
兩種方式實現構造器的注入bean
//第一種
<bean id = "cd" class = "com.example.demo.spring.SgtPeppers"/>
<bean id = "cdPlayer" class="com.example.demo.spring.CDPlayer">
<constructor-arg ref="cd"></constructor-arg>
</bean>
//第二種
<bean id = "cd" class = "com.example.demo.spring.SgtPeppers"/>
<bean id = "cdPlayer" class="com.example.demo.spring.CDPlayer" c:cd-ref="cd" />
4.3、設定屬性
<bean id = "cd" class = "com.example.demo.spring.SgtPeppers"/>
<bean id = "cdPlayer" class="com.example.demo.spring.CDPlayer">
<constructor-arg ref="cd"></constructor-arg>
<property name="cd" ref = "cd"></property>
</bean>
元素為屬性Setter方法多提供的功能與元素為構造器所提供的功能是一樣的
總結:
Spring框架的核心是Spring容器。容器負責管理應用中元件的生命週期,它會建立這些元件並保證它們的依賴能夠得到滿足。在Spring中,這些配置方案不是互斥的,可以混合使用。