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

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

  • 在spring中有三种自动装配的属性

    • 在xml中显示配置

    • 在Java中显示配置

    • 隐式的自动装配bean(重要)

1.byName自动装配

会在容器上下文中查找,和自己对象set方法后面的值对应的beanid!

<bean id="people" class="java.spring5.people" autowire="byName">
    <property name="name" value="zhangtao"/>
</bean>

2.byType自动装配

会在容器上下文中查找,和自己对象set方法后面的值对应的beantype!

(必须保证此类型全局唯一)

<bean id="people" class="java.spring5.people" autowire="byType">
    <property name="name" value="zhangtao"/>
</bean>

小结:

  • byName时需要保证所有bean的id唯一,并且这个bean需要自动注入的属性与set方法一致!

  • byType需要保证所有bean的class唯一,并且这个bean需要和自动注入的属性的类型一致

3.使用注解进行自动装配

jdk1.5支持的注解,spring从2.5支持注解

要使用注解须知:

1.导入约束

2.配置注解的支持

<?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/>
​
</beans>

@Autowired

直接在属性上使用即可!也可以使用在set上

public class People{
 @Autowired(required = false)
 private Cat cat
 @Autowired
 private Dog dog
}

使用Autowied我们可以不用编写set方法了,前提是你这个自动装配的属性在IOC(spring)容器中

如果定义了它的required属性为false,说明这个对象可以为null,否则不为空(也可以加@Nullable注解)

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

public class People{
    @Autowired
    @Qualifier(value="cat111")
    private Cat cat;
}

@Resource注解

public class People{
  @Autowired(name = "cat2")
  private Cat cat;
}

小结:

@Autowired和@Resource的相同和区别:

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

  • 执行顺序不同

  • @Autowired是默认通过byTyper然后通过byName的方式实现的,要求对象必须存在

  • @Resource默认通过byname方式实现,如果找不到名字,则通过byType方式实现,如果两个都找不到则报错