引言
在Java开发的世界里,依赖注入(Dependency Injection,简称DI)是实现控制反转(Inversion of Control,简称IoC)的一种方式。它允许我们通过外部配置来管理对象之间的依赖关系,从而提高代码的可维护性和可测试性。Spring框架和JDK的注入机制是实现依赖注入的两种常见方式。本文将深入探讨Spring自动注入和JDK注入的区别,以及如何在实际开发中应用这些技术,并对对象字段进行非空校验。
Spring自动注入与JDK注入的区别
Spring自动注入
Spring框架通过注解(如@Autowired
、@Inject
、@Resource
等)来实现依赖注入。Spring容器会自动扫描并注入带有这些注解的字段或方法。
注解总结
@Autowired
:自动装配,默认情况下要求依赖对象必须存在,如果需要允许null值,可以设置它的required属性为false。@Inject
:与@Autowired
类似,但它是Java依赖注入规范(JSR-330)的一部分。@Resource
:通过名称来装配,如果没有指定名称,则会使用字段名或方法名作为默认名称。
源码解析
Spring的自动注入是通过AutowiredAnnotationBeanPostProcessor
来实现的,它会处理带有@Autowired
、@Inject
、@Value
等注解的字段和方法。
JDK注入
JDK的注入是通过@Inject
注解来实现的,它是Java依赖注入规范(JSR-330)的一部分。
注解总结
@Inject
:与Spring的@Autowired
类似,但它是Java依赖注入规范(JSR-330)的一部分。
源码解析
JDK的注入是通过Injection
类来实现的,它会处理带有@Inject
注解的字段和方法。
实战代码Demo
Spring自动注入实战
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class MyService {
private final Dependency dependency;
@Autowired
public MyService(Dependency dependency) {
this.dependency = dependency;
}
// ...
}
JDK注入实战
import javax.inject.Inject;
public class MyService {
private final Dependency dependency;
@Inject
public MyService(Dependency dependency) {
this.dependency = dependency;
}
// ...
}
对象字段校验非空
在实际开发中,我们经常需要对对象的字段进行非空校验。Spring框架提供了@NotNull
注解来实现这一功能。
import javax.validation.constraints.NotNull;
public class MyObject {
@NotNull
private String field;
// ...
}
@Autowired
的使用场景
- 当一个类需要依赖另一个类时,可以使用
@Autowired
注解来自动注入依赖。 - 当需要注入一个集合或数组时,可以使用
@Autowired
注解配合@Qualifier
或@Primary
来指定具体的实现。
@Autowired
的运行原理
当Spring容器启动时,AutowiredAnnotationBeanPostProcessor
会遍历所有的bean定义,对于每个bean,它会检查其属性和方法上是否有@Autowired
注解。如果有,它会尝试找到合适的bean来注入。
JDK注入的深入解析
JDK的注入是基于Java依赖注入规范(JSR-330)的,它定义了一套标准的注解来实现依赖注入。@Inject
注解是这个规范的核心,它与Spring的@Autowired
类似,但它是Java标准的一部分。
@Inject
的使用场景
- 当需要遵循Java标准的依赖注入时,可以使用
@Inject
注解。 - 当需要在不同的依赖注入框架之间保持一致性时,
@Inject
是一个好的选择。
@Inject
的运行原理
JDK的注入是通过Injection
类来实现的,它会处理带有@Inject
注解的字段和方法。当容器启动时,它会查找所有带有@Inject
注解的字段和方法,并尝试注入合适的依赖。
对象字段校验非空的深入解析
在Spring框架中,对象字段的非空校验是通过@NotNull
注解来实现的。这个注解是Bean Validation API的一部分,它允许我们在运行时对对象的字段进行校验。
@NotNull
的使用场景
- 当需要确保对象的某个字段不为空时,可以使用
@NotNull
注解。 - 当需要在对象创建或更新时进行字段校验时,
@NotNull
是一个很好的选择。
@NotNull
的运行原理
当Spring容器创建或更新一个对象时,它会检查对象的字段是否带有@NotNull
注解。如果字段为空,容器会抛出一个异常,提示字段非空校验失败。
实战代码Demo
Spring自动注入实战
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class MyService {
private final Dependency dependency;
@Autowired
public MyService(Dependency dependency) {
this.dependency = dependency;
}
// ...
}
JDK注入实战
import javax.inject.Inject;
public class MyService {
private final Dependency dependency;
@Inject
public MyService(Dependency dependency) {
this.dependency = dependency;
}
// ...
}
对象字段校验非空实战
import javax.validation.constraints.NotNull;
public class MyObject {
@NotNull
private String field;
// ...
}