Skip to content

Spring基础-DI #25

Description

@cyjxiaozhi

一、依赖和依赖注入
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 方法注入
image
image

(3)字段注入
image
(4)基于 Java 配置类注入
image
(5)自动装配(@Autowired@resource等)
image
(6)集合注入
image

二、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进行指定

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions