zoukankan      html  css  js  c++  java
  • spring框架IoC

    IoC反转控制,

    举个反例:

     1 //数据操作类
     2 public class DataBase
     3 {
     4     //向数据库中存储数据
     5     public void saveDB()
     6     {
     7     }
     8 }
     9 //业务逻辑类
    10 public class Business
    11 {
    12     //定义数据接口
    13     private DataBase db = new DataBase();
    14     //数据保存
    15     public void saveData()
    16     {
    17         //do something else
    18         //保存数据
    19         db.saveDB();
    20     }
    21 }
    22 //现在修改为向XML文件保存
    23 public class XMLData
    24 {
    25     //向xml中保存数据
    26     public void saveXML()
    27     {
    28     }
    29 }
    30 //这个时候需要重新修改业务逻辑业务逻辑
    31 public class Business
    32 {
    33     private XMLData xml = new XMLData();
    34     //数据保存
    35     public void saveData()
    36     {
    37         //do something esle
    38         //保存数据
    39         xml.saveXML();
    40     }
    41 }

    可以看到 这种方法的不方便之处在于更改存储方式的时候,就需要更新全部的逻辑与方法

    //定义一个接口
    public interface SaveData()
    {
        public void saveData();
    }
    //数据操作类
    public class DataBase implements SaveData
    {
        //向数据库中存储数据,实现接口的存储接口
        public void saveData()
        {
            //具体的向数据库中存入数据的逻辑
        }
    }
    //业务逻辑类
    public class Business
    {
        //定义数据接口
        private SaveData db;
        //定义数据保存类,这里传入的参数实际上是接口的子类,用顶级接口接收
        public void setSaveData(SaveData db)
        {
            //通过向上转型
            this.db = db;
        }
        public void saveData()
        {
            //do something
            this.db.saveData();
        }
    }
    //测试类
    public class TestBusiness
    {
        private Business b = new Business();
        public void saveData()
        {
            .....
            b.setSaveData(new DataBase());
        }
    }

    现在的好处就是使Business成为一个工厂,调用者无需关心底部存储的细节,只需要将存储方法设定到business,然后调用保存即可,而且这样一来

    扩展也变得容易了,首先编写xml存储方法(继承savedata接口,并且实现存储方法),然后business无需更改,在业务逻辑传递进去xml存储对象即可.

    可以看到,这样实现使得代码得到重用,而且增强了扩展性.

    依赖注入:原本的方式是业务逻辑控制具体的存储方式,但是面向接口了以后,就不再业务逻辑里面编写具体的存储方式了,而是在调用业务逻辑的类里控制具体的存储方式,也就是上面的,由testbusiness调用业务逻辑的时候,控制了存储方式(原本是业务逻辑设定好存储方式然后供调用),看起来是由具体的存储方式控制了业务逻辑.

    注入方式:

      1.set注入,也就是在business中定义一个私有的存储接口变量,然后定义set方法,注入具体的存储方式.

      2.接口注入,具体存储方式与存储接口还是一样,但是在业务逻辑中定义的是业务逻辑接口,然后在这个接口中定义了需要注入的信息(比如定义一个Disavedata(SaveData db)),然后每个业务逻辑都需要去继承这个接口,然后实现这个存储方法,在原本的set方法上,相当于保证了每个业务逻辑都有一个默认的注入方法(可以覆写).

      3,构造注入,跟set方法相比 只是把注入的逻辑放到了business的构造方法里面.

    可以看到,无论是采用哪种方法,都需要使用面向接口编程

  • 相关阅读:
    树莓派学习笔记(三)——远程调试树莓派程序(Pycharm实现)
    树莓派学习笔记(一)——系统安装与远程显示
    记 laravel 排除CSRF验证
    thinkPHP5 生成微信小程序二维码 保存在本地
    微信小程序 rich-text 富文本中图片自适应
    Laravel 中自定义 手机号和身份证号验证
    laravel Excel 导入
    微信小程序之页面跳转(tabbar跳转及页面内跳转)
    关于MySQL事务和存储引擎常见FAQ
    微信小程序点击保存图片到本地相册——踩坑
  • 原文地址:https://www.cnblogs.com/color-my-life/p/3967419.html
Copyright © 2011-2022 走看看