1. 程式人生 > >Spring實戰學習1-裝配bean

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中,這些配置方案不是互斥的,可以混合使用。