@Resource注解源码分析

master
xuchengsheng 2023-10-18 14:15:29 +08:00
parent 6bdacfc67e
commit f1b6a66e2f
3 changed files with 15 additions and 16 deletions

View File

@ -98,7 +98,6 @@
- [**单例模式@Singleton**](spring-jsr/spring-jsr330-singleton/README.md) - 深入理解`@Singleton`注解确保Spring Bean的单一实例化。 - [**单例模式@Singleton**](spring-jsr/spring-jsr330-singleton/README.md) - 深入理解`@Singleton`注解确保Spring Bean的单一实例化。
## 🔄持续更新中 ## 🔄持续更新中
为了给大家提供最新、最有价值的内容,我会坚持每天更新这个仓库。每一天,你都可以期待看到一些新的内容或者对已有内容的改进。如果你有任何建议或反馈,欢迎随时联系我。我非常珍视每一个反馈,因为这是我持续改进的动力。 为了给大家提供最新、最有价值的内容,我会坚持每天更新这个仓库。每一天,你都可以期待看到一些新的内容或者对已有内容的改进。如果你有任何建议或反馈,欢迎随时联系我。我非常珍视每一个反馈,因为这是我持续改进的动力。

View File

@ -107,13 +107,13 @@ public @interface Resource {
2. **类型指定** 2. **类型指定**
+ 通过 `type` 属性它允许指定所需资源的具体Java类型确保注入的资源与预期类型匹配从而提供类型安全。 + 通过 `type` 属性它允许指定所需资源的具体Java类型确保注入的资源与预期类型匹配从而提供类型安全。
3. **身份验证策略** 3. **身份验证策略**
+ `authenticationType` 属性允许开发者选择资源的身份验证方式,决定是由容器还是应用程序来进行身份验证。 + `authenticationType` 属性允许我们选择资源的身份验证方式,决定是由容器还是应用程序来进行身份验证。
4. **共享策略** 4. **共享策略**
+ 通过 `shareable` 属性,它指定资源是否可以在多个客户端或组件之间共享。 + 通过 `shareable` 属性,它指定资源是否可以在多个客户端或组件之间共享。
5. **供应商特定名称** 5. **供应商特定名称**
+ `mappedName` 属性可以提供与资源关联的供应商或平台特定的名称,增加部署的灵活性。 + `mappedName` 属性可以提供与资源关联的供应商或平台特定的名称,增加部署的灵活性。
6. **描述信息** 6. **描述信息**
+ 通过 `description` 属性,为资源提供了简要描述,有助于开发者和系统管理员理解其用途。 + 通过 `description` 属性,为资源提供了简要描述,有助于我们和系统管理员理解其用途。
### 五、最佳实践 ### 五、最佳实践
@ -589,7 +589,7 @@ protected Object autowireResource(BeanFactory factory, LookupElement element, @N
3. **类型 vs 名称** 3. **类型 vs 名称**
+ `@Resource` 默认是基于名称进行自动装配的。如果没有找到名称匹配的bean它会回退到类型匹配。这与 `@Autowired` 不同,后者默认基于类型进行自动装配。 + `@Resource` 默认是基于名称进行自动装配的。如果没有找到名称匹配的bean它会回退到类型匹配。这与 `@Autowired` 不同,后者默认基于类型进行自动装配。
4. **指定名称** 4. **指定名称**
+ 可以通过 `name` 属性明确指定要注入的 bean 的名称:`@Resource(name = "myService")`。 + 我们可以通过 `name` 属性明确指定要注入的 bean 的名称:`@Resource(name = "myService")`。
5. **处理冲突** 5. **处理冲突**
+ 在一个上下文中,如果有多个相同类型的 bean为避免冲突最好使用 `name` 属性明确指定想要注入的 bean。 + 在一个上下文中,如果有多个相同类型的 bean为避免冲突最好使用 `name` 属性明确指定想要注入的 bean。
6. **与其他注解的结合** 6. **与其他注解的结合**
@ -599,7 +599,7 @@ protected Object autowireResource(BeanFactory factory, LookupElement element, @N
8. **必需性** 8. **必需性**
+ 默认情况下,`@Resource` 注解的依赖是必需的,即如果没有找到相应的 bean会抛出异常。如果某些情况下允许依赖项为 null 或不存在,必须结合其他配置来实现,例如使用 `@Autowired(required = false)` + 默认情况下,`@Resource` 注解的依赖是必需的,即如果没有找到相应的 bean会抛出异常。如果某些情况下允许依赖项为 null 或不存在,必须结合其他配置来实现,例如使用 `@Autowired(required = false)`
9. **懒加载** 9. **懒加载**
+ 在Spring中如果希望延迟资源的初始化并在首次请求时加载它,可以结合 `@Lazy` 注解使用。 + 在Spring中如果我们希望延迟资源的初始化并在首次请求时加载它,可以结合 `@Lazy` 注解使用。
### 九、总结 ### 九、总结

View File

@ -22,7 +22,7 @@
### 二、注解描述 ### 二、注解描述
`@Inject`注解起源于JSR-330也称为`javax.inject.Inject`。这是Java依赖注入的一个标准化规范。Spring支持这个注解意味着可以在Spring应用中使用`@Inject`来执行依赖注入与使用Spring原生的`@Autowired`注解类似。与`@Autowired`不同的是`@Inject`没有一个内置的“`required`”属性。这意味着,如果想要一个可选的依赖注入。但是,我们可以使用 Java 8 的 `java.util.Optional` 类型来达到类似的效果。 `@Inject`注解起源于JSR-330也称为`javax.inject.Inject`。这是Java依赖注入的一个标准化规范。Spring支持这个注解意味着我们可以在Spring应用中使用`@Inject`来执行依赖注入与使用Spring原生的`@Autowired`注解类似。与`@Autowired`不同的是`@Inject`没有一个内置的“`required`”属性。这意味着,如果我们想要一个可选的依赖注入。但是,我们可以使用 Java 8 的 `java.util.Optional` 类型来达到类似的效果。
### 三、接口源码 ### 三、接口源码
@ -39,16 +39,16 @@ public @interface Inject {
### 四、主要功能 ### 四、主要功能
1. **自动注入依赖** 1. **自动注入依赖**
- 使用 `@Inject`你可以请求框架自动为某个字段、构造函数或方法注入一个依赖。这意味着你不需要手动创建和管理对象的实例。 - 使用 `@Inject`我们可以请求框架自动为某个字段、构造函数或方法注入一个依赖。这意味着我们不需要手动创建和管理对象的实例。
2. **多种注入点** 2. **多种注入点**
- **字段注入** - **字段注入**
- 可以直接在类的字段上使用 `@Inject`从而请求框架为该字段提供相应的bean。 - 可以直接在类的字段上使用 `@Inject`从而请求框架为该字段提供相应的bean。
- **构造函数注入** - **构造函数注入**
- 将 `@Inject` 放在类的构造函数上,表示想通过该构造函数注入依赖。 - 将 `@Inject` 放在类的构造函数上,表示我们想通过该构造函数注入依赖。
- **方法注入** - **方法注入**
- 可以在setter方法或任何其他方法上使用 `@Inject`,表示希望框架通过调用该方法来注入依赖。 - 可以在setter方法或任何其他方法上使用 `@Inject`,表示我们希望框架通过调用该方法来注入依赖。
3. **与其他注解协同工作** 3. **与其他注解协同工作**
- 特别是与 `@Named` 注解结合,用于消除依赖的歧义。例如,如果你有多个实现同一接口的bean你可以使用 `@Named` 指定你想要注入哪一个bean。 - 特别是与 `@Named` 注解结合,用于消除依赖的歧义。例如,如果我们有多个实现同一接口的bean我们可以使用 `@Named` 指定我们想要注入哪一个bean。
4. **跨框架兼容性** 4. **跨框架兼容性**
- 由于 `@Inject` 是 JSR-330 标准的一部分,使用它可以增加代码的可移植性。这意味着,理论上,使用 `@Inject` 注解的代码应该能在任何支持 JSR-330 的框架(如 Spring、Java EE、Google Guice 等)中运行。 - 由于 `@Inject` 是 JSR-330 标准的一部分,使用它可以增加代码的可移植性。这意味着,理论上,使用 `@Inject` 注解的代码应该能在任何支持 JSR-330 的框架(如 Spring、Java EE、Google Guice 等)中运行。
@ -547,25 +547,25 @@ if (value != null) {
### 八、注意事项 ### 八、注意事项
1. **需要依赖** 1. **需要依赖**
- 由于 `@Inject` 是 JSR-330 规范的一部分,你需要在项目中添加 `javax.inject` 依赖。如果不这样做,你的代码将无法编译。 - 由于 `@Inject` 是 JSR-330 规范的一部分,我们需要在项目中添加 `javax.inject` 依赖。如果不这样做,我们的代码将无法编译。
2. **`required` 属性** 2. **`required` 属性**
- 与 Spring 的 `@Autowired` 不同,`@Inject` 没有 `required` 属性。这意味着如果没有找到匹配的bean它会默认抛出异常。 - 与 Spring 的 `@Autowired` 不同,`@Inject` 没有 `required` 属性。这意味着如果没有找到匹配的bean它会默认抛出异常。
3. **与其他注解的组合** 3. **与其他注解的组合**
- 为了指定具体的bean或解决多个可选bean之间的歧义可以与 `@Named` 注解结合使用。例如:`@Inject @Named("specificBeanName")`。 - 为了指定具体的bean或解决多个可选bean之间的歧义我们可以与 `@Named` 注解结合使用。例如:`@Inject @Named("specificBeanName")`。
4. **不仅限于Spring** 4. **不仅限于Spring**
- 尽管 `@Inject` 在 Spring 中得到了很好的支持,但它并不是 Spring 特有的。其他实现了 JSR-330 规范的框架(如 Google Guice也支持 `@Inject` - 尽管 `@Inject` 在 Spring 中得到了很好的支持,但它并不是 Spring 特有的。其他实现了 JSR-330 规范的框架(如 Google Guice也支持 `@Inject`
5. **推荐使用构造器注入** 5. **推荐使用构造器注入**
- 尽管可以在字段、方法和构造器上使用 `@Inject`但现代的最佳实践建议使用构造器注入。这确保了bean的不变性和更好的测试性。 - 尽管我们可以在字段、方法和构造器上使用 `@Inject`但现代的最佳实践建议使用构造器注入。这确保了bean的不变性和更好的测试性。
6. **循环依赖问题** 6. **循环依赖问题**
- 如果在使用字段或方法注入时不小心引入了循环依赖Spring容器可能会抛出异常。使用构造器注入时循环依赖会更明显地暴露出来。 - 如果我们在使用字段或方法注入时不小心引入了循环依赖Spring容器可能会抛出异常。使用构造器注入时循环依赖会更明显地暴露出来。
7. **不要混合使用** 7. **不要混合使用**
- 在一个项目中,尽量不要同时使用 `@Inject``@Autowired`,以保持一致性。选择其中之一并坚持使用。 - 在一个项目中,尽量不要同时使用 `@Inject``@Autowired`,以保持一致性。选择其中之一并坚持使用。
8. **避免过度使用** 8. **避免过度使用**
- 依赖注入是一个强大的特性,但也应该谨慎使用。过度使用自动注入,特别是在大型项目中,可能会使代码难以跟踪和维护。 - 依赖注入是一个强大的特性,但也应该谨慎使用。过度使用自动注入,特别是在大型项目中,可能会使代码难以跟踪和维护。
9. **单一职责原则** 9. **单一职责原则**
- 如果发现一个类需要太多的依赖,这可能是违反了单一职责原则的信号。考虑对类进行重构或分解。 - 如果我们发现一个类需要太多的依赖,这可能是违反了单一职责原则的信号。考虑对类进行重构或分解。
10. **与Java EE的兼容性** 10. **与Java EE的兼容性**
- 如果的应用程序在 Java EE 容器中运行,那么容器可能已经有了对 `@Inject` 的原生支持,而无需 Spring。 - 如果我们的应用程序在 Java EE 容器中运行,那么容器可能已经有了对 `@Inject` 的原生支持,而无需 Spring。
### 九、总结 ### 九、总结