博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring学习总结一----控制反转与依赖注入
阅读量:7174 次
发布时间:2019-06-29

本文共 4186 字,大约阅读时间需要 13 分钟。

 spring作为java EE中使用最为广泛的框架,它的设计体现了很多设计模式中经典的原则和思想,所以,该框架的各种实现方法非常值得我们去研究,下面先对spring中最为重要的思想之一----控制反转(依赖注入)进行简单的总结。

一、控制反转与依赖注入的概念

  在学习spring框架的时候,我们习惯性地将控制反转和依赖注入放在一起,其实,两者体现的思想原则都是差不多的,只不过控制反转是一种更广泛的程序操作理念,而依赖注入是一种更为具体的实现方法,总的来说,控制反转可以依靠依赖注入来实现。

  1、控制反转的概念。

    在设计模式的总结中,我也曾经在设计模式的博客中总结了控制反转类似的概念思想(),它的核心方法理念其实就是通过接口编程,然后让调用者决定实际生产过程用什么类型的接口实现类。当然,在spring中,上面所说的具体类初始化、注入调用代码等过程都是由spring来完成的。上面文字可能稍微抽象化了点,下面上点代码简单说明这个过程,注意看注释:

//应用程序对应的类public class IocBlog {    //这里定义接口,通过接口操作对象,从而达到多态的效果    UserIfc user = null;    /*spring会通过反射机制,利用setter注入(具体的操作方法是我们在spring配置文件中配置相应bean的property属性即可)     * 后面的login方法的调用时,就是根据这个注入的类是什么类型进行相应的方法调用的,我们可以针对不同的user实现了注入对应的     * 用户对象,而应用程序本身不用根据不同的用户种类进行改变,这便达到了代码解耦的目的。当然,注入的过程是由spring帮我们完成的,这个后面再具体讲     */    public void setUser(UserIfc user) {        this.user = user;    }    //这是具体的调用方法    public  void loginDo() {        //通过接口,引用具体的User对象        user.login();    }}//先简单定义一个用户接口interface UserIfc{    //简单的登录方法    public void login();}//一个具体实现类,该类是在运行时有spring动态地注入的class User implements UserIfc{    public void login() {        System.out.println("user method login");    }}

上面这段代码代替说明了控制反转的核心思想--就是通过接口操纵具体实现类,也体现了设计模式中一个很重要的原则:不用程序本身来找具体实现类,而是调用者来决定具体实现类是什么。

下面再具体说明,在spring中如何实现类注入的。 在进行具体的用法之前,有必要先理解依赖注入这个概念。 

  2、依赖注入概念。

  上面也提到,依赖注入是控制反转的一种具体实现手段,通过依赖注入方法可以达到控制反转的目的。其实依赖注入个人理解就是:通过反射机制在程序运行的时候动态地创建具体实现类的对象,然后在需要该对象的时候通过某种手段(一般是通过该bean对象的对应id)将该对象拿出来(也就是注入到具体需要用的地方)。当然,上面这些复制的过程包括类的创建、维护、注入等工作都是spring帮我们完成的。

 

理解了依赖注入和控制反转之后,废话不多说,下面具体看看在spring中如何具体地运用。

 

二、spring中如何注入对象。

  1、具体的注入方法

  接着上面的user类例子说明spring中对象注入的方法,先看下面改进之后的代码(加了个main方法表示具体的调用过程)

//应用程序对应的类public class IocBlog {    //这里定义接口,通过接口操作对象,从而达到多态的效果    UserIfc user = null;    /*spring会通过反射机制,利用setter注入(具体的操作方法是我们在spring配置文件中配置相应bean的property属性即可)     * 后面的login方法的调用时,就是根据这个注入的类是什么类型进行相应的方法调用的,我们可以针对不同的user实现了注入对应的     * 用户对象,而应用程序本身不用根据不同的用户种类进行改变,这便达到了代码解耦的目的。当然,注入的过程是由spring帮我们完成的,这个后面再具体讲     */    public void setUser(UserIfc user) {        this.user = user;    }    //这是具体的调用方法    public  void loginDo() {        //通过接口,引用具体的User对象        user.login();    }        //定义main方法表示具体的调用过程    public static void main(String [] args){        //加载配置文件上下文,该对象存储有类之间的依赖关系        ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");         //通过上下文对象获取具体的bean对象,该对象具体类型在配置文件中指明        IocBlog test = (IocBlog)appContext.getBean("testId");//一般通过id获取        //通过loginDo调用login,不同的User类的注入对象会调用不同的对应login方法,他们之间的依赖关系通过配置文件指明        test.loginDo();    }}//先简单定义一个用户接口interface UserIfc{    //简单的登录方法    public void login();}//一个具体实现类,该类是在运行时有spring动态地注入的class User implements UserIfc{    private String userName = null;//用户名    public String getUserName() {        return userName;    }    public void setUserName(String userName) {        this.userName = userName;    }    public void login() {        System.out.println("user method login");    }}

  然后,我们通过以下配置文件进行类注入操作,请注意看注释:

  可以看到,通过spring,我们可以实现代码组件之间最大程度的松耦合,对象之间的依赖关系不会硬编码到代码中去,而是通过一个配置文件进行映射操作,这大大提高了代码的重用性以及可扩展性。

  2、spring中实现注入原理的简单总结

    总的来说,注入的实现方法还是反射。spring通过dom4j等组件将配置文件加载解析获得对应的类名字之后,利用class.forName方法加载对象。在bean维护中,spring是通过一个map进行对象的维护的,key对应的就是id值,value对应的是对象(从这里看出,spring中bean对象默认是单例的,当然,通过配置文件我们可以改变单例模式,这个不详细讲),具体就不粘贴源码了,有兴趣的可以自己看spring的源码。

  3、其他数据类型的配置使用方法

    在spring中,不仅仅支持普通对象,它也支持map和list等集合类,具体的配置方式也比较简单,下面简单上个demo供参考:

  Map配置方式

1
2

  list配置方式

这里可以是字符串
也可以不是字符串,具体看下面

 

  当然,spring还支持很多其他方面的配置,具体就不一一讲解了,可以去。

 

转载于:https://www.cnblogs.com/lcplcpjava/p/6747119.html

你可能感兴趣的文章
Java 开源博客——B3log Solo 0.5.0 正式版发布了!
查看>>
2018.6.5号----TeamViewer12 13 非商用出现商用限制怎么解决
查看>>
数据库-事务隔离级别和事务的传播属性
查看>>
ssh-ajax登陆action返回字符串
查看>>
Javascript模板引擎handlebars使用实例及技巧
查看>>
委托和事件
查看>>
4-1.面向对象程序设计
查看>>
Unable to Rebuild JIRA Index
查看>>
returnFunc.js
查看>>
Find Minimum in Rotated Sorted Array(旋转数组的最小数字)
查看>>
并查集维护染色
查看>>
经典SQL语句
查看>>
Unity资源的查找
查看>>
django 信号
查看>>
linux ipc—msgqueue
查看>>
滑动后退的手势监听
查看>>
canvas 画椭圆
查看>>
按键驱动调试总结
查看>>
NormalMap
查看>>
java中的注解(一)
查看>>