Spring裝配Bean(四)

z1340954953發表於2018-05-23

在JavaConfig中引用XML配置

存在使用JavaConfig配置的bean類

@Configuration
public class CDPlayerConfig {
	@Bean
	public CompactDisc sgtPeppers(){
		return new SgtPeppers();
	}
	@Bean
	public CDPlayer cdplayer(CompactDisc cd){
		return new CDPlayer(cd);
	}
}

如果兩個bean在一個配置類中多了,將其中一個CompactDisc的Bean建立使用另一個配置類

-- CompactDisc Bean

@Configuration
public class CDConfig {
	@Bean
	public CompactDisc sgtPeppers(){
		return new SgtPeppers();
	} 
}

在原來的配置類中引入,上面這個配置類

-- CDPlayer Bean

@Configuration
@Import(value={CDConfig.class})
public class CDPlayerConfig {
	@Bean
	public CDPlayer cdplayer(CompactDisc cd){
		return new CDPlayer(cd);
	}
}

或者,將兩個bean類都分離開來,最後在一個更高階的配置類中引入

@Configuration
@Import(value={CDConfig.class,CDPlayerConfig.class})
public class SoundSystemConfig {

}

假設,我們需要將CompactDisc的bean的建立配置到xml中,如下:

<bean id="compactDisc" class="com.erong.service.SgtPeppers">
   		<property name="title" value="Sgt.Pepper's Hearts Club Band "></property>
   		<property name="artist" value="The Beatles"></property>
 		<property name="list">
 			<list>
 				<value>1</value>
 				<value>1</value>
 				<value>1</value>
 				<value>1</value>
 			</list>
 		</property>
   </bean>

,那麼在SoundSystemConfig中配置為

@Configuration
@Import(value={CDPlayerConfig.class})
@ImportResource(locations = "classpath:beans.xml")
public class SoundSystemConfig {

}

,兩個Bean,定義在JavaConfig和Xml中的Bean最後都會載入到Spring容器中,最後整合Junit測試下:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={SoundSystemConfig.class})
public class Mytest {
	@Autowired
	private CDPlayer cdplayer;
	@Test
	public void run(){
		cdplayer.play();
	}
	public static void main(String[] args) {
		/*ClassPathXmlApplicationContext xf = new ClassPathXmlApplicationContext("beans.xml");
		CDPlayer te = (CDPlayer)xf.getBean("cdplayer");
		te.play();*/
	}
	
}

在XML配置中引用JavaConfig

在JavaConfig配置中,我們已經展現瞭如何使用@Import和@ImportResource來拆分JavaConfig類,

在XML中,可以使用import元素來拆分XML配置

1. 首先明確,CDConfig配置類,定義了CompactDiscBean

2. 在xml中定義CDPlayer的Bean,並引用CompactDisc的Bean如下

<!-- 引入JavaConfig中配置類 -->
   <bean class="com.erong.service.CDConfig"></bean>
   <!-- 建立bean,並引用JavaConfig中的Bean -->
   <bean id="cdplayer" class="com.erong.service.CDPlayer">
   	<property name="cd" ref="sgtPeppers"></property>
   </bean>

這樣的結果就是,bean元素引入的是JavaConfig的Bean,XML中定義另一個Bean

當然,可以將XML中定義的Bean寫在另一個xml並引入,在root的xml中一般會再載入掃描包和註解元素

  <!-- spring基於註解的配置 -->
   <context:annotation-config/>
   <!-- 加上元件掃描的配置 -->
   <context:component-scan base-package="com"></context:component-scan>
   <!-- 引入JavaConfig中配置類 -->
   <bean class="com.erong.service.CDConfig"></bean>
   <!-- 引入xml定義bean的xml檔案 -->
   <import resource="bean-config.xml"/>
,最後,也整合Junit進行測試
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:beans.xml")
public class Mytest {
	@Autowired
	private CDPlayer cdplayer;
	@Test
	public void run(){
		cdplayer.play();
	}
	public static void main(String[] args) {
		/*ClassPathXmlApplicationContext xf = new ClassPathXmlApplicationContext("beans.xml");
		CDPlayer te = (CDPlayer)xf.getBean("cdplayer");
		te.play();*/
	}
	
}

最後,總結下Spring裝載Bean的三種方式,Spring的核心是Spring容器

1. 自動裝配,@Component和掃描包的元素完成Bean的建立,@AutoWire,@Inject完成注入

2. JavaConfig ,@Configuration完成配置類,配置類裡面@Bean來定義Bean

3. XML裡面Bean的建立,直接使用Bean元素引入


相關文章