spring装配与Autowired自动装备

**首先,确定一下

装配的概念

。**

《spring实战》中给装配下了一个定义:创建应用对象之间协作关系的行为称为装配。也就是说当一个对象的属性是另一个对象时,实例化时,需要为这个对象属性进行实例化。这就是装配。如果一个对象只通过接口来表明依赖关系,那么这种依赖就能够在对象本身毫不知情的情况下,用不同的具体实现进行切换。但是这样会存在一个问题,在传统的依赖注入配置中,我们必须要明确要给属性装配哪一个bean的引用,一旦bean很多,就不好维护了。基于这样的场景,spring使用注解来进行自动装配,解决这个问题。自动装配就是开发人员不必知道具体要装配哪个bean的引用,这个识别的工作会由spring来完成。与自动装配配合的还有“自动检测”,这 个动作会自动识别哪些类需要被配置成bean,进而来进行装配。这样我们就明白了,自动装配是为了将依赖注入“自动化”的一个简化配置的操作。

@Autowired这个是自动装配,是为了避免繁琐的xml配置而设计的,实现很简单,就是根据注解生成beanfactory的匹配规则,有几种规则,但有一些缺点,给你一些我曾经的笔记吧,带译文。自动扫描装配Bean今天来整理一下Spring的自动装配 autowire一节,在这里我们要解决以下问题:
§1 什么是自动装配?
§2 自动装配的意义?
§3 自动装配有几种类型?
§4 如何启用自动装配?

§1 什么是自动装配?
引用 Spring IoC容器可以自动装配(autowire)相互协作bean之间的关联关系。因此,如果可能的话,可以自动让Spring通过检查BeanFactory中的内容,来替我们指定bean的协作者(其他被依赖的bean)。 简而言之,就是对于bean当中引用的其他bean不需要我们自己去配置它改使用哪个类,Spring 的自动装配可以帮助我们完成这些工作

§2 自动装配的意义?

其中优点包括:
自动装配能显著减少配置的数量。不过,采用bean模板(见这里)也可以达到同样的目的。 自动装配可以使配置与java代码同步更新。例如,如果你需要给一个java类增加一个依赖,那么该依赖将被自动实现而不需要修改配置。因此强烈推荐在开发过程中采用自动装配,而在系统趋于稳定的时候改为显式装配的方式。

§3 自动装配有几种类型? .

模式 说明 no 默认不使用autowiring。 必须显示的使用”“标签明确地指定bean合,对于部署给予更大的 控制和明了。

- byName
根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自 动装配。例如,在bean定义中将 autowire设置为by name,而该bean包含master属性(同时提供 setMaster(..)方法),Spring就会查找名为master的bean定义,并用它来装配给master属性。

- byType
如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。如果存在多个该类型的 bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean, 则什么事都不发生,属性也不会被设置。如果你不希望这样,那么可以通过设置 dependency-check=”objects”让Spring抛出异常。

- constructor
与byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类
型一致的bean,那么将会抛出异常。

- autodetect
通过bean类的自省机制(introspection)来决定是使用constructor还是byType方式进行自动装配。
如果发现默认的构造器,那么将使用byType方式。

§4 如何启用自动装配?
你可以参照以下的配置去启用自动装配 引用

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd" default-autowire="byType" > 

当然,这里的byType你可以更改为其他你想要的装配类型。

§5 自动装配将引发的问题?
自动装配的一些缺点: 尽管自动装配比显式装配更神奇,但是,正如上面所提到的,Spring会尽量避免在装配不明确的时候进行猜测,因为装配不明确可能出现难以预料的结果,而且Spring所管理的对象之间的关联关系也不再能清晰的进行文档化。 对于那些根据Spring配置文件生成文档的工具来说,自动装配将会使这些工具没法生成依赖信息。 自动装配可以减轻配置的工作量,但同时使得配置文件的可读性变得很差,因为你不可能从配置文件中获知这些对象之间得依赖关系,从而维护困难! 注意: 当根据类型进行自动装配的时候,容器中可能存在多个bean定义跟自动装配的setter方法和构造器参数类型匹配。这样就会存在模棱两可的问题。如果bean定义不唯一,装配时就会抛出异常。
解决方法

  1. 通过设定bean定义中的’autowire-candidate’属性显式的设置为’true’ 或 ‘false’来设置其是否为被自动装配 对象。

  2. 使用对bean名字进行模式匹配来对自动装配进行限制,其做法是在元素的 ‘default-autowire-candidates’ 属性中进行设置。可以使用通配符,如以’Repository’结尾的bean, 那么可以设置为”*Repository“。

  3. 通过在bean定义中设置’primary’属性为’true’来将该bean设置为首选自动装配bean。 如何使用Spring autowire请取决于你的项目设计。

自动装配的四种注解

常用的自动装配注解有以下几种:

  • @Autowired
  • @Resource
  • @Inject
  • @Qualifier
  • @Named

    @Autowired注解是byType类型的,这个注解可以用在属性上面,setter方面上面以及构造器上面。使用这个注解时,就不需要在类中为属性添加setter方法了。但是这个属性是强制性的,也就是说必须得装配上,如果没有找到合适的bean能够装配上,就会抛出异常。这时可以使用required=false来允许可以不被装配上,默认值为true。当required=true时,@Autowired要求必须装配,但是在没有bean能装配上时,就会抛出异常NoSuchBeanDefinitionException,如果required=false时,则不会抛出异常。另一种情况是同时有多个bean是一个类型的,也会抛出这个异常。此时需要进一步明确要装配哪一个Bean,这时可以组合使用@Qualifier注解,值为Bean的名字即可。@Qualifier注解使用byName进行装配,这样可以在多个类型一样的bean中,明确使用哪一个名字的bean来进行装配。@Qualifier注解起到了缩小自动装配候选bean的范围的作用。注意:@Autowired注解是spring提供的,所以会依赖spring的包。还有一个byType的注解@Inject,与@Autowired注解作用一样,也是byType类型,而且是Java ee提供的,完全可以代替@Autowired注解,但是@Inject必须是强制装配的,没有required属性,也就是不能为null,如果不存在匹配的bean,会抛出异常。@Autowired与@Qualifier可以组合使用,@Inject也有一个组合的注解,就是@Named注解,与@Qualifier作用一样,也byName,但是不是spring的,是java ee标准的。这样就出现了两套自动装配的注解组合,@Autowired与@Qualifier是spring提供的@Inject与@Named是Java EE的。但是@Qualifier注解在java ee中也有一样,作用与spring的@Qualifier注解一模一样,只是所在的包不一样。不过建议大家使用spring的。最后还有一个@Resouce注解, 这个注解也是Java ee的,也是byName类型的,原理同@Qualifier和@Named是一样的。
    举例:

@Autowired
@Qualifier("iceCream")
<!-- 要装配的bean的名字为iceCream 默认为类名首字母小写-->
public void setDessert(Dessert dessert){
    this.desert=desert
}

依赖注入与装配

依赖注入的本质就是装配,装配是依赖注入的具体行为。

依赖注入不是目的,它是一系列工具和手段,最终的目的是帮助我们开发出松散耦合(loose coupled)、可维护、可测试的代码和程序。这条原则的做法是大家熟知的面向接口,或者说是面向抽象编程。

依赖注入有两种形式:构造器注入和setter注入
1.构造器注入对象属性

<bean id="text" class="com.maven.Text" />
        <bean id="hello" class="com.maven.Hello"><constructor-arg ref="text" /></bean>

2.属性注入对象属性

  <bean id="hello" class="com.maven.Hello">
      <property name="text" ref="text" />
  </bean>

3 属性为List类型或数组类型属性注入

<bean id="hello" class="com.maven.Hello">
     <property name="persons">
           <list>
               <ref bean="zhangsan" />
               <ref bean="zhangsan" />
           </list>
     </property>
</bean>
 list元素的成员也可以是<value><bean><null />,其中<bean>是用来装配匿名bean的,<null />是用来装配null值的。匿名bea
n会在下面介绍。

4.属性为set类型的属性注入
set类型与list类型注入是一样的,只是标签改成就可以了。并且里面的元素是不能重复的。

5.属性为map类型的属性注入

<bean id="hello" class="com.maven.Hello">
      <property name="article">
          <map>
              <entry key="title" value-ref="text" />
              <entry key="title" value-ref="text" />
          </map>
      </property>
</bean>

6.属性为Properties类型的属性注入

<bean id="hello" class="com.maven.Hello">
   <property name="article">
       <props>
            <prop key="title">I LOVE YOU</prop>
            <prop key="title">I HATE YOU</prop>
       </props>
   </property>
</bean

结合http://blog.csdn.net/u012843873/article/details/52399206
https://www.zhihu.com/question/19719092
http://www.cnblogs.com/yangecnu/p/Introduce-Dependency-Injection.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值