Spring依赖注入的方式

Spring 框架提供了多种依赖注入(Dependency Injection, DI)的方式,主要包括:

  1. 基于构造函数的注入(Constructor-based Injection):

    • 这种方法通过类的构造函数注入依赖。
    • 如果一个类有多个构造函数,Spring 会根据上下文中可用的和匹配的构造函数参数来选择合适的构造函数。
      • 如果一个类有多个有参和一个无参,spring会自动选择无参去注入;
      • 如果只有一个构造方法,spring会默认调用这个构造方法去注入;
      • 如果有多个有参构造方法,且都没有@Autowired注解,则会报错;
    • 适用于必需的依赖项,可以保证这些依赖项在使用前已被初始化。
    • 先根据构造函数的类型去匹配,如果根据类型找到了多个不同名字的bean,再根据名字去匹配。
    public class MyBean {
        private final AnotherBean anotherBean;
    
        @Autowired
        public MyBean(AnotherBean anotherBean) {
            this.anotherBean = anotherBean;
        }
    }
    
  2. 基于 setter 方法的注入(Setter-based Injection):

    • 这种方法通过类的 setter 方法或其他任何普通方法注入依赖。
    • 它适用于可选的依赖项,这些依赖项可以在类实例化后的任何时间设置。
    • 通常与 @Autowired 注解结合使用。
    public class MyBean {
        private AnotherBean anotherBean;
    
        @Autowired
        public void setAnotherBean(AnotherBean anotherBean) {
            this.anotherBean = anotherBean;
        }
    }
    
  3. 基于字段的注入(Field-based Injection):

    • 直接在类的字段上注入依赖。
    • 这是最简单但不推荐的方法,因为它可能导致类与 Spring 框架耦合,且不利于单元测试。
    • 通常通过在字段上使用 @Autowired 注解实现。
    public class MyBean {
        @Autowired
        private AnotherBean anotherBean;
    }
    
  4. 基于 Java 配置类的注入:

    • 使用 Java 配置类(通常带有 @Configuration 注解)定义依赖关系。
    • 在配置类中,可以使用 @Bean 注解标记的方法来定义和配置依赖项。
    @Configuration
    public class AppConfig {
        @Bean
        public MyBean myBean() {
            return new MyBean(anotherBean());
        }
    
        @Bean
        public AnotherBean anotherBean() {
            return new AnotherBean();
        }
    }
    

这些方法可以根据应用程序的需要和开发者的偏好进行选择和混合使用。构造函数注入通常是首选的方式,因为它支持不变性和强制性依赖的注入。

你可能感兴趣的:(spring,java)