【spring】@Autowired @Resource自动装配

基于xml配置自动装配

byName

这是一个people类的bean,注入了他自己的属性以及两个复杂类型属性:

<bean id="cat" class="com.kxy.pojo.Cat"></bean>
    <bean id="dog" class="com.kxy.pojo.Dog"></bean>
    <bean id="people" class="com.kxy.pojo.People">
        <property name="name" value="kxy"/>
        <property name="cat" ref="cat"/>
        <property name="dog" ref="dog"/>
    </bean>

当你加了autowire=byName属性后

    <bean id="cat" class="com.kxy.pojo.Cat"></bean>
    <bean id="dog" class="com.kxy.pojo.Dog"></bean>
    <bean id="people" class="com.kxy.pojo.People" autowire="byName">
        <property name="name" value="kxy"/>
    </bean>

byname属性会自动找
与setter参数名相匹配的bean(比较bean的id/name是否与setter参数名一致),从而自动装配了这两个复杂类型的引用。并且省略了手动注入Cat和Dog两个bean的操作。

    public void setCat(Cat cat) {//byname会自动找与setter参数名相匹配的bean(cat)
        this.cat = cat;
    }

    public void setDog(Dog dog) {//byname会自动找与setter参数名相匹配的bean(dog)
        this.dog = dog;
    }

byType

同理,byType属性允许我们省略对象属性类型相匹配的bean。

    <bean id="ca341t" class="com.kxy.pojo.Cat" ></bean>
    <bean id="doew" class="com.kxy.pojo.Dog" ></bean>
    <bean id="people" class="com.kxy.pojo.People" autowire="byType">
        <property name="name" value="kxy"/>
    </bean>

即便像这样id是乱的,也能通过class引出的类匹配相应的bean。
class的value类型与setter的参数类型进行匹配。
基于xml配置自动装配方式:

  1. no:默认的方式是不进行自动装配的,通过手工设置ref属性来进行装配bean。
  2. byName:通过bean的名称进行自动装配,如果一个bean的 property 与另一bean 的name 相同,就进行自动装配。
  3. byType:通过参数的数据类型进行自动装配。
  4. constructor:利用构造函数进行装配,并且构造函数的参数通过byType进行装配。
  5. autodetect:自动探测,如果有构造方法,通过 construct的方式自动装配,否则使用 byType的方式自动装配。

基于注解自动装配

使用@Autowired、@Resource注解来自动装配指定的bean。在使用@Autowired注解之前需要在Spring配置文件进行配置注解的context约束和注解的支持:

<?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
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
    <context:annotation-config/>
</beans>

在启动spring IoC时,容器自动装载了一AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowied、@Resource或@Inject时,就会在IoC容器自动查找需要的bean,并装配给该对象的属性。在使用@Autowired时,首先在容器中通过类型(byType)查询对应类型的bean:

如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据;

如果查询的结果不止一个,那么@Autowired会根据名称(byName)来查找;

如果上述查找的结果为空,那么会抛出异常。解决方法时,使用required=false。

    <bean id="dog" class="com.kxy.pojo.Dog"/>
    <bean id="people" class="com.kxy.pojo.People"/>
public class People {
    private String name;
    @Autowired(required = false)
    Cat cat;
    @Autowired
    Dog dog;

@Autowired可用于:构造函数、成员变量、Setter方法

@Autowired

@Autowired应用于成员变量为例:

public class People {
    private String name;
    @Autowired
    Cat cat;
    @Autowired
    Dog dog;
<bean id="cat" class="com.kxy.pojo.Cat"/>
    <bean id="dog" class="com.kxy.pojo.Dog"/>
    <bean id="people" class="com.kxy.pojo.People"/>

则cat和dog两个bean就实现了自动装配。

从 Spring Framework 4.3 开始,@Autowired注解 应用于构造函数时,如果目标 bean 仅定义一个构造函数作为开始,则不再需要在此类构造函数上使用@Autowired注解。但是,如果有几个构造函数可用,则必须至少注解一个,以告诉容器使用哪个构造函数。

@Autowired和@Resource之间的区别:

(1) @Autowired默认是按照类型装配注入的,如果IoC容器有多个bean,则按照名称装配注入。默认情况下它要求依赖对象必须存在(可以设置它required属性为false来使该容器中的bean允许为空)。

(2) @Resource默认是按照名称(byName)来装配注入的,只有当找不到与名称匹配的bean才会按照类型(byType)来装配注入。

@Qualifier

使用 Spring 的@Qualifier注解,一般配合@Autowired使用。可以缩小类型匹配的范围,以便为每个参数选择特定的 bean。指定唯一的bean对象。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

❀༊烟花易冷ღ

觉得博客写的不错就打赏一下吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值