你的回答很棒。我还想分享一些关于替代解决方案的注释,该解决方案允许原型成员通过使用内部 bean 由 Spring IoC 容器生命周期本地管理。
我最近写了一个关于内部豆子的单独问题的答案。内部 bean 是通过将 bean 属性值分配为BeanDefinition
对象来创建的。Bean 定义属性值会自动解析为(inner)
它们定义的 bean 的实例(作为托管的单例 bean)。
以下 XML 上下文配置元素可用于ForkJoinPool
为每个将被管理的引用创建不同的自动装配 bean(@PreDestroy
将在上下文关闭时调用):
<!-- Prototype-scoped bean for creating distinct FJPs within the application -->
<bean id="forkJoinPool" class="org.springframework.beans.factory.support.GenericBeanDefinition" scope="prototype">
<property name="beanClass" value="org.springframework.scheduling.concurrent.ForkJoinPoolFactoryBean" />
</bean>
但是,此行为取决于将引用分配为 bean 定义的属性值。这意味着@Autowired
- 和构造函数注入默认情况下不适用于 this,因为这些自动装配方法会立即解析值,而不是使用AbstractAutowireCapableBeanFactory#applyPropertyValues
. 按类型自动装配也不起作用,因为类型解析不会通过BeanDefinition
s 的 bean 传播以查找生成的类型。
此方法仅在以下两个条件之一为真时才有效:
- 依赖的 bean也在XML 中定义
- 或者如果自动连线模式设置为
AutowireCapableBeanFactory#AUTOWIRE_BY_NAME
<!-- Setting bean references through XML -->
<beans ...>
<bean id="myOtherBean" class="com.example.demo.ForkJoinPoolContainer">
<property name="forkJoinPool" ref="forkJoinPool" />
</bean>
</beans>
<!-- Or setting the default autowire mode -->
<beans default-autowire="byName" ...>
...
</beans>
可能会进行两项额外的更改以启用构造函数注入和@Autowired
注入。
构造函数注入:
bean 工厂分配了一个AutowireCandidateResolver
for 构造函数注入。默认值 ( ContextAnnotationAutowireCandidateResolver
) 可以被覆盖 ( DefaultListableBeanFactory#setAutowireCandidateResolver
) 以应用一个候选解析器,该解析器寻找符合条件BeanDefinition
的注入类型的 bean。
@Autowired
-注射:
AutowiredAnnotationBeanPostProcessor
bean 后处理器直接设置 bean 值而不解析内部BeanDefinition
bean。这个后处理器可以被覆盖,或者可以创建一个单独的 bean 后处理器来处理托管原型 bean 的自定义注释(例如,@AutowiredManagedPrototype
)。