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

Spring 学习笔记(1)—— 通过一个小例子体会 IoC 的概念

2017-10-30 23:25 483 查看
《墨攻》中的一个场面,刘德华所饰演的墨者——革离,到达梁国都成下时候,城上的梁国守军问道:“来者何人?”,刘德华回答:“墨者革离!”

使用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>


项目的目录结构

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: