spring依赖注入

发布于:2025-02-10 ⋅ 阅读:(51) ⋅ 点赞:(0)

一、 注入方式

1. 构造器注入

构造器注入通过构造方法来注入依赖的对象。当Spring容器创建Bean时,会通过构造器来传递依赖对象。这种方式是最推荐的方式,因为它可以确保依赖对象在创建时已经完全注入。

示例:

@Component
public class Car {
    private final Engine engine;

    @Autowired
    public Car(Engine engine) {  // 构造器注入
        this.engine = engine;
    }

    public void start() {
        engine.run();
    }
}

2. Setter注入

Setter注入是通过JavaBean风格的setter方法来注入依赖的对象。Spring容器会通过调用setter方法来注入依赖对象。它的一个优点是可选性,允许在运行时对依赖进行修改。

示例:

@Component
public class Car {
    private Engine engine;

    @Autowired
    public void setEngine(Engine engine) {  // Setter注入
        this.engine = engine;
    }

    public void start() {
        engine.run();
    }
}

3. 字段注入

字段注入是通过直接在字段上使用@Autowired注解来进行依赖注入。这种方式最简洁,但不推荐,因为它没有显式的构造器或setter方法,缺乏可测试性和可维护性。

示例:

@Component
public class Car {
    @Autowired
    private Engine engine;  // 字段注入

    public void start() {
        engine.run();
    }
}

二、Bean注入规则

1. 使用@Qualifier注解指定注入的Bean

当有多个相同类型的Bean时,可以使用@Qualifier注解来指定要注入的具体Bean。

示例: 假设有两个Engine类型的Bean:

@Component("electricEngine")
public class ElectricEngine implements Engine {
    // 实现细节
}

@Component("dieselEngine")
public class DieselEngine implements Engine {
    // 实现细节
}

然后,在需要注入Engine的地方使用@Autowired@Qualifier来指定注入的具体Bean:

@Component
public class Car {

    @Autowired
    @Qualifier("electricEngine")  // 使用@Qualifier指定注入哪个具体的Bean
    private Engine engine;

    public void start() {
        engine.run();
    }
}

2. 使用@Primary注解指定优先注入的Bean

如果有多个Bean实现了同一个接口或类,并且你希望Spring自动选择其中一个作为默认注入Bean,可以使用@Primary注解标记其中一个Bean。

示例: 假设有两个Engine类型的Bean,DieselEngineElectricEngine,并且你希望默认注入ElectricEngine

@Component
@Primary  // 标记为默认注入的Bean
public class ElectricEngine implements Engine {
    // 实现细节
}

@Component
public class DieselEngine implements Engine {
    // 实现细节
}

在这种情况下,如果没有使用@Qualifier来指定注入的Bean,Spring将默认选择ElectricEngine进行注入。

3. 使用@Value注解注入特定的Bean

@Value注解主要用于注入基本类型或者从application.properties/application.yml配置文件中注入值,但它也可以用来注入特定的Bean名称。

示例: 如果你有多个相同类型的Bean,并且希望通过@Value注入特定的Bean名称,可以在application.properties文件中配置:

my.engine=electricEngine

然后通过@Value注入对应的Bean:

@Component
public class Car {

    @Value("${my.engine}")
    private String engineName;

    private Engine engine;

    @Autowired
    public void setEngine(@Qualifier("${my.engine}") Engine engine) {
        this.engine = engine;
    }

    public void start() {
        engine.run();
    }
}

4. 通过@Autowired@Qualifier结合(使用Spring的名称自动匹配)

你可以通过@Autowired@Qualifier的结合使用来指定要注入的Bean名称。例如,假设你的ElectricEngineDieselEngine分别通过@Component("electricEngine")@Component("dieselEngine")进行标注,你就可以在注入时指定其名称:

@Component
public class Car {

    @Autowired
    @Qualifier("electricEngine")  // 使用@Bean名称指定注入的对象
    private Engine engine;

    public void start() {
        engine.run();
    }
}

总结:

  • @Qualifier 用于在存在多个同类型Bean时,明确指定要注入哪个Bean。
  • @Primary 用于标记某个Bean为优先选择的Bean,在没有@Qualifier的情况下会被默认注入。
  • @Value 可以通过外部配置(如application.properties)来指定注入Bean的名称。

网站公告

今日签到

点亮在社区的每一天
去签到