七--bean的自动装配

  • 自动装配是使用spring满足bean依赖的一种方法
  • spring会在应用上下文中为某个bean寻找其依赖的bean。

spring中有三种自动装配方式

(1)在xml中显示装配

(2)在java中显示装配

(3)隐式的自动装配bean【重要】

7.1环境搭建

(1)一个人有俩个臭物,猫狗

7.2自动装配

(2)byName自动装配

 <bean id="cat" class="com.sqt.pojo.Cat"/>
    <bean id="dog" class="com.sqt.pojo.Dog"/>
<!--
      byName的方式会自动在容器的上下文去查找,和自己对象set方法后面的值相对应的beanid
-->
    <bean id="people" class="com.sqt.pojo.People" autowire="byName">
        <property name="name" value="撒旦法"/>
<!--        报错,people初始化失败,这里不是赋值而是指向cat和dog的beans对象-->
<!--        <property name="cat" value="黑猫"/>-->
<!--        <property name="dog" value="白狗"/>-->
<!--        <property name="cat" ref="cat"/>-->
<!--        <property name="dog" ref="dog"/>-->
    </bean>

(3)byType只能在对象全局唯一时可以自动装配

  <bean id="cat" class="com.sqt.pojo.Cat"/>
    <bean id="dog" class="com.sqt.pojo.Dog"/>
<!--
byName的方式会自动在容器的上下文去查找,和自己对象属性相同的类bean-->
    <bean id="people" class="com.sqt.pojo.People" autowire="byType">
        <property name="name" value="撒旦法"/>
<!--        报错,people初始化失败,这里不是赋值而是指向cat和dog的beans对象-->
<!--        <property name="cat" value="黑猫"/>-->
<!--        <property name="dog" value="白狗"/>-->
<!--        <property name="cat" ref="cat"/>-->
<!--        <property name="dog" ref="dog"/>-->
    </bean>

小结:使用 byName的时候需要保证所有的bean的id是全局唯一的,并且在这个bean需要和自动注入的set方法的值一致

          使用 byType的时候需要保证所有的bean的class是全局唯一的,并且在这个bean需要和自动注入的属性类型一致的值一致

7.3使用注解进行自动装配

jdk1.5开始支持注解,spring2.5开始全面支持注解。

准备工作:利用注解的方式注入属性。

1.导入约束

xmlns:context="http://www.springframework.org/schema/context"

http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd

2.开启属性注解支持

<context:annotation-config/>

(1)@Autowired(需要导入spring的包)

@Autowired可以直接在属性上使用,也可以直接在set方法上使用

注意:使用@Autowired可以省略set方法,前提是你这个自动装配的属性在IOC(spring)容器中存在且符合名字byName

@Autowired
    private Cat cat;
    @Autowired
    private Dog dog;

科普

@Autowired(required=false) 说明:false,对象可以为null;true,对象必须存对象,不能为null。

如果允许对象为null,设置required = false,默认为true
@Autowired(required = false)
private Cat cat;

(2)@Qualifier

 @Autowired
    private Cat cat;
    @Autowired
    @Qualifier(value = "cat1")
    private Dog dog;

如果自动装配的环境复杂,自动装配无法通过一注解来实现@Autowired,那么我们可以使用@Qualifier和@autowired一起使用,

@Qualifier(value = "dog2")指定一个唯一的bean对象注入
  • @Autowired是根据类型自动装配的,加上@Qualifier则可以根据byName的方式自动装配
  • @Qualifier不能单独使用。

(3)@Resource

@Resource
    private Cat cat;
    @Resource
    private Dog dog;
  • @Resource如有指定的name属性,先按该属性进行byName方式查找装配;
  • 其次再进行默认的byName方式进行装配;
  • 如果以上都不成功,则按byType的方式自动装配。
  • 都不成功,则报异常。

小结:1.都是用来自动装配的,都可以放在属性字段上

2.@Autowired通过byName实现,而且必须要求这个对象存在

3.@Resourc默认通过byName实现,如果找不到,就通过byType实现;如果俩个都找不到就会报错

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值