《墨攻》中的一个场面,刘德华所饰演的墨者——革离,到达梁国都成下时候,城上的梁国守军问道:“来者何人?”,刘德华回答:“墨者革离!”
使用Java语言为这个场景“城门叩问”的场景编写剧本。
革离是《墨攻》剧本中一个角色,我们用一个接口(interface)来表示这个角色
GeLi.java
package com.smart.ioc;
public interface GeLi {
void responseAsk(String saying);
}
刘德华是一个饰演的革离的演员,我们一个类(class)来实现(implement)上边的接口
LiuDeHua.java
package com.smart.ioc;
public class LiuDeHua implements GeLi {
public void responseAsk(String saying) {
System.out.println(saying);
}
}
属性注入
接下来用一个类来表示我们墨攻的剧本
MoAttack.java(属性注入方式)
package com.smart.ioc;
public class MoAttack{
private GeLi geli;
// 属性注入
public void setGeli(GeLi geli) {
this.geli = geli;
}
void cityGateAsk() {
geli.responseAsk("墨者革离");
}
}
MoAttack 和 LiuDeHua 实现了解耦,MoAttack 无需关注角色实现类的实例化工作。
通过容器完成依赖关系的注入
在 Spirng 配置文件对以上实例进行配置:
MoAttack-a.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
<!-- 通过容器完成依赖关系的注入 -->
<bean id="liudehua" class="com.smart.ioc.LiuDeHua" />
<!-- 方式一 -->
<!--<bean id="moAttack" class="com.smart.ioc.MoAttack"-->
<!--p:geli-ref="liudehua"/>-->
<!-- 方式二 -->
<bean id="moAttack" class="com.smart.ioc.MoAttack">
<property name="geli" value="liudehua" />
</bean>
<!-- 两种注入方式效果相同 -->
</beans>
测试效果
MoAttackTest.java
package com.smart.ioc;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.annotation.Resource;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations ={"/MoAttack-a.xml"})
public class MoAttackTest {
@Autowired
private MoAttack moAttack;
@Test
public void MoAttackTest() throws Exception{
moAttack.cityGateAsk();
}
}
//@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration(locations ={"/MoAttack-a.xml"})
//public class MoAttackTest {
//
// @Resource
// private MoAttack moAttack;
//
// @Test
// public void MoAttackTest() throws Exception{
// moAttack.cityGateAsk();
// }
//}
//public class MoAttackTest {
// @Test
// public void MoAttackTest() throws Exception{
// ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("MoAttack-a.xml");
// context.start();
// MoAttack moAttack = (MoAttack) context.getBean("moAttack");
// moAttack.cityGateAsk();
// }
//}
构造器注入
GeLi.java 和 LiuDeHua.java 文件无需改动
MoAttack.java(构造器注入)
package com.smart.ioc;
public class MoAttack{
private GeLi geli;
// 属性注入
public void setGeli(GeLi geli) {
this.geli = geli;
}
// 构造器注入
public MoAttack(GeLi geLi){
this.geli = geLi;
}
void cityGateAsk() {
geli.responseAsk("墨者革离");
}
}
MoAttack-a.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
<!-- 通过容器完成依赖关系的注入 -->
<bean id="liudehua" class="com.smart.ioc.LiuDeHua" />
<!-- 属性注入的两种配置方式 -->
<!-- 方式一 -->
<!--<bean id="moAttack" class="com.smart.ioc.MoAttack"-->
<!--p:geli-ref="liudehua"/>-->
<!-- 方式二 -->
<!--<bean id="moAttack" class="com.smart.ioc.MoAttack">-->
<!--<property name="geli" value="liudehua" />-->
<!--</bean>-->
<!-- 两种注入方式效果相同 -->
<!-- 构造器注入 -->
<bean id="moAttack" class="com.smart.ioc.MoAttack">
<constructor-arg index="0" ref="liudehua" />
</bean>
</beans>
项目的目录结构