zoukankan      html  css  js  c++  java
  • 1.1.1 Spring里面的依赖注入思想

    1.spring,他的目的就是简化java 的编写工作

    例子1:

    public class PersonOfOnlySingingASong extends Person {
    	private SingASongImpl sing;
    	
    	public	PersonOfOnlySingingASong(){
    		sing = new SingASongImpl();
    	}
    	
    	public void singOnQuest() {
    		sing.singASong();
    	}
    }



    上面的例子在PersonOfOnlySinging运行构造方法的时候,就已经把sing这个类生成了实例,这样其实是很难进行单元测试与重用,这个人只能唱A这首歌,唱其他的就不行了,简单的说耦合太高了,两个类紧紧相依,无法分开。

    由于上面的例子不便于测试(因为每次测试都需要保证SingASong的实现)还有不便于重用,所以产生了下面的例子

    例子2:

    public class PersonOfNotOnlySingingASong extends Person {
    	private ISing sing;
    	
    	public	PersonOfNotOnlySingingASong(ISing sing){
    		this.sing = sing;
    	}
    	
    	public void singOnQuest() {
    		sing.singASong();
    	}
    	
    	public static void main(String[] args) {
    		PersonOfNotOnlySingingASong temp= new PersonOfNotOnlySingingASong(new SingASongImpl());
    		temp.singOnQuest();
    	}
    }




    所谓的注入:就是往接口里面放入一个实现,而这个实现不是这个人生成的时候就已经具备的,而是由这个人去控制选择实现,也就是控制反转,控制实现哪个被反转了,不再有生成人的那一刹那决定,而是把控制权放到了人生成后需要什么就实现什么


    在上面的例子里面,我们引入接口ISing,SingASongImpl现在就变成只是ISing的一个实现,也许我们会有其他的实现(如:SingBSong等),这样,Person就不单单只是唱一首歌,而是变成(或者说是抽象成)一种能力“唱歌”,这个人会唱歌,这是一个抽象(也是平常说的接口),他不一定唱A这首歌,还可以唱其他歌曲,只有有其他歌曲的实现,他照样能够唱出来。所以,上面的例子体现了Spring里面其中一种注入方式:构造器注入


    扩展:

    接口:(我觉得下面的解释会比较清楚)

    interface就是一种介面﹐规定欲沟通的两物件(平常说的对象Object的另外一个说法)﹐其通讯该有的规范有哪些。一些函数或资料成员﹐为另一些属于不同类别的物件所需共同拥有﹐则将这些函数与资料成员﹐定义在一个interface中﹐然后让所有不同类别的Java物件(平常说的对象Object的另外一个说法)可以共同操作使用之。


    如果我在上面的例子中还不满意那个人只能唱歌,我就可以再定义一个空接口IDo(定义这个人可以做事情,唱歌只是Do里面的其中一部分,Sing继承Do)

    例子:

    public class PersonOfDo extends Person {
    	private IDo domainOfDo;
    	
    	public	PersonOfDo(IDo doThing){
    		this.domainOfDo = doThing;
    	}
    	
    	public void doOnQuest() {
    		domainOfDo.doThing();
    	}
    	
    	public static void main(String[] args) {
    		SingASongImpl singASongImpl = new SingASongImpl();
    		PersonOfDo personOfDo = new PersonOfDo(singASongImpl);
    		personOfDo.doOnQuest();
    	}
    }





    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    通过PROFINET网络实现SINAMICS 120的PN IO OPC通讯,起动及调速控制
    Python datetime获取当前年月日时分秒
    计算机网络:套接字(Socket)| Python socket实现服务器端与客户端通信,使用TCP socket阿里云ECS服务器与本机通信
    Ubuntu16.04安装、卸载宝塔软件
    Ubuntu一键安装LAMP,LNMP
    STM32使用K型热电偶测温:运算放大器+内置ADC+K型热电偶分度表+中间温度定律 | K型热电偶的温度-热电势曲线
    盘点几种DIY加密狗的制作方法,适用于穿越机模拟器
    变频器通讯参数PKW和PZD的含义
    穿越机从0到起飞:选件
    西门子S7-1200PLC不让下载一直报“模块具有激活的测试和调试功能,防止下载到设备”解决方法
  • 原文地址:https://www.cnblogs.com/raylee2007/p/4774592.html
Copyright © 2011-2022 走看看