依赖注入(depedency injection)
IOc/DI
IOC的作用:降低程序间的耦合(依赖关系)
DI:当类中需要用到其他类的对象的时候,由spring容器为我们提供,只需要配置好依赖关系即可
依赖关系的维护称为依赖注入
依赖注入的数据,分三类:
1.简单数据类型(基本数据类型以及封装类型和string)
注:spring对boolean类型进行容器错处理,值可以是true/false yes/no on/off 1/0 代表真/假
2.其他的bean类型(需要在spring中配置过的bean)
3.复杂数据类型(数组/集合/映射/property)
依赖注入的方式,分为三种:
1.使用构造方法进行注入:
spring使用构造方法进行注入时,使用constructor-arg 标签
属性:
index: 用于指定要注入的数据给构造方法中指定索引为参数赋值,索引的位置从0开始
name:用于指定给构造方法中指定名称的参数赋值
type:用于指定要注入的数据类型
value:用于提供基本类型的数据和String类型的数据
ref:用于指定其他的bean类型的数据
构造方法注入优势:
在获取bean对象时,以来的对象一定存在,可能为空,否则bean对象无法创建
劣势:当获取bean对象时,创建对象的方式发生改变,有些用不到的值,也必须提供
2.使用setter方法进行注入:
1).必须要有无参构造方法
2).必须要有setter方法
property属性:
name:指定需要调用的setter方法名,规则:去掉set关键字,把剩余的部分首字母大写转换成小写
value:
ref:
优势:创建对象使用默认的构造方法,需要哪些参数,就直接注入,无需提供额外的参数
与传统的JavaBean的写法更相似,程序开发人员更容易理解、接受。通过setter方法设定依赖关系显得更加直观、自然。
对于复杂的依赖关系,如果采用构造注入,会导致构造器过于臃肿,难以阅读。Spring在创建Bean实例时,需要同时实例化其依赖的全部实例,因而导致性能下降。而使用设值注入,则能避免这些问题。
尤其在某些成员变量可选的情况下,多参数的构造器更加笨重。
劣势:对象中某个属性必须要有值时,setter注入无法保证一定能够注入
3.使用注解方法进行注入:
1).用于创建对象
相对于在xml文件中定义的 元素
Component:用于把当前类对象存入spring容器中
@Component 相对于
属性:
value:相对bean中name,如果不写,则会提供默认的名称,该名称为类的首字母大写转小写
注意:使用该注解时,要配置一个扫描器,告诉spring,需要在哪些包下面查询相关注解
context:component-scan
由Component注解衍生出3个注解
Controller: 一般使用在表现层
Service: 一般用于业务层
Repository: 一般用于持久化
和Component注解作用和属性是一模一样.
这个三种注解时spring提供针对mvc三层开发,让我们的对三层更加有清晰的认识
使用位置:只能放在类上面
2).用于注入数据
相对于bean标签中 property 和 constructor-arg
AutoWired
作用:自动按照类型注入,只要容器中有唯一一个bean对象的类型和要注入的类型匹配,就可以进行注入
使用的位置:
构造方法
普通方法
字段
方法参数
Qualifier:
当按照自动类型注入时,找的类型对象不只一个是,且没有一个bean的名称和需要注入的参数名称一致时,
使用该注解指定需要注入的bean的名称
Resource:
按照名称注入,
name:
指定bean的名称
Value
作用:注入普通类型的数据,字符串,数字,boolean
属性:
指定数据的值,可以是普通类型,也可以使用spring中的SpEL,写法为:${表达式}
3).用于对象的作用范围
相对于bean中的scope属性
Scope
作用:用于指定bean的作用范围
属性:
value: 指定的作用范围,常用的取值:singleton prototype
4).用于对象的生命周期
相当于bean中的init 和destroy 属性
PostConstruct
作用: 用于指定init方法
PreDestroy
作用: 用于指定destroy方法