万金流
以码会友。 吾Q:578751655。 水平有限,轻喷,谢!

📎 接 DI 基础篇

Java 当中,现下最主流的注入方式是 构造器注入。

常见用法

  • 把注入类和被注入类都交给容器管。方式:标 @Component 或其派生(@Service / @Repository / @Controller),把它标记为 Bean(容器内容)。

  • 使用的时候容器帮你 装配(wire),不用自己 new。

说明

  • 接口只有一个实现时,自动匹配;有多个实现时,要么在实现类上标 @Primary 指定默认,要么在注入点用 @Qualifier("beanName") 精确指定用哪个。

  • 容器分配的类,默认是单例(即每次都是同一个对象)。想要改变,常见的注解如下:

注解 效果
默认不写 Singleton,单例
@Scope("prototype") 原型,每次新对象
@RequestScope 每个 HTTP 请求一个
@SessionScope 每个 Session 一个

基础例子

  1. 学生抽象类,类名:Stu,抽象方法:study()

  2. 实现类,带componet注解,类名:StuA,方法内容:输出good good study.

  3. 实现类,带componet注解,类名:StuB,方法内容:输出happy play.

  4. 主类@SpringBootApplication也会被标记为bean,故不用额外标记componet。完成构造注入代码。

Stu.java

package com.example.demo;

public abstract class Stu {

    public abstract void study();
}

StuA.java

package com.example.demo;

import org.springframework.stereotype.Component;

@Component
public class StuA extends Stu {

    @Override
    public void study() {
        System.out.println("good good study.");
    }
}

StuB.java

package com.example.demo;

import org.springframework.stereotype.Component;

@Component
public class StuB extends Stu {

    @Override
    public void study() {
        System.out.println("happy play.");
    }
}

DemoApplication.java

package com.example.demo;

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoApplication implements CommandLineRunner{

	StuA a;
	public DemoApplication(StuA a) {
		this.a = a;
	}

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}

	public  void run(String... x)
	{
		a.study();
	}
}

运行效果自行查看。

接口相关例

  • 接口与单实现

主类属性和构造部分改为

Stu a;
	public DemoApplication(Stu a) {
		this.a = a;
	}

再屏蔽StuB.java

容器会自己找到唯一实现类StuA,并注入,程序工作正常,结果略。

  • 接口与多实现

恢复StuB.java,把StuA设置为主要实现

@Component
@Primary 
public class StuA extends Stu {

在主类的构造注入位置,指定匹配StuB

Stu a;
	public DemoApplication(@Qualifier("stuB")Stu a) {

指定匹配生效,运行结果:happy play.

取消指定的注入,则Primary注解生效,运行结果为good good study.

本文仅给出了常见用法及例子,更多内容(如多构造等等)可自己补充学习。
Java 中,除了构造注入,还有字段注入等其他注入方式。但构造注入才是主流和发展方向。

posted on 2026-10-06 16:40  万金流  阅读(39)  评论(0)    收藏  举报