什么是依赖注入

在以前的java开发中,某个类中需要依赖其它类的方法时,通常是new一个依赖类再调用类实例的方法,这种方法耦合度太高并且不容易测试,spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中。

依赖注入的方式

依赖注入有3种方式:构造器注入、set注入和注解注入。

1.构造器注入

构造器注入保证一些必要的属性在Bean实例化时就得到设置,并且确保了Bean实例在实例化后就可以使用。

使用方式:

在类中,不用为属性设置setter方法,但是需要生成该类带参的构造方法。

在配置文件中配置该类的bean,并配置构造器,在配置构造器中用到了节点,该节点有四个属性

index:指定注入属性的顺序索引,从0开始;

type:指该属性所对应的类型;

ref:引用的依赖对象;

value:当注入的不是依赖对象,而是基本数据类型时,就用value;

例子1:

public classSpringAction {//注入对象springDao

privateSpringDao springDao;privateUser user;publicSpringAction(SpringDao springDao,User user){this.springDao =springDao;this.user =user;

System.out.println("构造方法调用springDao和user");

}public voidsave(){

user.setName("卡卡");

springDao.save(user);

}

}

其中index属性表示注入的bean在构造方法中的参数顺序。

例子2:

有时需要联合使用type和index才能确定匹配项和构造函数入参的对应关系,看下面的代码。

public Car(String brand, String corp,doubleprice){this.brand=brand;this.corp=corp;this.price=price;

}public Car(String brand, String corp,intmaxSpeed){this.brand=brand;this.corp=corp;this.maxSpeed=maxSpeed;

}

这里,Car拥有两个重载的构造函数,它们都有三个入参。针对这种情况,按照入参索引的配置方式又难以满足要求了,这时需要联合使用的type和index才能解决问题

对于由于参数数目相同而类型不同所引起的潜在配置歧义问题,Spring容器可以正确启动且不会给出报错信息,它将随机采用一个匹配的构造函数实例化Bean,而被选择的构造函数可能并不是用户所希望的。因此,必须特别谨慎,以避免潜在的错误。

2.set注入

set注入要求Bean提供一个默认的构造函数,并为需要注入的属性提供对应的Setter方法。

Spring先调用Bean的默认构造函数实例化Bean对象,然后通过反射的方式调用Setter方法注入属性值。

假设Bean显示定义了一个带参的构造函数,则需要同时提供一个默认无参的构造函数,否则使用属性注入时将抛出异常。

例子1:

packagecom.bless.springdemo.action;public classSpringAction {//注入对象springDao

privateSpringDao springDao;//一定要写被注入对象的set方法

public voidsetSpringDao(SpringDao springDao) {this.springDao =springDao;

}public voidok(){

springDao.ok();

}

}

这里不再使用“constructor-arg”而是使用“property”属性。

3.注解注入

注解注入其实是使用注解的方式进行构造器注入或者set注入。

spring2.5开始提供了基于注解(Annotation-based)的配置,我们可以通过注解的方式来完成注入依赖。在Java代码中可以使用 @Resource或者@Autowired注解方式来经行注入。

虽然@Resource和@Autowired都可以来完成注入依赖,但它们之间是有区别的:

@Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入;

@Autowired默认是按照类型装配注入的,如果想按照名称来转配注入,则需要结合@Qualifier一起使用;

@Resource注解是又J2EE提供,而@Autowired是由Spring提供;

例子:

packagecom.bless.springdemo.action;public classSpringAction {//注入对象springDao

@ResourceprivateSpringDao springDao;//不需要要写被注入对象的set方法,spring会帮你get/set

public voidok(){

springDao.ok();

}

}

的作用是开启注解。

@Autowired的同理,只不过默认是按照类型装配注入。

补充:

@Autowired 可以对成员变量、方法以及构造函数进行注释。那么对成员变量和构造函数进行注释又有什么区别呢?

先来看下面一段代码:

@AutowiredprivateUser user;privateString school;publicUserAccountServiceImpl(){this.school =user.getSchool();

}

这段代码执行会报错,因为Java类会先执行构造方法,然后再给注解了@Autowired 的user注入值,所以在执行构造方法的时候,就会报错。

解决办法是,使用构造器注入,如下:

privateUser user;privateString school;

@AutowiredpublicUserAccountServiceImpl(User user){this.user =user;this.school =user.getSchool();

}

参考:

java 构造器注入_Spring学习笔记1—依赖注入(构造器注入、set注入和注解注入)...相关推荐

  1. SpringMVC:学习笔记(11)——依赖注入与@Autowired

    SpringMVC:学习笔记(11)--依赖注入与@Autowired 使用@Autowired 从Spring2.5开始,它引入了一种全新的依赖注入方式,即通过@Autowired注解.这个注解允许 ...

  2. JAVA基础与高级学习笔记

    JAVA基础与高级学习笔记 /记录java基础与高级,除了较简单的内容,没有必要记录的没有记录外,其余的都记录了/ java初学者看这一篇就够了,全文 6万+ 字. JAVA基础 java会出现内存溢 ...

  3. 【Java】函数式编程学习笔记——Stream流

    学习视频:https://www.bilibili.com/video/BV1Gh41187uR?p=1 (1)[Java]函数式编程学习笔记--Lambda表达式 (2)[Java]函数式编程学习笔 ...

  4. 第10课:底实战详解使用Java开发Spark程序学习笔记

    第10课:底实战详解使用Java开发Spark程序学习笔记 本期内容: 1. 为什么要使用Java? 2. 使用Java开发Spark实战 3. 使用Java开发Spark的Local和Cluster ...

  5. 零基础学习Java开发,这些学习笔记送给你

    因为Java具备很多特点,并且在企业中被广泛应用为此很多小伙伴选择学习Java基础开发,但是零基础学习Java技术开发需要我们制定Java学习路线图对于我们之后的学习会非常有帮助. 零基础学习Java ...

  6. Java 8 函数式编程学习笔记

    Java 8 函数式编程学习笔记 @(JAVASE)[java8, 函数式编程, lambda] Java 8 函数式编程学习笔记 参考内容 Java 8中重要的函数接口 扩展函数接口 常用的流操作 ...

  7. java 编程思想 多线程学习笔记

    java 编程思想 多线程学习笔记 一.如何创建多线程? 1.继承 java.lang.Thread 类 2.实现 java.lang.Runnable 接口 3.Callable接口 总之,在任何线 ...

  8. Java并发编程艺术学习笔记(五)

    Java并发编程艺术学习笔记(五) Java并发容器和框架 Java为开发者也提供了许多开发容器和框架,可以从每节的原理分析来学习其中精妙的并发程序. 一.ConcurrentHashMap的实现原理 ...

  9. 《Java编程思想》学习笔记【一对象导论】

    重头学习Java,大一没怎么学,大二上课也没听.(流下不学无术的眼泪) 所有编程语言都提供抽象机制,我们所能解决的问题的复杂性直接取决于抽象的类型和质量. 汇编语言是对底层机器的轻微抽象," ...

最新文章

  1. python爬取豆瓣电影并分析_爬取豆瓣电影top250提取电影分类进行数据分析
  2. 源代码主干分支开发四大模式
  3. SpringBoot项目中静态资源加载失败,那可能是自定义配置类继承了WebMvcConfigurationSupport这个类
  4. phpsocket服务端和VC客户端通信实例
  5. LiveVideoStack秋季招聘(编辑、会务运营、项目经理)
  6. WP8开发学习笔记动态修改启动时导航的第一个页面(如登录前启动页为LoginPage,登录后变为MainPage)...
  7. Matlab中求数据概率分布的方法
  8. 用 Python脚本实现数据库数据恢复
  9. openwrt首次登录密码_什么是路由器登录密码 路由器登录密码介绍【详解】
  10. Ubuntu Linux下使用锐捷认证的方法
  11. S - C语言实验——余弦
  12. android触摸事件触摸点坐标,Android开发——触摸事件TouchEvent详解及其应用
  13. 弹幕库 Danmuku依赖
  14. 论文参考文献尾注引用方法
  15. 一招解决 npm i 安装 node-sass 出现错误
  16. Hive 性能调优大全
  17. php symlink,php函数symlink详解
  18. 过程裁剪的理念和表现形式
  19. python伪装浏览器https_Selenium中通过修改User-Agent标识将PhantomJS伪装成Chrome浏览器...
  20. 公司金融01.现值与贴现

热门文章

  1. 鸿蒙os净水器,搭载华为鸿蒙OS智能家居产品已上市,贴有认证标
  2. 如何避免CMDB沦为数据孤岛?
  3. TCP连接、HTTP学习笔记
  4. 购买高分红股票是不是一个好的投资策略?
  5. 顶象业务安全大讲堂全新升级,挖洞大神喊你来get 挖洞秘籍啦!
  6. 数字水印Java写_Java实现数字水印
  7. docker buildx 构建arm64架构镜像
  8. ipv6 压缩 java_IPv6 地址语法
  9. 软考笔记(五)高级系统架构师/分析师:系统需求工程 需求分析
  10. http、https以及状态码超全详解