一、依赖和依赖注入
Spring IoC容器的依赖有两层含义:Bean依赖容器和容器注入Bean的依赖资源:
Bean依赖容器:也就是说Bean要依赖于容器,这里的依赖是指容器负责创建Bean并管理Bean的生命周期,正是由于由容器来控制创建Bean并注入依赖,也就是控制权被反转了,这也正是IoC名字的由来,此处的有依赖是指Bean和容器之间的依赖关系。
容器注入Bean的依赖资源:容器负责注入Bean的依赖资源,依赖资源可以是Bean、外部文件、常量数据等,在Java中都反映为对象,并且由容器负责组装Bean之间的依赖关系,此处的依赖是指Bean之间的依赖关系,可以认为是传统类与类之间的“关联”、“聚合”、“组合”关系。
前边IoC一章我们已经了解了Bean依赖容器,那容器如何注入Bean的依赖资源,Spring IoC容器注入依赖资源主要有以下方式:
(1)构造函数注入
这个和之前的一样
(2)Setter 方法注入


(3)字段注入

(4)基于 Java 配置类注入

(5)自动装配(@Autowired、@resource等)

(6)集合注入

二、DI的其他知识
1.循环依赖
循环依赖是设计上的问题
2.延迟初始化Bean
延迟初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用时才创建及初始化Bean。@lazy这个注解可以解决循环依赖
3.使用depends-on
depends-on是指指定Bean初始化及销毁时的顺序,使用depends-on属性指定的Bean要先初始化完毕后才初始化当前Bean,由于只有“singleton”Bean能被Spring管理销毁,所以当指定的Bean都是“singleton”时,使用depends-on属性指定的Bean要在指定的Bean之后销毁。
三、实际开发中
实际开发中更推荐构造器注入方式来注入依赖
@Autowired和@resource以及@Inject等注解注入有何区别?
对于@Autowired来说
1、@Autowired是Spring自带的注解,通过AutowiredAnnotationBeanPostProcessor 类实现的依赖注入
2、@Autowired可以作用在CONSTRUCTOR、METHOD、PARAMETER、FIELD、ANNOTATION_TYPE
3、@Autowired默认是根据类型(byType )进行自动装配的
4、如果有多个类型一样的Bean候选者,需要指定按照名称(byName )进行装配,则需要配合@qualifier。指定名称后,如果Spring IOC容器中没有对应的组件bean抛出NoSuchBeanDefinitionException。也可以将@Autowired中required配置为false,如果配置为false之后,当没有找到相应bean的时候,系统不会抛异常
对于@resource来说
1、@resource是JSR250规范的实现,在javax.annotation包下
2、@resource可以作用TYPE、FIELD、METHOD上
3、@resource是默认根据属性名称进行自动装配的,如果有多个类型一样的Bean候选者,则可以通过name进行指定进行注入
对于@Inject来说
1、@Inject是JSR330 (Dependency Injection for Java)中的规范,需要导入javax.inject.Inject jar包 ,才能实现注入
2、@Inject可以作用CONSTRUCTOR、METHOD、FIELD上
3、@Inject是根据类型进行自动装配的,如果需要按名称进行装配,则需要配合@nAmed;
总结:
1、@Autowired是Spring自带的,@resource是JSR250规范实现的,@Inject是JSR330规范实现的
2、@Autowired、@Inject用法基本一样,不同的是@Inject没有required属性
3、@Autowired、@Inject是默认按照类型匹配的,@resource是按照名称匹配的
4、@Autowired如果需要按照名称匹配需要和@qualifier一起使用,@Inject和@nAmed一起使用,@resource则通过name进行指定
一、依赖和依赖注入
Spring IoC容器的依赖有两层含义:Bean依赖容器和容器注入Bean的依赖资源:
前边IoC一章我们已经了解了Bean依赖容器,那容器如何注入Bean的依赖资源,Spring IoC容器注入依赖资源主要有以下方式:


(1)构造函数注入
这个和之前的一样
(2)Setter 方法注入
(3)字段注入




(4)基于 Java 配置类注入
(5)自动装配(@Autowired、@resource等)
(6)集合注入
二、DI的其他知识
1.循环依赖
循环依赖是设计上的问题
2.延迟初始化Bean
延迟初始化也叫做惰性初始化,指不提前初始化Bean,而是只有在真正使用时才创建及初始化Bean。@lazy这个注解可以解决循环依赖
3.使用depends-on
depends-on是指指定Bean初始化及销毁时的顺序,使用depends-on属性指定的Bean要先初始化完毕后才初始化当前Bean,由于只有“singleton”Bean能被Spring管理销毁,所以当指定的Bean都是“singleton”时,使用depends-on属性指定的Bean要在指定的Bean之后销毁。
三、实际开发中
实际开发中更推荐构造器注入方式来注入依赖
@Autowired和@resource以及@Inject等注解注入有何区别?
对于@Autowired来说
1、@Autowired是Spring自带的注解,通过AutowiredAnnotationBeanPostProcessor 类实现的依赖注入
2、@Autowired可以作用在CONSTRUCTOR、METHOD、PARAMETER、FIELD、ANNOTATION_TYPE
3、@Autowired默认是根据类型(byType )进行自动装配的
4、如果有多个类型一样的Bean候选者,需要指定按照名称(byName )进行装配,则需要配合@qualifier。指定名称后,如果Spring IOC容器中没有对应的组件bean抛出NoSuchBeanDefinitionException。也可以将@Autowired中required配置为false,如果配置为false之后,当没有找到相应bean的时候,系统不会抛异常
对于@resource来说
1、@resource是JSR250规范的实现,在javax.annotation包下
2、@resource可以作用TYPE、FIELD、METHOD上
3、@resource是默认根据属性名称进行自动装配的,如果有多个类型一样的Bean候选者,则可以通过name进行指定进行注入
对于@Inject来说
1、@Inject是JSR330 (Dependency Injection for Java)中的规范,需要导入javax.inject.Inject jar包 ,才能实现注入
2、@Inject可以作用CONSTRUCTOR、METHOD、FIELD上
3、@Inject是根据类型进行自动装配的,如果需要按名称进行装配,则需要配合@nAmed;
总结:
1、@Autowired是Spring自带的,@resource是JSR250规范实现的,@Inject是JSR330规范实现的
2、@Autowired、@Inject用法基本一样,不同的是@Inject没有required属性
3、@Autowired、@Inject是默认按照类型匹配的,@resource是按照名称匹配的
4、@Autowired如果需要按照名称匹配需要和@qualifier一起使用,@Inject和@nAmed一起使用,@resource则通过name进行指定