依赖注入之setter注入---只需修改配置,电脑就可以安装不同的打印机;读取properties配置文件并创建实例;实现不采用new的方式直接实例化对象
1、项目截图

2、黑白打印机类
package com.example.demo.printer;
public class GrayPrinter implements Printer{
@Override
public void init() {
System.out.println("启动打印机");
}
@Override
public void print(String txt) {
System.out.println("打印黑白文字:".concat(txt));
}
}
3、彩色打印机类
package com.example.demo.printer;
public class ColorPrinter implements Printer {
@Override
public void init() {
System.out.println("启动彩色打印机!");
}
@Override
public void print(String txt) {
System.out.println("打印彩色文字:".concat(txt));
}
}
4、电脑
package com.example.demo.printer; /**
* Created by Admin on 2018/5/8.
*/
public class Computer { Printer p; public void printTxt(String txt){
p.init();
p.print(txt);
} public Printer getP() {
return p;
} public void setP(Printer p) {
this.p = p;
}
}
5、配置文件

printer = com.example.demo.printer.ColorPrinter
配置文件的创建: 
6、读取bean配置并创建实例类
package com.example.demo.printer; import java.io.IOException;
import java.util.Properties; public class GetBeans {
private static Properties p = new Properties();
static{
try{
//读取bean配置文件
p.load(TestComputer.class.getResourceAsStream("/bean.properties"));
}catch(IOException e){
System.out.println("无法找到配置文件!");
}
}
public static Object getBean(String keyName){
Object o = null;
try{
//根据属性文件中定义的关键字创建实例
o = Class.forName(p.get(keyName).toString()).newInstance();
}catch (Exception e){
System.out.println("无法实例化对象!");
}
return o;
}
}
7、打印机接口
package com.example.demo.printer;
public interface Printer {
void init(); void print(String txt);
}
8、测试类
package com.example.demo.printer;
public class TestComputer {
public static void main(String[] args) {
Computer pcl = new Computer();
//实现不用new关键字
Printer p = (Printer) GetBeans.getBean("printer");
pcl.setP(p);
pcl.getP().print("打印测试页...");
}
}
9、效果

当电脑要安装黑白打印机的时候只需要将配置文件中的printer变量的值设置为
printer = com.example.demo.printer.GrayPrinter
这样做的好处就是实现,既不需要改变Computer类也不需要改变测试类中的代码,通过配置的方式就可以选择不同的打印机进行安装
依赖注入之setter注入---只需修改配置,电脑就可以安装不同的打印机;读取properties配置文件并创建实例;实现不采用new的方式直接实例化对象的更多相关文章
- Spring依赖注入的Setter注入(通过get和set方法注入)
Spring依赖注入的Setter注入(通过get和set方法注入) 导入必要的jar包(Spring.jar和commonslogging.jar) 在src目录下建立applicationCont ...
- Spring IOC三种注入方式(接口注入、setter注入、构造器注入)(摘抄)
IOC ,全称 (Inverse Of Control) ,中文意思为:控制反转, Spring 框架的核心基于控制反转原理. 什么是控制反转?控制反转是一种将组件依赖关系的创建和管理置于程序外部的技 ...
- 在当前Server上找某某object,注意只需修改"要找的object"就可以使用
---在当前Server上找某某object,注意只需修改"要找的object"就可以使用EXEC sp_MSforeachdb 'use ? ;IF EXISTS(SELECT ...
- centos lamp/lnmp阶段复习 以后搬迁discuz论坛不需要重新安装,只需修改配置文件即可 安装wordpress 安装phpmyadmin 定时备份mysql两种方法 第二十五节课
centos lamp/lnmp阶段复习 以后搬迁discuz论坛不需要重新安装,只需修改配置文件即可 安装wordpress 安装phpmyadmin 定时备份mysql两种方法 第二十五节 ...
- SpringIOC的概念理解、构造器注入、setter注入、p命名空间注入、IOC容器介绍与比较
1.IOC概念理解 IOC(Inversion of Control)即“控制反转”,不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象 ...
- 区分构造函数注入和 setter 注入?
构造函数注入 setter 注入 没有部分注入 有部分注入 不会覆盖 setter 属性 会覆盖 setter 属性 任意修改都会创建一个新实例 任意修改不会创建一个新实例 适用于设置很多属性 适用于 ...
- Bean的构造器注入和setter注入
链接:https://pan.baidu.com/s/1vixLrr8harzZMwLsIB1Mwg 提取码:ou1n 首先要明白,为什么要注入? IOC容器会在初始化时,创建好所有的bean对象的实 ...
- 编写通用shell脚本启动java项目,适用于多数服务,只需修改服务名即可
文件名:service-user.sh 文件内容: ##shell脚本的头文件必须有#!/bin/sh ##再次配置java环境变量以防报其他错误## java env#jdk安装目录export J ...
- 解决WinForm屏幕缩放适配只需修改两个Form的两个属性
最近要做一个windows下截屏识别文字的程序,调试发现截取的图像显示不完整. 输出了Screen.PrimaryScreen.Bounds.Width获取的值,结果与实际分辨率不同,所以确定了与我的 ...
随机推荐
- luogu准备复习(学习)题单
矩阵乘法 P1306 exbsgs P4195 网络流(割点) P1345 主席树 P3302
- 基于redis的分布式锁(转)
基于redis的分布式锁 1 介绍 这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁.会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁. 本篇文章会将分布式锁的实现分 ...
- 在Rancher 1.6上部署Traefik负载均衡器
一.给Traefik主机打标签 01-给即将部署Traefik的主机节点打上标签.jpg 02-主机打完traefik_lb标签后的状态.jpg 二.在Rancher应用商店中部署Traefik 应用 ...
- clientHeight、offsetHeight、scrollHeight、offsetTop、scrollTop
clientHeight:包括padding但不包括border.水平滚动条.margin的元素的高度.对于inline的元素这个属性一直是0,单位px,只读元素. offsetHeight:包括pa ...
- 删除链表的倒数第N个节点(java实现)
题目: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链 ...
- php正则匹配
在PHP中,有两套正则表达式函数库,两者功能相似,只是执行效率上有所不同, 一套是有"preg_"为前缀命名的函数,一套有"ereg_"命名的函数的函数, 一个 ...
- Mysql报错[Warning] TIMESTAMP with implicit DEFAULT value is deprecated和Buffered warning: Changed limits
报错2019-04-24 12:06:46 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use -- ...
- Abstract与Virtual
转自 http://www.cnblogs.com/wang7/archive/2012/04/17/2453624.html virtual和abstract都是用来修饰父类的,通过覆盖父类的定义, ...
- C# linq操作是否延迟对照表
·Select - Select选择:延迟 ·Where - Where查询:延迟 ·OrderBy - 按指定表达式对集合正序排序:延迟 ·OrderByDescending - 按指定表达式对集合 ...
- c# 参数名ascii码从小到大排序(字典序)拼接
代码如下: /// <summary> /// c# 参数名ascii码从小到大排序(字典序)拼接 /// </summary> /// <param name=&quo ...