📎 接 DI 基础篇
Java 当中,现下最主流的注入方式是 构造器注入。
常见用法
-
把注入类和被注入类都交给容器管。方式:标
@Component或其派生(@Service/@Repository/@Controller),把它标记为 Bean(容器内容)。 -
使用的时候容器帮你 装配(wire),不用自己
new。
说明
-
接口只有一个实现时,自动匹配;有多个实现时,要么在实现类上标
@Primary指定默认,要么在注入点用@Qualifier("beanName")精确指定用哪个。 -
容器分配的类,默认是单例(即每次都是同一个对象)。想要改变,常见的注解如下:
| 注解 | 效果 |
|---|---|
| 默认不写 | Singleton,单例 |
@Scope("prototype") |
原型,每次新对象 |
@RequestScope |
每个 HTTP 请求一个 |
@SessionScope |
每个 Session 一个 |
基础例子
-
学生抽象类,类名:Stu,抽象方法:study()
-
实现类,带componet注解,类名:StuA,方法内容:输出good good study.
-
实现类,带componet注解,类名:StuB,方法内容:输出happy play.
-
主类@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 中,除了构造注入,还有字段注入等其他注入方式。但构造注入才是主流和发展方向。
浙公网安备 33010602011771号