zoukankan      html  css  js  c++  java
  • 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())]。

  • 相关阅读:
    二叉树同构
    L1-001 Hello World--java
    关于Hanoi的递归分析
    L1-049 天梯赛座位分配
    1001 害死人不偿命的(3n+1)猜想 && 1005 继续(3n+1)猜想
    L1-046 整除光棍
    L1-043 阅览室
    lambda_Consumer接口
    lambda_Supplier接口
    Veu_v-for
  • 原文地址:https://www.cnblogs.com/east7/p/13283330.html
Copyright © 2011-2022 走看看