Spring注解之@Autowired组件装配

前言 

       说起Spring的@Autowired注解,想必大家已经耳熟能详;对于小编而言,虽然一直知道怎么用,但是并没有去了解过,因此,本文就梳理一下@Autowired注解的功能,如有写的不准确的地方,欢迎各位园友拍砖。 

       @Autowired:属于Spring 的org.springframework.beans.factory.annotation包,通过byType形式,可用于为类的属性、构造器、方法注入所需的外部资源。@Resource:不属于spring的注解,而是来自于JSR-250位于java.annotation包下,使用该注解为目标bean指定协作者Bean。@Inject:和@Autowired注解一样也是按类型注入的bean,但是没有required属性。

       注:此篇博文基于Spring5.1.10.RELEASE,SpringBoot2.1.9.RELEASE

 @Autowired源码

       我们看一下@Autowired注解的源码:

package org.springframework.beans.factory.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
 @Retention(RetentionPolicy.RUNTIME)
 @Documented
 public @interface Autowired {

 /**
 * Declares whether the annotated dependency is required.
 * <p>Defaults to {@code true}.
 */
 boolean required() default true;

 }

       可以看到,此注解运行时生效,且适用范围很广,例如,成员变量、方法、setter方法和构造函数等都可以加上@Autowired注解。它还有一个属性required,此属性用于控制在找不到要依赖注入的对象时是否报错,默认true即找不到要注入的对象时会报错。

       当IOC容器里存在多个类型兼容的bean时(例如,同一个接口的不同实现类),通过类型的自动装配将无法工作,此时可以在@Qualifiter注解里提供bean的名称,Spring允许对方法的入参标注@Qualifiter以指定注入bean的名称;此时,@Autowired  + @Qualifiter = @Resource。

       在同一个类中,同一类型的bean可以使用@Autowired注入多次,并且所有注入的实例都是同一个实例:


 @Autowired
    private Student stu1; // 一个实体类
    @Autowired
    private Student stu2;

    public boolean isSameInstatnce() {
        System.err.println(stu2 + "  111");
        System.err.println(stu1);
        return stu2.getClass().equals(stu1.getClass());
    }
       调用上面的接口之后,将输出同一实例。

        题外话,实体类Student切勿重写toString()方法,避免控制台打印toString()里的内容,而非默认的[getClass().getName() + "@" + Integer.toHexString(hashCode())]。

 

posted @ 2020-07-11 14:34  楼兰胡杨  阅读(567)  评论(0编辑  收藏  举报