一、问题引入

官方为什么推荐构造器注入?

构造器注入和属性注入的区别是啥?

你知道有几种注入方式吗?

二  注入方式

spring的注入方式就两种 配置注入,注解注入(自动装配)

而这两种方式都实现了三种注入方法,访问器注入(setterXXX,newXXX,initXXX等),属性注入(filed),构造器注入(constructor)。

下图为注解注入的三种注入使用简易图。注意仅说明格式,该类使用是错误的,只需一种即可

ps.可以看出这三个注入,访问器和构造器都是一个方法,我们是不是可以是有两种注入?属性注入和方法注入?

那为什么我说三种,其实是基于配置注入区分的。(在自己的类注入,在自己的类注入其他类实例,在自己的类注入 其他类通过访问器生成的实例,没记错应该是这三个求打脸)

但是基于java8支持多注解,spring出了spring-boot,从而把配置丢掉的人不在小数

是的就是我。虽然配置化的项目泛用性强,但是配置一多,重复率比代码还高,所以盲目的追求项目的配置化并不好,spring就把这部分精简到代码里面了

三 注入方法的区别

通过优缺点的对比,相信大家能更加清楚的明白,为什么分三种

1.属性注入

优点:注入简单。简洁明了。(写了这么久代码,我发现简洁明了才是最重要的,语法糖都是异端)

缺点:循环依赖。重名依赖。依赖为空。被多方依赖的可能通过反射修改了内部的值。

2.构造器注入

优点:初始化。不可变性。数据检查,依赖不为空。

缺点:循环依赖。注入的一多就非常的臃肿。

3.访问器注入

优点:通过调用,可以让代码控制类依赖的顺序,解决循环依赖

缺点:注入的一多就非常的臃肿。

先反驳一下循环依赖,@Lazy标签了解下,所以第一个被排除的是访问器注入。而构造器注入和属性注入的循环依赖的报错提示也有点不同,前者编译时就报错,后者使用时报错

再说下重名依赖,@Qualifier标签了解下。

同理依赖为空,你写的代码为什么npe还好意思说是框架的缺点?这三个都是可以通过个人的代码技术解决的所以就放在一起了。

被多方依赖的可能通过反射修改了内部的值,也就是构造器注入的初始化和不可变性,该方法确实在多人协同写代码(调用同一个service时)有很大的帮助

四 为什么官方推荐构造器注入 ?

1、说到底,不可变性,多人协同代码安全,只是菜鸡的自我安慰。国外顶级项目的开发团队,可能还不如我国一个外包项目组的人多。

2、代码写多了,当你发现周围的老是频繁的改动数据,线程不安全等,最简单的方法是换队友或者单干,因为你的一点点迁就,只会发现他有更多更大的问题。

3、官方着重的是数据检查,非空检查,循环依赖检查,重名检查等,正如前面说的

1

构造器注入和属性注入的循环依赖的报错提示也有点不同,前者编译时就报错,后者使用时报错

4、尽量把错误在编译时就发现才是最好好的开发习惯!机器的可信度远高于人类!

推荐构造器注入的理由就是这么简单

五 非spring下的属性,构造器和访问器创建对象的对比

1、属性是类加载创建对象,构造器是类初始化创建对象,访问器是创建指定对象。

访问器显然是需求指定的实现,不在讨论范围之内。那么属性和构造器呢?

显然加载了不使用,只是在浪费jvm的资源。所以使用构造器创建对象,性能更好。

ps.为什么这个和spring无关?

spring的基础ioc知道吧?所有的spring bean本质上我们都是反射调用,所以无论是构造器还是属性,对象早已被初始化到spring容器之了。

spring 依赖注入总结相关推荐

  1. arg是什么函数_java后端开发三年!你还不了解Spring 依赖注入,凭什么给你涨薪...

    前言 前两天和一个同学吃饭的时候同学跟我说了一件事,说他公司有个做了两年的人向他提出要涨薪资,他就顺口问了一个问题关于spring依赖注入的,那个要求涨薪的同学居然被问懵了...事后回家想了想这一块确 ...

  2. Java程序员进阶——Spring依赖注入原理分析

    Spring依赖注入原理分析 下面谈谈Spring是如何实现反转模式IOC或依赖注入模式DI: 平时,我们需要生成一个对象,使用new语法,如一个类为A public class A{public v ...

  3. spring 依赖注入

    Technorati 标记: spring,依赖注入,DI,ioc 平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的 ...

  4. java接口注入对象的意义_Java Web系列:Spring依赖注入基础

    一.Spring简介 1.Spring简化Java开发 Spring Framework是一个应用框架,框架一般是半成品,我们在框架的基础上可以不用每个项目自己实现架构.基础设施和常用功能性组件,而是 ...

  5. spring依赖注入原理(转载)

    关于spring依赖注入原理的文章在网络上已经有很多,我要写的这篇文章原文出自http://taeky.iteye.com/blog/563450,只所以再一次写下来只是为了一为自己收藏,方便以后的复 ...

  6. Spring依赖注入:注解注入总结

    更多11 spring 依赖注入 注解 java 注解注入顾名思义就是通过注解来实现注入,Spring和注入相关的常见注解有Autowired.Resource.Qualifier.Service.C ...

  7. spring依赖注入_Spring源码阅读:Spring依赖注入容器

    依赖注入 依赖注入是Spring框架最核心的能力,Spring框架提供的AOP,WebMVC等其它功能都是以依赖注入容器作为基础构建的,Spring依赖注入容器类似于一个用于组装对象的框架内核,任何应 ...

  8. diy实现spring依赖注入

    [README] 本文diy代码实现了 spring 依赖注入,一定程度上揭示了依赖注入原理: [1]控制反转-Inversion of Control 是一种编码思想,简而言之就是 应用程序A可以使 ...

  9. spring依赖注入_Spring依赖注入

    spring依赖注入 介绍: 在设计良好的Java应用程序中,这些类应尽可能独立. 这样的设计提高了组件的可重用性. 它还使对各个组件进行单元测试变得更加容易. 依赖注入的概念促进了Java对象之间的 ...

  10. spring依赖注入_Spring的依赖注入陷阱

    spring依赖注入 Spring框架中有三种注入变量: 基于二传手的注射 基于构造函数的注入 基于现场的注入 这些机制中的每一种都有优点和缺点,并且不仅只有一种正确的方法. 例如现场注入: @Aut ...

最新文章

  1. Windows Mobile 获取基站信息(LAC,CellID)
  2. 【多线程】线程池拒绝策略详解与自定义拒绝策略
  3. 关于Authorware的十二种使用技巧
  4. typecho 去掉index.php,typecho如何去掉index.php
  5. MVC三层架构(详解)
  6. php检查在线用户,php – 检查用户是否在线laravel
  7. 利用Scrapy框架爬取落网上的音乐文件
  8. php返回成功信息msg_使用PHP实现的服务端socket
  9. 手机照片局部放大镜_手机摄影,竟然有3种对焦方式,想拍出专业水准,你必须了解...
  10. linux清除asm磁盘分区,ASM Diskgroup添加与删除
  11. ftp 501错误_分享,HTTP协议错误代码大全
  12. 北京理工大学OJ的Mid难度题目的题解
  13. 启动不了 驱动程序签字功能,bios关闭驱动数字签名 如何在bios禁用驱动程序签名,装系统,启动行为那个无效?...
  14. 阿里企业邮箱使用第三方客户端同步邮件的坑
  15. 计算机右边键盘数字无效,巧妙解决电脑键盘右边的数字键失灵问题
  16. 天地图API搜索。定位等
  17. 如何调节肠道菌群?常见天然物质、益生菌、益生元的介绍
  18. 动态规划-背包问题求解过程【代码 from eason】
  19. MFC中Combo控件的使用
  20. C语言及程序设计[套餐]课程主页

热门文章

  1. 001@多用派发队列,少用同步锁
  2. 英语发音规则---Z字母
  3. 关于网络编程的一些问题
  4. Revit API创建标高,单位转换
  5. MSN Editor 0DAY
  6. 小型车、中型车、大型车、重型车的区分和定义见下表:
  7. 把MSSQL2005转换成MSSQL2000
  8. 一份数据分析学习清单.xls
  9. ob服务器维修视频,教你如何使用OB系统 还在看转播?你OUT了!
  10. RabbitMQ消费者代码