上一篇中演示了在构造对象时,使用new一个接口的实现类实现构造注入。这样做目前还没有明显的不足,但是如果开发过企业级应用就知道,这样做,系统将越来越难以维护。
这里,我演示使用spring进行进行bean的装配。
1.编写一些基础类
package com.amber.ivy.spring;
/**
* 古典音乐家类
* @author ivyamber
*
*/
public class DIClassicMusicSinger implements DISinger
{
public void sing()
{
System.out.println("我是古典音乐家,我唱古典音乐");
}
}
/**
* 古典音乐家类
* @author ivyamber
*
*/
public class DIClassicMusicSinger implements DISinger
{
public void sing()
{
System.out.println("我是古典音乐家,我唱古典音乐");
}
}
package com.amber.ivy.spring;
/**
* 流行音乐家类
* @author ivyamber
*
*/
public class DIPopMusicSinger implements DISinger
{
public void sing()
{
System.out.println("我是流行歌手,我唱流行音乐");
}
}
/**
* 流行音乐家类
* @author ivyamber
*
*/
public class DIPopMusicSinger implements DISinger
{
public void sing()
{
System.out.println("我是流行歌手,我唱流行音乐");
}
}
package com.amber.ivy.spring;
/**
* 音乐家类,所有类型的音乐家都要实现这个类
* @author ivyamber
*
*/
public interface DISinger
{
void sing();
}
/**
* 音乐家类,所有类型的音乐家都要实现这个类
* @author ivyamber
*
*/
public interface DISinger
{
void sing();
}
package com.amber.ivy.spring;
/**
* mp3播放器
* @author ivyamber
*
*/
public class DIMp3
{
private DISinger singer;//使用接口而不是用具体的实现
public DIMp3(DISinger singer)
{
this.singer = singer;
}
public void play()
{
singer.sing();
}
}
/**
* mp3播放器
* @author ivyamber
*
*/
public class DIMp3
{
private DISinger singer;//使用接口而不是用具体的实现
public DIMp3(DISinger singer)
{
this.singer = singer;
}
public void play()
{
singer.sing();
}
}
可以发现所有的基础类都没有任何变化。
2.编写spring配置文件
<?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-3.0.xsd">
<bean id="mp3" class="com.amber.ivy.spring.DIMp3">
<constructor-arg ref="singer"/>
</bean>
<bean id="singer" class="com.amber.ivy.spring.DIPopMusicSinger"/>
</beans>
<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-3.0.xsd">
<bean id="mp3" class="com.amber.ivy.spring.DIMp3">
<constructor-arg ref="singer"/>
</bean>
<bean id="singer" class="com.amber.ivy.spring.DIPopMusicSinger"/>
</beans>
这就是最简单的一个spring配置文件,目前不对里面的具体编写做介绍。说面两点
bean标签表示构造一个class指定的类
bean的字标签标识构造这个类接受的一些参数。例如 <constructor-arg ref="singer"/>标识构造DIMp3时向构造函数中传入一个参数。
3.代码与spring配置文件结合
package com.amber.ivy.spring;
import org.omg.CORBA.portable.ApplicationException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 低耦合代码示例
* @author ivyamber
*
*/
public class DI {
public static void main(String[] args) {
//spring通过应用上下文装载bean的定义并组装
//使用spring实现的ClassPathXmlApplicationContext加载配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("singer.xml");
//从应用上下文中获取bean
DIMp3 mp3 = (DIMp3) context.getBean("mp3");
mp3.play();
}
}
通过ClassPathXmlApplicationContext加载之前定义的配置文件
import org.omg.CORBA.portable.ApplicationException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 低耦合代码示例
* @author ivyamber
*
*/
public class DI {
public static void main(String[] args) {
//spring通过应用上下文装载bean的定义并组装
//使用spring实现的ClassPathXmlApplicationContext加载配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("singer.xml");
//从应用上下文中获取bean
DIMp3 mp3 = (DIMp3) context.getBean("mp3");
mp3.play();
}
}
通过ClassPathXmlApplicationContext加载之前定义的配置文件
再勾过context的getBean方法获得spring框架装配的bean
一个简单的springDI例子就完成了。