javax.inject.Provider源码分析

master
xuchengsheng 2023-10-21 17:46:23 +08:00
parent 03c4d2b51a
commit 731acb488b
1 changed files with 8 additions and 4 deletions

View File

@ -123,9 +123,10 @@ public class MyService {
运行结果发现,`myServiceProvider1` 和 `myServiceProvider2` 两次获取到的 `MyService` 实例具有相同的对象引用(`@235ecd9f`)。这说明 `MyService` bean 是单例作用域的。 运行结果发现,`myServiceProvider1` 和 `myServiceProvider2` 两次获取到的 `MyService` 实例具有相同的对象引用(`@235ecd9f`)。这说明 `MyService` bean 是单例作用域的。
| :warning: 注意! | <div style="border: 1px solid #e5e5e5; padding: 20px; background-color: #f8f8f8; border-radius: 5px; box-shadow: 2px 2px 12px #aaa;">
| :----------------------------------------------------------- | <span style="font-size: 20px; color: #333;">💡 提示:</span>
| 在 Spring 中默认的作用域是单例singleton这意味着在整个 Spring 容器中,一个特定的 bean 定义只有一个实例。因此,无论我们调用多少次 `myServiceProvider.get()`,它都会返回相同的 `MyService` 实例。如果我们想每次都获得一个新的 `MyService` 实例,我们需要将 `MyService` 定义为原型作用域prototype。 | <p style="font-size: 16px; color: #555;">在 Spring 中默认的作用域是单例singleton这意味着在整个 Spring 容器中,一个特定的 bean 定义只有一个实例。因此,无论我们调用多少次 `myServiceProvider.get()`,它都会返回相同的 `MyService` 实例。如果我们想每次都获得一个新的 `MyService` 实例,我们需要将 `MyService` 定义为原型作用域prototype</p>
</div>
```java ```java
myServiceProvider1 = com.xcs.spring.service.MyService@235ecd9f myServiceProvider1 = com.xcs.spring.service.MyService@235ecd9f
@ -511,4 +512,7 @@ protected Object getValue() throws BeansException {
- 对于JSR-330的`Provider`类型的依赖Spring会创建一个特定的`Provider`实例来满足这个依赖,这是通过`Jsr330Factory`和其内部类`Jsr330Provider`实现的。 - 对于JSR-330的`Provider`类型的依赖Spring会创建一个特定的`Provider`实例来满足这个依赖,这是通过`Jsr330Factory`和其内部类`Jsr330Provider`实现的。
5. **获取`Provider`的值** 5. **获取`Provider`的值**
- 在`Jsr330Provider`中的`get`方法被调用时,会进一步调用`getValue`方法。 - 在`Jsr330Provider`中的`get`方法被调用时,会进一步调用`getValue`方法。
- `getValue`方法负责实际的依赖解析返回所需的bean实例。 - `getValue`方法负责实际的依赖解析返回所需的bean实例。