Spring 学习笔记(1)—— 通过一个小例子体会 IoC 的概念
2017-10-30 23:25
483 查看
《墨攻》中的一个场面,刘德华所饰演的墨者——革离,到达梁国都成下时候,城上的梁国守军问道:“来者何人?”,刘德华回答:“墨者革离!”
使用Java语言为这个场景“城门叩问”的场景编写剧本。
革离是《墨攻》剧本中一个角色,我们用一个接口(interface)来表示这个角色
GeLi.java
刘德华是一个饰演的革离的演员,我们一个类(class)来实现(implement)上边的接口
LiuDeHua.java
MoAttack.java(属性注入方式)
MoAttack 和 LiuDeHua 实现了解耦,MoAttack 无需关注角色实现类的实例化工作。
MoAttack-a.xml
MoAttack.java(构造器注入)
MoAttack-a.xml
使用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.javapackage 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>
项目的目录结构
相关文章推荐
- [原创]java WEB学习笔记104:Spring学习---AOP 前奏,通过一个问题引入动态代理
- Spring.NET学习笔记3——实现一个简易的IoC框架(练习篇)(转)
- Spring学习--IOC容器的概念及一个简单IOC容器使用案例
- Spring学习笔记-IOC概念篇
- Spring学习笔记2--反向控制(IoC)的例子
- 懒得笔记2 spring DI IOC 的一个例子
- Spring学习笔记(一) 通过Spring控制反转(IOC:Inversion of Control)为对象设置属性
- Spring学习笔记-IOC概念篇
- Spring学习笔记:1、概念理解
- Spring IOC 学习笔记(一) IoC和DI概述
- osworkflow学习笔记1-概念及例子
- Spring.Net学习笔记(1)--IoC干什么的?
- Spring IOC 学习笔记(二) BeanFactory
- Spring学习笔记:1、概念理解
- JavaScript学习笔记8--一个文字自动匹配的例子
- Spring学习笔记:概念理解
- Spring学习笔记:第三章 IoC中的国际化
- Spring学习笔记:1、概念理解
- 通过一个实际的例子学习SQLServer存储过程
- Spring学习笔记:2-Spring中IoC的入门实例