spring 注入 和 实例化的差别(别说没区别)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring 注入 和 实例化的差别(别说没区别)相关的知识,希望对你有一定的参考价值。

如果我用new就是我想要的结果
我用依赖注入就不是我想要的结果
望高手给点意见

依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念。具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。

不管是依赖注入,还是控制反转,都说明Spring采用动态、灵活的方式来管理各种对象。对象与对象之间的具体实现互相透明。在理解依赖注入之前,看如下这个问题在各种社会形态里如何解决:一个人(Java实例,调用者)需要一把斧子(Java实例,被调用者)。

(1)原始社会里,几乎没有社会分工。需要斧子的人(调用者)只能自己去磨一把斧子(被调用者)。对应的情形为:Java程序里的调用者自己创建被调用者。

(2)进入工业社会,工厂出现。斧子不再由普通人完成,而在工厂里被生产出来,此时需要斧子的人(调用者)找到工厂,购买斧子,无须关心斧子的制造过程。对应Java程序的简单工厂的设计模式。

(3)进入“按需分配”社会,需要斧子的人不需要找到工厂,坐在家里发出一个简单指令:需要斧子。斧子就自然出现在他面前。对应Spring的依赖注入。

第一种情况下,Java实例的调用者创建被调用的Java实例,必然要求被调用的Java类出现在调用者的代码里。无法实现二者之间的松耦合。

第二种情况下,调用者无须关心被调用者具体实现过程,只需要找到符合某种标准(接口)的实例,即可使用。此时调用的代码面向接口编程,可以让调用者和被调用者解耦,这也是工厂模式大量使用的原因。但调用者需要自己定位工厂,调用者与特定工厂耦合在一起。

第三种情况下,调用者无须自己定位工厂,程序运行到需要被调用者时,系统自动提供被调用者实例。事实上,调用者和被调用者都处于Spring的管理下,二者之间的依赖关系由Spring提供。

所谓依赖注入,是指程序运行过程中,如果需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部的注入。Spring的依赖注入对调用者和被调用者几乎没有任何要求,完全支持对POJO之间依赖关系的管理。依赖注入通常有两种:

·设值注入。

·构造注入。
参考技术A 其实我一开始也好楼主有同样的困惑,但是在项目的慢慢积累,感觉spring的配置文件太有才了

我就和你分享一点:那就是软件的后期维护

比如说有一个订单的DAO接口:interface OrderDAO

在开发的时候我是用的mysql数据库,实现类为 class MySqlOrderDAOImpl implements OrderDAO

在业务代码里面,我要使用OrderDAO,这没什么难的,直接new一个对象不就行了吗,于是我就这样了:

OrderDAO dao = new MySqlOrderDAOImpl();

轻松完成,最后项目完成,实施运营了,后来客户发现MySql不行了,要换成Oracle,这不难,我在写一个OrderDAO的实现类不就行了吗,于是我两指一挥:

class OracleOrderDAOImpl implements OrderDAO

可是这样就又来了一个麻烦就是在我的业务代码里面,我都是自己new的对象,都是“MySqlOrderDAOImpl”,

没问题,把 “MySqlOrderDAOImpl” 替换成”OracleOrderDAOImpl “就可以了

于是,全体动员,查找“MySqlOrderDAOImpl”然后替换成”OracleOrderDAOImpl “,这样浪费了半天,还可能有些地方还没替换呢

=============================================

后来就想到了spring的Ioc,在配置文件里配置OrderDAO的实现类就可以了,只要OrderDAO的有新的实现类,我只是在配置文件中修改一下就可以了,大概需要几秒钟吧,时间太快,没法计算啊(呵呵)

我知道楼主知道依赖注入,所有配置文件的细节就不说了,不知道我的分享对楼主是否有帮助
参考技术B 同意楼上的,
可能是一个单态注入一个非单态的原因造成的错误,
你可以用把单态改为非单态
或者
在单态的配置文件里写一个look-up-method 好像是这样写的标签加上就OK了
参考技术C 依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念。

注入和实例化不是一个概念。

spring注入操作会在你的被注入对象线程开始工作时,动态实例化其依赖类。来完成注入操作。
参考技术D 注入只需要改XML,实例化要改代码。

程序拿到其它地方了,比如说服务器上,服务器上没eclipse,我要改SQL连接的字符串,就改XML噻,比改代码方便噻。

Spring -- Spring配置文件详解(Bean实例化的三种方式IoC(控制反转) 与 DI(依赖注入)依赖注入详解)

01:Spring配置文件详解(Bean标签的基本配置(id,class)/ 范围配置 / 不同范围时的对象的创建时期 / Bean生命周期配置(生命周期方法) )

02: Spring配置文件详解(Bean实例化的三种方式、IoC(控制反转) 与 DI(依赖注入)、依赖注入详解)

03:Spring配置文件详解(Bean的依赖注入的数据类型(基本类型、引用类型、集合类型))

04: Spring配置文件详解(引入其他配置文件(分模块开发)、小结)

1. Bean实例化的三种方式


1.1 使用无参构造方法实例化(重点)


1.2 工厂静态方法实例化


1.3 工厂实例方法实例化


2. IoC(控制反转) 与 DI(依赖注入)

  • 控制反转IOC(Inversion of Control),是一种设计思想,DI(Dependency Injection 依赖注入)是IoC的具体实现。
  • 采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。
  • 控制反转是一种通过描述(xml或注解)并通过第三方去生产或获取特定对象的方式。在spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)
  • 所谓的IoC,一句话搞定 : 对象由Spring 来创建,管理,装配 !

3. 依赖注入详解


3.1 Bean的依赖注入入门

  1. 创建UserDaoImpl

  2. 创建UserServiceUserService内部在调用UserDaosave()方法

  3. UserServicelmplUserDaoImpl交给Spring Ioc容器管理

  4. 从Spring容器中获得UserService进行操作

  5. 分析
    目前UserService实例和UserDao实例都存在与Spring容器中,当前的做法是在容器外部获得UserService实例和UserDao实例,然后在程序中进行结合。


3.2 Bean的依赖注入分析

因为UserServiceUserDao都在Spring容器中,而最终程序直接使用的是UserService,所以可以在Spring容器中,将UserDao设置到UserService内部。


3.3 Bean的依赖注入(Dependency Injection,DI)概念


3.4 Bean的依赖注入方式(构造方法、set方法)


3.4.1 set方法注入

  1. 在UserServicelmpl中添加setUserDao方法

  2. 配置Spring容器调用set方法进行注入

  3. 测试代码

    public static void main(String[] args) {
        //解析beans.xml文件 , 生成管理相应的Bean对象
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //getBean : 参数即为spring配置文件中bean的id .
        UserServiceImpl user = (UserServiceImpl) context.getBean("userService");
        user.save();
    }
  1. 测试结果:

3.4.2 set方法注入的另外一种方式:P命名空间注入

P命名空间注入本质也是set方法注入,但比起上述的set方法注入更加方便,主要体现在配置文件中,如下:

  1. 首先,需要引入P命名空间:
  2. 修改注入方式
  3. 运行上面的测试代码:

3.4.3 构造方法注入

  1. 创建有参构造

  2. 配置Spring容器调用有参构造时进行注入

  3. 运行上面的测试代码:



以上是关于spring 注入 和 实例化的差别(别说没区别)的主要内容,如果未能解决你的问题,请参考以下文章

Spring依赖注入和NEW的差别

Spring -- Spring配置文件详解(Bean实例化的三种方式IoC(控制反转) 与 DI(依赖注入)依赖注入详解)

应届生应聘阿里,字节跳动必须知道Spring 依赖注入!你还没掌握吗?

SPRING01_概述配置文件bean实例化依赖注入的方式依赖注入的数据类型分模块开发API使用

Spring配置文件基本要点总结

Java Spring-IOC和DI