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())]。

  • 相关阅读:
    CentOS6.3搭建Nginx代理访问MongoDB GridFS图片资源
    PHP判断变量是否存在及函数isset() 、empty()与is_null的区别
    【摘】请问make -j8 和make -j4 是什么意思?什么作用?
    关于数字、数据处理的几个PHP函数汇总
    Windows下Nginx的启动、停止等基本命令
    Git 简明教程
    PHP函数preg_replace() 正则替换所有符合条件的字符串
    如何挂载阿里云Linux服务器的“数据盘”(新购买)
    ThinkPHP模板中JS等带花括号处会被解析错误的解决办法
    移动端与PHP服务端接口通信流程设计(增强版)
  • 原文地址:https://www.cnblogs.com/east7/p/13283330.html
Copyright © 2011-2022 走看看