Spring-bean的自动装配

  • 自动装配是Spring满足bean依赖的一种方式

  • Spring会在上下文中自动寻找,并自动给bean装配属性

在Spring中有三种装配方式

  • xml配置

  • java配置

  • 隐式的自动装配bean【重要】

7.1、ByName自动装配

在容器上下文中查找,和自己对象名set后面的值对应的bean id

<bean id="cat" class="com.mosang.pojo.cat"/>
<bean id="dog" class="com.mosang.pojo.dog"/>
​
<bean id="person" class="com.mosang.pojo.person" autowire="byName">
    <property name="name" value="小墨"/>
</bean>

7.2、ByType自动装配

bytype:在容器上下文中查找,和自己对象属性类型相同的bean,id可省略

<bean class="com.mosang.pojo.cat"/>
<bean class="com.mosang.pojo.dog"/>
​
<bean id="person" class="com.mosang.pojo.person" autowire="byType">
    <property name="name" value="小墨"/>
</bean>

小结:

  • byname时需要保证所有bean的id唯一,并且bean需要和自动装配的属性的set方法的值一致

  • bytype时需要保证所有bean的class唯一,并且bean需要和自动装配的属性的类型一致

7.3、使用注解实现自动装配

@Autowired注解

  1. 导入约束

    context约束

  2. 配置注解支持

     <context:annotation-config/>
    @Autowired
    private cat cat;
    @Autowired
    @Qualifier(value = "dog11")
    private dog dog;
    private String name;
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
            https://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            https://www.springframework.org/schema/context/spring-context.xsd">
    ​
        <context:annotation-config/>
        <bean id="cat" class="com.mosang.pojo.cat"/>
        <bean id="dog" class="com.mosang.pojo.dog"/>
        <bean id="dog11" class="com.mosang.pojo.dog"/>
        <bean id="person" class="com.mosang.pojo.person" autowire="byType"/>
    </beans>

    直接在属性上使用即可,也可以在set方式上使用.

    使用autowired可以不写set方法,前提是容器中存在且符合byname

    @Autowired智能识别

  • 当注入IOC容器中该类型只有一个时,通过bytpe装配

  • 当注入容器时存在多个同一类型的对象时,根据byname装配

如果@Autowired自动装配的环境比较复杂,自动装配无法通过一个注解完成时,我们可以使用@Qualifier(value="xxx")去配置@Autowired使用,指定唯一的bean对象注入

@Resource注解

@Resource
private cat cat;
@Resource(name = "dog11")
private dog dog;
private String name;

@Resource和@Autowired的区别:

  • 都是用来自动装配的,都可以放在属性字段上

  • @Autowired通过byType的方式实现,而且必须要求这个对象存在

  • @Resource默认通过byName的方式实现,如果找不到名字,则通过byType实现,如果两个都找不到的情况下,就报错!

  • 执行顺序不同,@Autowired先byType,@Resource先byName

上一篇:spring boot 无法启动 相关问题


下一篇:接口设计规范