qidao123.com技术社区-IT企服评测·应用市场
标题:
Springboot 注入方式
[打印本页]
作者:
西河刘卡车医
时间:
2025-3-6 21:21
标题:
Springboot 注入方式
在 Spring Boot 中,依靠注入是一种紧张的设计模式,用于实现组件之间的解耦。常见的注入方式紧张有以下几种:
1. 构造函数注入
原理
:通过构造函数来完成依靠注入,在创建 Bean 实例时,Spring 容器会根据构造函数的参数类型和数量,主动将相应的依靠对象通报给构造函数举行初始化。
优点
:
包管依靠的不可变性,一旦对象创建完成,其依靠关系就不会再改变。
包管依靠的完整性,因为在创建对象时就必须提供所有须要的依靠,避免了对象在使用过程中出现依靠缺失的题目。
支持依靠的不可为空性,使用构造函数注入可以在编译时就发现依靠缺失的题目。
示例代码
:
import org.springframework.stereotype.Service;
// 定义一个服务接口
interface MyService {
void doSomething();
}
// 实现服务接口
@Service
class MyServiceImpl implements MyService {
@Override
public void doSomething() {
System.out.println("Doing something...");
}
}
// 使用构造函数注入依赖
@Service
class MyClient {
private final MyService myService;
// 构造函数注入
public MyClient(MyService myService) {
this.myService = myService;
}
public void performAction() {
myService.doSomething();
}
}
复制代码
2. Setter 方法注入
原理
:通过对象的 Setter 方法来完成依靠注入,Spring 容器在创建 Bean 实例后,会调用相应的 Setter 方法将依靠对象注入到 Bean 中。
优点
:
可以在对象创建后动态地修改依靠关系。
对于可选的依靠注入比力方便,因为可以不提供相应的依靠,而不会影响对象的创建。
缺点
:
不能包管依靠的不可变性,因为可以在对象创建后通过 Setter 方法修改依靠。
不能包管依靠的完整性,因为可以不调用 Setter 方法注入依靠,导致对象在使用过程中出现依靠缺失的题目。
示例代码
:
import org.springframework.stereotype.Service;
// 定义一个服务接口
interface MyService {
void doSomething();
}
// 实现服务接口
@Service
class MyServiceImpl implements MyService {
@Override
public void doSomething() {
System.out.println("Doing something...");
}
}
// 使用 Setter 方法注入依赖
@Service
class MyClient {
private MyService myService;
// Setter 方法注入
public void setMyService(MyService myService) {
this.myService = myService;
}
public void performAction() {
if (myService != null) {
myService.doSomething();
}
}
}
复制代码
3. 字段注入
原理
:通过在类的字段上使用 @Autowired、@Resource 或 @Inject 等注解来完成依靠注入,Spring 容器会主动将相应的依靠对象注入到该字段中。
优点
:
代码轻便,不需要编写构造函数或 Setter 方法。
缺点
:
违反了单一职责原则,因为类的字段直接依靠于外部对象,使得类的可测试性变差。
不能包管依靠的不可变性,因为可以在对象创建后通过反射修改字段的值。
不能包管依靠的完整性,因为在某些环境下(如使用无参构造函数创建对象),大概会导致依靠缺失。
示例代码
:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
// 定义一个服务接口
interface MyService {
void doSomething();
}
// 实现服务接口
@Service
class MyServiceImpl implements MyService {
@Override
public void doSomething() {
System.out.println("Doing something...");
}
}
// 使用字段注入依赖
@Service
class MyClient {
@Autowired
private MyService myService;
public void performAction() {
myService.doSomething();
}
}
复制代码
4. 方法注入
原理
:通过在类的方法上使用 @Autowired 等注解来完成依靠注入,Spring 容器会在调用该方法时将相应的依靠对象作为参数通报给方法。
示例代码
:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
// 定义一个服务接口
interface MyService {
void doSomething();
}
// 实现服务接口
@Service
class MyServiceImpl implements MyService {
@Override
public void doSomething() {
System.out.println("Doing something...");
}
}
// 使用方法注入依赖
@Service
class MyClient {
private MyService myService;
@Autowired
public void initialize(MyService myService) {
this.myService = myService;
}
public void performAction() {
myService.doSomething();
}
}
复制代码
在实际开发中,构造函数注入通常是首选的注入方式,因为它具有更好的可维护性和可测试性。而字段注入虽然代码轻便,但在一些复杂场景下大概会带来一些题目,应谨慎使用。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 qidao123.com技术社区-IT企服评测·应用市场 (https://dis.qidao123.com/)
Powered by Discuz! X3.4