Java中的依赖注入(可以不使用@Autowired注解)
一、@Autowired
@Autowired
是 Spring 框架中一个非常重要的注解,用于实现依赖注入(Dependency Injection, DI)。它可以让 Spring 容器自动将符合条件的 Bean 注入到标注了该注解的字段、构造函数或方法中,从而简化了代码的编写,提高了代码的可读性和可维护性。
基本用法
字段注入
@Component
public class SomeService {
@Autowired
private SomeDependency dependency;
public void doSomething() {
dependency.doSomething();
}
}
构造函数注入
@Component
public class SomeService {
private final SomeDependency dependency;
@Autowired
public SomeService(SomeDependency dependency) {
this.dependency = dependency;
}
public void doSomething() {
dependency.doSomething();
}
}
方法注入
@Component
public class SomeService {
private SomeDependency dependency;
@Autowired
public void setDependency(SomeDependency dependency) {
this.dependency = dependency;
}
public void doSomething() {
dependency.doSomething();
}
}
特点
-
自动装配:Spring 容器会自动查找符合条件的 Bean 并注入。
-
可选性:可以通过
@Autowired(required = false)
来指定该依赖是否必须存在。 -
类型匹配:Spring 会根据类型来匹配 Bean,如果存在多个符合条件的 Bean,可以通过
@Qualifier
注解来指定具体的 Bean。
注意事项
-
字段注入:虽然字段注入使用起来非常方便,但它有一个缺点是破坏了类的封装性,因为字段被直接暴露给了 Spring 容器。因此,字段注入通常不推荐在复杂的项目中使用。
-
构造函数注入:构造函数注入可以确保依赖在对象创建时就被注入,从而保证对象的完整性和不可变性。构造函数注入是推荐的依赖注入方式,尤其是在需要保证依赖不可变的情况下。
-
方法注入:方法注入通常用于设置一些可选的依赖,或者在某些情况下需要对依赖进行一些额外的处理。
二、(不用@Autowired)使用final和@RequiredArgsConstructor
一般使用
可以看到@Autowired下面有波浪线,说明这不是推荐的依赖注入方法
正确做法:
使用
lombok注解@RequiredArgsConstructor
三、@Resource
@Resource
是 Java 提供的一个注解,用于实现依赖注入。它与 Spring 的 @Autowired
注解类似,但有一些细微的差别。@Resource
注解是 Java EE 的一部分,而 @Autowired
是 Spring 框架提供的注解。
基本用法
字段注入
@Component
public class SomeService {
@Resource
private SomeDependency dependency;
public void doSomething() {
dependency.doSomething();
}
}
方法注入
@Component
public class SomeService {
private SomeDependency dependency;
@Resource
public void setDependency(SomeDependency dependency) {
this.dependency = dependency;
}
public void doSomething() {
dependency.doSomething();
}
}
特点
-
自动装配:Spring 容器会自动查找符合条件的 Bean 并注入。
-
可选性:可以通过
@Resource(name = "beanName")
来指定具体的 Bean 名称。 -
类型匹配:Spring 会根据类型来匹配 Bean,如果存在多个符合条件的 Bean,可以通过
@Resource(name = "beanName")
来指定具体的 Bean。
注意事项
-
字段注入:虽然字段注入使用起来非常方便,但它有一个缺点是破坏了类的封装性,因为字段被直接暴露给了 Spring 容器。因此,字段注入通常不推荐在复杂的项目中使用。
-
方法注入:方法注入通常用于设置一些可选的依赖,或者在某些情况下需要对依赖进行一些额外的处理。
四、对比 @Autowired
和 @Resource
-
注入方式:
-
@Autowired
:默认按类型注入,如果存在多个符合条件的 Bean,可以通过@Qualifier
注解来指定具体的 Bean。 -
@Resource
:默认按名称注入,如果未指定名称,则按类型注入。
-
-
使用场景:
-
@Autowired
:是 Spring 框架提供的注解,适用于 Spring 项目。 -
@Resource
:是 Java EE 提供的注解,适用于 Java EE 项目,也可以在 Spring 项目中使用。
-
-
推荐使用:
-
在纯 Spring 项目中,推荐使用
@Autowired
,因为它与 Spring 框架的集成更加紧密。 -
在需要与 Java EE 项目集成的场景中,可以使用
@Resource
。
-
总结
@Resource
和 @Autowired
都是用于依赖注入的注解,但它们有一些细微的差别。在纯 Spring 项目中,推荐使用 @Autowired
,因为它与 Spring 框架的集成更加紧密。在需要与 Java EE 项目集成的场景中,可以使用 @Resource
。