7、Bean的自动装配

发布时间 2023-08-27 12:49:39作者: AnJiaYu

7、Bean的自动装配

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

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

    在Spring中有三种自动装配的方法

    1. 在xml中显示的配置

    2. 在Java中配置

    3. 隐式的自动装配Bean

7.1、测试环境搭建

一个人有两个宠物

7.2、byName自动装配

<!--    byName 会自动在容器中进行查找和自己对象set方法后面的值对应的id-->
<bean id="people" class="com.an.pojo.People" autowire="byName">
<property name="name" value="张三"></property>
</bean>

7.3、byType自动装配

<!--    byType  会自动在容器中进行查找和自己对象属性类型相同的Bean -->
<bean id="people" class="com.an.pojo.People" autowire="byType">
<property name="name" value="张三"></property>
</bean>

7.4、总结

  • 使用byName时,要保证Bean的Id全局唯一,并且这个Bean的Id要和自动注入属性的set方法的值一致

  • 使用byType时,要保证Bean的类型全局唯一,并且这个Bean的类型要和自动注入属性的类型一致

7.5、使用注解来实现自动装配

使用注解须知:

  1. 导入约束 context约束 xmlns:context="http://www.springframework.org/schema/context"

  2. 配置注解支持 <context:annotation-config/>

    <?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方法了 我们可以只保留get方法

    public class People {
    @Autowired
    private Cat cat;
    @Autowired
    private Dog dog;
    private String name;}

为什么使用注解之后我们没有set方法也可进行注入

当使用@autowired注解时,你不需要再去写getter和setter方法了,之所以不用写,秘诀就在于java的“反射机制”。

java允许用户关闭【属性】或者【方法】的【访问控制权限】,也就是说,本来你的属性或者方法声明了【private】,在访问类中的这个private标识的某个属性时,Java首先会进行一个【安全检查】,确认一下你要访问的这个属性的访问权是啥,如果是【public】,那好,你可以直接访问。如果是【private】,对不起,你不能直接访问我类中的这个私有属性。

按照正常的操作是这样的,但是!Java还提供了一个方法,能够让你关闭属性或者方法的【访问控制权限】,比如你即使声明了这个属性是private的,但是我仍然还是可以通过【类.属性】的方法直接访问你的这个【私有属性】,那么这个神奇的方法是什么呢?那就是我们反射框架中

 

下面是官方文档对这个方法的作用的具体解释:

Set the accessible flag for this object to the indicated boolean value. A value of true indicates that the reflected object should suppress Java language access checking when it is used. A value of false indicates that the reflected object should enforce Java language access checks.

翻译过来就是:这个方法可以设置此对象的可访问标志设置为指示的布尔值。值 true 表示被反射的对象在使用时应该禁止 Java 语言访问检查。值 false 表示被反射的对象应该强制执行 Java 语言访问检查。

 

Spring把用@autowired标记过的属性的【访问控制检查】给关闭了,即对每个属性进行了【setAccessible(true)】的设置,导致这些属性即使被我们标记了【private】,Spring却任然能够不通过getter和setter方法来访问这些属性,达到一定的目的。

@Nullable 字段标记了这个注解 那么这个注解可以为空
@Autowired(required = false)如果这个显示的定义了required = false那么这个对象可以为空

如果@Autowired的装配环境比较复杂,自动装配无法通过一个注解完成的话,我们可以使用

  @Qualifier(value = "xxx")

来实现指定Bean的装配

@Resource(name = "xxx")

这个注解是Java的注解,这个注解和Spring 的注解一样也可实现自动装配,它先是从名字进行比较,如果有符合的名字,就会装配,如果没有,就会比较数据类型,如果还是没有,那会出现错误,它也支持指定名字的装配

小结:@Autowired通过byType来进行装配

@Resource通过byName来进行装配,找不到才通过byType装配