zoukankan      html  css  js  c++  java
  • Spring注入方式

    Spring 支持使用@Autowired, @Resource,  @Inject 三个注解进行依赖注入。

    @Autowired

    @Autowired为Spring 框架提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired

     

    装配顺序:

    1.按照type在上下文中查找匹配的bean,查找type为Svc的bean

    2.如果有多个bean,则按照name进行匹配

    • 如果有@Qualifier注解,则按照@Qualifier指定的name进行匹配,查找name为svcA的bean
    • 如果没有,则按照变量名进行匹配,查找name为svcA的bean

    3.匹配不到,则报错。(@Autowired(required=false),如果设置requiredfalse(默认为true),则注入失败时不会抛出异常)

     

    @Inject

    在Spring 的环境下,@Inject@Autowired 是相同的,因为它们的依赖注入都是使用AutowiredAnnotationBeanPostProcessor来处理的。

    @Inject是 JSR-330 定义的规范,如果使用这种方式,切换到Guice也是可以的。【Guice 是 google 开源的轻量级 DI 框架】

    @Inject是Java EE包里的,在SE环境需要单独引入。另一个区别在于@Autowired可以设置required=false@Inject并没有这个属性

     

    @Resource

    @Resource有两个重要的属性:nametype,而Spring 将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。

    装配顺序:

    1. 如果同时指定了nametype,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。

    2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。

    3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。

    4. 如果既没有指定name,又没有指定type,则默认按照byName方式进行装配;如果没有匹配,按照byTypeh进行装配。

    Spring 中有这么3种依赖注入的方式

    • 基于 field 注入(属性注入)
    • 基于 setter 注入
    • 基于 constructor 注入(构造器注入)

    1. 基于 field 注入

    所谓基于 field 注入,就是在bean的变量上使用注解进行依赖注入。本质上是通过反射的方式直接注入到field。这是我平常开发中看的最多也是最熟悉的一种方式,同时,也正是 Spring 团队所不推荐的方式

    ========》

    @Autowired
    private Svc svc;

    2. 基于 setter 方法注入

    通过对应变量的setXXX()方法以及在方法上面使用注解,来完成依赖注入。

    private Helper helper;

    @Autowired
    public void setHelper(Helper helper) {
        this.helper = helper;
    }

    3. 基于 constructor 注入

    将各个必需的依赖全部放在带有注解构造方法的参数中,并在构造方法中完成对应变量的初始化,这种方式,就是基于构造方法的注入。

    private final Svc svc;
        
    @Autowired
    public HelpService(@Qualifier("svcB") Svc svc) {
        this.svc = svc;
    }

  • 相关阅读:
    平衡二叉树之RB树
    平衡二叉树之AVL树
    实现哈希表
    LeetCode Median of Two Sorted Arrays
    LeetCode Minimum Window Substring
    LeetCode Interleaving String
    LeetCode Regular Expression Matching
    PAT 1087 All Roads Lead to Rome
    PAT 1086 Tree Traversals Again
    LeetCode Longest Palindromic Substring
  • 原文地址:https://www.cnblogs.com/KL2016/p/14854193.html
Copyright © 2011-2022 走看看