一个简单的例子,让你理解依赖注入
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个简单的例子,让你理解依赖注入相关的知识,希望对你有一定的参考价值。
一.案例描述
1.案例:开发一个打印机程序,模拟打印程序。
2.需求:可以灵活的配置使用彩色墨盒或灰色墨盒。
可以灵活的配置打印页面的大小。
程序中包括打印机(Printer),墨盒(Ink)和纸张(Paper)3类组件。
3.开发步骤:
01.定义Ink和Paper接口。
02.使用Ink接口和Paper接口开发Printer程序,在开发是并不依赖Ink和Paper的实现类。
03.开发Ink接口和Paper接口的实现类:ColorInk,GreyInk和TextPaper。
04.组装打印机,运行调试。
二.开发案例
1.整体架构
2.搭建接口
墨盒接口:Ink
package cn.ink; /** * 墨盒接口 * @author hyj * */ public interface Ink { /** * 定义打印要采用的颜色 * @param a * @param b * @param c * @return */ public String getColor(int a,int b,int c); }
纸张接口:Paper
package cn.paper; /** * 纸张接口 * @author hyj * */ public interface Paper { //用来换行 public static final String newLine="\r\n"; /** * 输出一个字符到纸张 * @param c */ public void putInChar(char c); /** * 得到输出到纸张的内容 * @return */ public String getContent(); }
3.搭建接口实现类
彩色墨盒Colorink:
package cn.ink; import java.awt.Color; /** * 彩色墨盒 * @author hyj * */ public class Colorink implements Ink{ @Override public String getColor(int a, int b, int c) { Color color=new Color(a,b,c); return "#"+Integer.toHexString(color.getRGB()).substring(2); } }
灰色墨盒GreyInk:
package cn.ink; import java.awt.Color; /** * 灰色墨盒 * @author hyj * */ public class GreyInk implements Ink{ @Override public String getColor(int a, int b, int c) { int d=(a+b+c)/3; Color color=new Color(d,d,d); return "#"+Integer.toHexString(color.getRGB()).substring(2); } }
纸张接口实现类:TextParper
package cn.paper; public class TextParper implements Paper { //每行字符数 private int charPerLine=16; //每页行数 private int linePerPage=5; //纸张中的内容 private String content=""; //当前横向位置,从0到charPerLine-1 private int posX=0; //当前行数,从0到linePerpage-1 private int posY=0; //当前页数 private int posP=1; @Override public void putInChar(char c) { content+=c; ++posX; //判断是否换行 if(posX==charPerLine){ content+=Paper.newLine; posX=0; ++posY; } //判断是否翻页 if(posY==linePerPage){ content+="==第"+posP+"页=="; content+=Paper.newLine+Paper.newLine; posY=0; ++posP; } } @Override public String getContent() { String ret=this.content; if(!(posX==0&&posY==0)){ int count=linePerPage-posY; for (int i = 0; i <count; i++) { ret+=Paper.newLine; } ret+="==第"+posP+"页=="; } return ret; } public int getCharPerLine() { return charPerLine; } public void setCharPerLine(int charPerLine) { this.charPerLine = charPerLine; } public int getLinePerPage() { return linePerPage; } public void setLinePerPage(int linePerPage) { this.linePerPage = linePerPage; } public int getPosX() { return posX; } public void setPosX(int posX) { this.posX = posX; } public int getPosY() { return posY; } public void setPosY(int posY) { this.posY = posY; } public int getPosP() { return posP; } public void setPosP(int posP) { this.posP = posP; } public void setContent(String content) { this.content = content; } }
4.组装打印机Printer
package cn.test; import cn.ink.Ink; import cn.paper.Paper; /** * 打印机 * @author hyj * */ public class Printer { //墨盒接口 private Ink ink=null; //纸张接口 private Paper paper=null; /** * 打印机打印的方法 * @param str */ public void print(String str){ System.out.println("使用"+ink.getColor(255, 200, 0)+"颜色打印\n"); for (int i = 0; i < str.length(); i++) { paper.putInChar(str.charAt(i)); } System.out.print(paper.getContent()); } public Ink getInk() { return ink; } public void setInk(Ink ink) { this.ink = ink; } public Paper getPaper() { return paper; } public void setPaper(Paper paper) { this.paper = paper; } }
5.书写Spring配置文件:applicationContext.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" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 定义彩色墨盒bean,id是colorInk --> <bean id="colorInk" class="cn.ink.Colorink"></bean> <!-- 定义灰色墨盒bean,id是greyInk --> <bean id="greyInk" class="cn.ink.GreyInk"></bean> <!-- 定义A4纸张bean,id是A4Paper --> <!-- 通过setcharperLine()方法为charPerLine属性注入每行字符数 --> <!-- 通过setLinePerpage()方法为linePerpage属性注入每页行数 --> <bean id="a4Paper" class="cn.paper.TextParper"> <property name="charPerLine" value="10"></property> <property name="linePerPage" value="8"></property> </bean> <!-- 定义A5纸张bean,id是A5Paper --> <!-- 通过setcharperLine()方法为charPerLine属性注入每行字符数 --> <!-- 通过setLinePerpage()方法为linePerpage属性注入每页行数 --> <bean id="a5Paper" class="cn.paper.TextParper"> <property name="charPerLine" value="8"></property> <property name="linePerPage" value="5"></property> </bean> <!-- 组装打印机,定义打印机的bean,该bean的id是printer --> <bean id="printer" class="cn.test.Printer"> <!-- 通过ref属性注入已经定义好的bean --> <!-- 注入彩色墨盒 --> <property name="ink" ref="colorInk"></property> <!-- 注入a5打印纸 --> <property name="paper" ref="a5Paper"></property> </bean> </beans>
6.测试类
package cn.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * 测试类 * @author hyj * */ public class Test { public static void main(String[] args) { ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml"); //通过Printer bean的id来获取Printer实例 Printer printer = (Printer)context.getBean("printer"); String content="就是一个傻帽,在问另一群傻帽最好笑的笑话是傻帽,然后一个不傻帽的人来回答说:就是一个傻帽,在问另一群傻帽最好笑的笑话是傻帽!!!"; printer.print(content); } }
以上是关于一个简单的例子,让你理解依赖注入的主要内容,如果未能解决你的问题,请参考以下文章