Spring装配Bean(四)

在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元素引入


猜你喜欢

转载自blog.csdn.net/ditto_zhou/article/details/80416736