您的位置:首页 > 编程语言 > Java开发

装配Bean:XML与JavaConfig混合装配

2016-08-19 12:23 337 查看
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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring 混合