IOC容器装载Beans有三种方式:
【显示】JavaConfig(当前流行)
【显示】XML(古老的|不可替代的)
【隐式】自动装配(注解扫描)
实际使用往往是交叉的
本节内容:
- 如何使用多个JavaConfig类进行配置
- 如何在JavaConfig中引入xml配置
- 如何在xml中引入JavaConfig配置
如何使用多个JavaConfig类进行配置
就像XML方式配置bean类似,如何将项目所有Bean都添加到同一个JavaConfig会显得十分臃肿。那么如何拆分呢?XML中可以使用<import>,所以在JavaConfig类中我们可以使用@import
代码如下
Beans相关代码
接口类MobilePhone
package com.xbz.learn.spring.autowire;
public interface MobilePhone {
/**
* 给XXX打电话
* @param phoneNumber
*/
public void callPerson(String phoneNumber);
}
接口类Computer
package com.xbz.learn.spring.autowire;
/**
* 电脑抽象接口
* @author xbz
*
*/
public interface Computer {
/**
* 上网冲浪
*/
public void surfInternet();
}
接口实现类
package com.xbz.learn.spring.autowire;
/**
* MobilePhone接口的iphone实现类
* @author xbz
*
*/
public class Iphone implements MobilePhone{
public void callPerson(String phoneNumber) {
System.out.println("iphone 正在向【"+phoneNumber+"】打电话");
}
}
package com.xbz.learn.spring.autowire;
public class XiaoMiPhone implements MobilePhone {
public void callPerson(String phoneNumber) {
System.out.println("小米手机 正在向【"+phoneNumber+"】打电话");
}
}
package com.xbz.learn.spring.autowire;
public class MacComputer implements Computer{
public void surfInternet() {
System.out.println("用Mac上网非常爽!!!");
}
}
package com.xbz.learn.spring.autowire;
public class LenovoComputer implements Computer{
public void surfInternet() {
System.out.println("用联想电脑上网,好烫啊!!!");
}
}
JavaConfig
package com.xbz.learn.spring.autowire.javaConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.xbz.learn.spring.autowire.Computer;
import com.xbz.learn.spring.autowire.LenovoComputer;
import com.xbz.learn.spring.autowire.MacComputer;
@Configuration
public class ComputerConfig {
@Bean
public Computer mac(){
System.out.println("得到一个Mac电脑");
return new MacComputer();
}
@Bean
public Computer lenovo(){
System.out.println("得到一个联想电脑");
return new LenovoComputer();
}
}
package com.xbz.learn.spring.autowire.javaConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.xbz.learn.spring.autowire.Iphone;
import com.xbz.learn.spring.autowire.MobilePhone;
import com.xbz.learn.spring.autowire.XiaoMiPhone;
@Configuration
public class MobilePhoneConfig {
@Bean
public MobilePhone iphone(){
System.out.println("得到一个iphone手机");
return new Iphone();
}
@Bean
public MobilePhone xiaomi(){
System.out.println("得到一个小米手机");
return new XiaoMiPhone();
}
}
注意点:@import 我们最终的根Configuration类
package com.xbz.learn.spring.autowire.javaConfig;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import({ComputerConfig.class,MobilePhoneConfig.class})
public class SpringJavaConfig {
}
测试类
package com.xbz.learn.spring.autowire.javaConfig;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.xbz.learn.spring.autowire.Computer;
import com.xbz.learn.spring.autowire.MobilePhone;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={SpringJavaConfig.class})
public class SpringJavaConfigTest {
@Autowired
private MobilePhone iphone;
@Autowired
private MobilePhone xiaomi;
@Autowired
private Computer lenovo;
@Autowired
private Computer mac;
@Test
public void testPhoneConfig(){
System.out.println("iphone:"+iphone);
System.out.println("xiaomi:"+xiaomi);
iphone.callPerson("iphone");
xiaomi.callPerson("xiaomi");
System.out.println("is same?"+(iphone==xiaomi));
}
@Test
public void testComputerConfig(){
lenovo.surfInternet();
mac.surfInternet();
}
}
混合装配方式:现在我们将MobilePhone的Beans配置在xml中,如何使用JavaConfig
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"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation=
"http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
">
<!-- MobilePhone相关实现类 -->
<bean id="iphone" class="com.xbz.learn.spring.autowire.Iphone"></bean>
<bean id="xiaomi" class="com.xbz.learn.spring.autowire.XiaoMiPhone"></bean>
</beans>
在JavaConfig类中使用@ImportResource指示加载xml的路径
package com.xbz.learn.spring.autowire.javaConfig;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;
@Configuration
@Import({ComputerConfig.class})
@ImportResource(locations={"classpath:spring/spring-beans.xml"})
public class SpringJavaConfig {
}
如何在xml引入JavaConfig类呢?
再简单不过了,JavaConfig首先他就是Java类,我们只要配置一个Bean不就可以了吗!
<!-- 引入JavaConfig -->
<bean class="com.xbz.learn.spring.autowire.javaConfig.SpringJavaConfig"></bean>