【概念题】java依赖注入(DI)与自动装配(Autowired)之间的关系

一、什么是控制反转?

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

二、依赖注入与装配的关系:

依赖注入的本质就是装配,装配是依赖注入的具体行为,这就是两者的关系。

三、依赖注入有两种方式:

1、构造器注入

<bean id="hello" class="com.maven.Hello"><constructor-arg value="hello" /></bean>这是使用构造器注入来装配bean

2、setter注入

<bean id="hello" class="com.maven.Hello" p:hello="hello" />这是使用setter注入,p是spring的名称空间,可以用来代替<property>标签。

四、装配的概念

创建应用对象之间协作关系的行为称为装配。也就是说当一个对象的属性是另一个对象时,实例化时,需要为这个对象属性进行实例化,这就是装配。如果一个对象只通过接口来表明依赖关系,那么这种依赖就能够在对象本身毫不知情的情况下,用不同的具体实现进行切换。

五、@Autowired注解

在传统的依赖注入配置中,我们必须要明确要给属性装配哪一个bean的引用,一旦bean很多,就不好维护了。基于这样的场景,spring使用注解来进行自动装配,解决这个问题。

自动装配就是开发人员不必知道具体要装配哪个bean的引用,这个识别的工作会由spring来完成。与自动装配配合的还有“自动检测”,这 个动作会自动识别哪些类需要被配置成bean,进而来进行装配。这样我们就明白了,自动装配是为了将依赖注入“自动化”的一个简化配置的操作。

六、装配方式共有四种:byName, byType, constructor, autodetect

  • byName     就是会将与属性的名字一样的bean进行装配 (常用)
  • byType       就是将同属性一样类型的bean进行装配 (常用)
  • constructor 就是通过构造器来将类型与参数相同的bean进行装配
  • autodetect  就是constructor与byType的组合,会先进行constructor,如果不成功,再进行byType

具体选择哪一种装配方式,需要配置<bean>标签的autowire属性,如果没有配置,默认是byName类型,就是会根据属性的名字来进行自动装配。

自动装配时,装配的bean必须是唯一与属性进行吻合的,不能多也不能少,有且只有一个可以进行装配的bean,才能自动装配成功。否则会抛出异常。如果要统一所有bean的自动装配类型,可以在<beans>标签中配置default-autowire属性。当然如果配置了autowire属性,我们依然可以手动装配属性,手动装配会覆盖自动装配。

七、 常用的自动装配注解有以下五种:

@Autowired与@Qualifier是spring提供的,@Inject、@Named与@Resource 都是java ee提供的。

1、@Autowired

@Autowired注解是byType类型的,这个注解可以用在属性上面,setter上面以及构造器上面。使用这个注解时,就不需要在类中为属性添加setter方法了。但是这个属性是强制性的,也就是说必须得装配上,如果没有找到合适的bean能够装配上,就会抛出异常。此时需要进一步明确要装配哪一个Bean,这时可以组合使用@Qualifier注解,值为Bean的名字即可。

2、@Qualifier

@Qualifier注解使用byName进行装配,这样可以在多个类型一样的bean中,明确使用哪一个名字的bean来进行装配,@Qualifier注解起到了缩小自动装配候选bean的范围的作用。

3、@Inject

@Inject也有一个组合的注解,就是@Named注解,与@Qualifier作用一样,也是byName,但是不是spring的,是java ee标准的

4、@Named

5、@Resource

@Resource 这个注解也是java ee的,也是byName类型的,原理同@Qualifier和@Named是一样的。

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值