打印机原理–如果运用Spring实现?
依赖注入思想的综合示例,共三大步骤
如何开发一个打印机?
可灵活配置使用彩色墨盒或灰色墨盒
可灵活配置打印页面的大小
打印机功能的实现依赖于墨盒和纸张
步骤
定义墨盒和纸张的接口标准
使用接口标准开发打印机
组装打印机
运行打印机
需求说明
自己动手实现打印机功能
使用Spring IoC实现墨盒和纸张的灵活替换
第一大步骤:
三个包{ink墨盒;page纸张;print打印机}
ink包 ==>墨盒颜色
进行定义墨盒颜色的规范,通过传入【int r, int g, int b】进行定义墨盒颜色。
package com.company.ioc.demo2.ink;
/**
* @author Johnny
* 墨盒接口
*/
public interface Ink {
/**
* @param r 红色
* @param g 绿色
* @param b 蓝色
* @return 色值#FFFFFF
*/
public String getColor(int r, int g, int b);
}
彩色墨盒的实现类 ==>实现接口的抽象方法(返回为彩色打印)
package com.company.ioc.demo2.ink.impl;
import com.company.ioc.demo2.ink.Ink;
/**
* @author Johnny
* 彩色墨盒
*/
public class ColorInk implements Ink {
/**
* 彩色墨盒
* @param r 红色
* @param g 绿色
* @param b 蓝色
* @return
*/
@Override
public String getColor(int r, int g, int b) {
return "彩色打印";
}
}
黑白墨盒实现类GreyInk ==>实现接口的抽象方法(返回为黑白打印)
package com.company.ioc.demo2.ink.impl;
import com.company.ioc.demo2.ink.Ink;
/**
* @author Johnny
* 黑白墨盒
*/
public class GreyInk implements Ink {
/**
* 黑白墨盒
* @param r 红色
* @param g 绿色
* @param b 蓝色
* @return
*/
@Override
public String getColor(int r, int g, int b) {
return "黑白打印";
}
}
page包 ==>纸张大小的选择
通过page接口,进行定义纸张的规范的抽象方法。
package com.company.ioc.demo2.page;
/**
* @author Johnny
* 纸张接口
*/
public interface Page {
/**
* @return 纸张的大小
*/
public String getSize();
}
A4纸实体类,实现page的抽象方法,返回A4纸;
package com.company.ioc.demo2.page.impl;
import com.company.ioc.demo2.page.Page;
/**
* @author Johnny
* A4纸张
*/
public class A4Page implements Page {
@Override
public String getSize() {
return "A4纸";
}
}
B5纸实体类,实现page的抽象方法,返回B5纸;
package com.company.ioc.demo2.page.impl;
import com.company.ioc.demo2.page.Page;
/**
* @author Johnny
* B5纸张大小
*/
public class B5Page implements Page {
@Override
public String getSize() {
return "B5纸";
}
}
print类 == >打印方法的实现
该类有两个私有属性:ink(墨盒)和page(纸张)。类中还定义了一个print方法,用于打印墨盒颜色和纸张大小。此外,类中还包含了set和get方法,用于设置和获取墨盒和纸张的属性。
package com.company.ioc.demo2.print;
import com.company.ioc.demo2.ink.Ink;
import com.company.ioc.demo2.page.Page;
/**
* @author Johnny
* 打印机类
*/
public class Print {
/**
* 墨盒接口
*/
private Ink ink;
/**
* 纸张
*/
private Page page;
/**
* 打印方法
*/
public void print(int r, int g, int b){
System.out.println("纸张大小"+page.getSize()+",颜色:"+ink.getColor(r,g,b));
}
/*set、get方法*/
public Ink getInk() {
return ink;
}
public void setInk(Ink ink) {
this.ink = ink;
}
public Page getPage() {
return page;
}
public void setPage(Page page) {
this.page = page;
}
}
第二大步骤:
配置头部文件
在applicationContext2.xml
<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">
</beans>
头部信息的意义是:
<beans>:这是Spring框架中定义bean的根元素。它告诉Spring这是一个包含bean定义的XML文件。
xmlns="http://www.springframework.org/schema/beans":这个属性定义了Spring beans schema的命名空间。这个命名空间告诉Spring解析文件中使用的bean标签和其他相关元素的含义。
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance":这个属性定义了XML Schema Instance (XSI) schema的命名空间。这个命名空间提供了对XML文件中使用的schema位置的引用。
xsi:schemaLocation="http://www.springframework.org/schema/beans 这个属性指定了Spring beans schema的位置。告诉Spring如何解析文件中的bean定义,确保它们符合Spring框架的规范。
通过依赖注入思想,先将被依赖的墨盒、纸张,进行组件配置
id属性定义了这个bean的唯一标识符,可以被其他bean引用。
class属性指定了这个bean的类路径。
<property>标签用于设置打印机的属性。
name属性指定了要设置的属性名称。
ref属性指定了要注入到该属性中的bean的id。
使用了XML配置文件来定义和管理组件。
在Spring框架中,IoC容器负责创建、配置和管理对象的生命周期和依赖关系。这里的关键是标签,它用于定义一个组件(例如墨盒、纸张或打印机)及其属性
<!--组件:1墨盒 彩色-->
<bean id="color" class="com.company.ioc.demo2.ink.impl.ColorInk"></bean>
<!--组件:1墨盒 黑白-->
<bean id="grey" class="com.company.ioc.demo2.ink.impl.GreyInk"></bean>
<!--组件:2纸张-->
<bean id="a4" class="com.company.ioc.demo2.page.impl.A4Page"></bean>
<bean id="b5" class="com.company.ioc.demo2.page.impl.B5Page"></bean>
<!--组件:3打印机-->
<bean id="print" class="com.company.ioc.demo2.print.Print">
<property name="ink" ref="grey"></property>
<property name="page" ref="a4"></property>
</bean>
第三大步骤:
打印测试类PrintTest:使用Spring框架的ClassPathXmlApplicationContext从类路径下的XML配置文件中加载bean,然后获取一个Print类型的bean实例,并调用其print方法。
package com.company.ioc.test;
import com.company.ioc.demo2.print.Print;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author Johnny
* 打印测试类
*/
public class PrintTest {
@Test
public void print(){
//得到上下文对象
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext2.xml");
//通过上下文对象,得到打印机对象
Print print = context.getBean(Print.class);
//调用打印的方法
print.print(10,20,30);
}
}
结果显示