DefaultSingletonBeanRegistry performs non-synchronized checks for existing entries in dependentBeanMap and containedBeanMap
Also adding alias resolution to isDependent's algorithm (for circular dependency detection). Issue: SPR-8834 Issue: SPR-7966
This commit is contained in:
@@ -373,8 +373,15 @@ public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements
|
|||||||
* @see #registerDependentBean
|
* @see #registerDependentBean
|
||||||
*/
|
*/
|
||||||
public void registerContainedBean(String containedBeanName, String containingBeanName) {
|
public void registerContainedBean(String containedBeanName, String containingBeanName) {
|
||||||
|
// A quick check for an existing entry upfront, avoiding synchronization...
|
||||||
|
Set<String> containedBeans = this.containedBeanMap.get(containingBeanName);
|
||||||
|
if (containedBeans != null && containedBeans.contains(containedBeanName)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// No entry yet -> fully synchronized manipulation of the dependentBeans Set
|
||||||
synchronized (this.containedBeanMap) {
|
synchronized (this.containedBeanMap) {
|
||||||
Set<String> containedBeans = this.containedBeanMap.get(containingBeanName);
|
containedBeans = this.containedBeanMap.get(containingBeanName);
|
||||||
if (containedBeans == null) {
|
if (containedBeans == null) {
|
||||||
containedBeans = new LinkedHashSet<String>(8);
|
containedBeans = new LinkedHashSet<String>(8);
|
||||||
this.containedBeanMap.put(containingBeanName, containedBeans);
|
this.containedBeanMap.put(containingBeanName, containedBeans);
|
||||||
@@ -391,9 +398,16 @@ public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements
|
|||||||
* @param dependentBeanName the name of the dependent bean
|
* @param dependentBeanName the name of the dependent bean
|
||||||
*/
|
*/
|
||||||
public void registerDependentBean(String beanName, String dependentBeanName) {
|
public void registerDependentBean(String beanName, String dependentBeanName) {
|
||||||
|
// A quick check for an existing entry upfront, avoiding synchronization...
|
||||||
String canonicalName = canonicalName(beanName);
|
String canonicalName = canonicalName(beanName);
|
||||||
|
Set<String> dependentBeans = this.dependentBeanMap.get(canonicalName);
|
||||||
|
if (dependentBeans != null && dependentBeans.contains(dependentBeanName)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// No entry yet -> fully synchronized manipulation of the dependentBeans Set
|
||||||
synchronized (this.dependentBeanMap) {
|
synchronized (this.dependentBeanMap) {
|
||||||
Set<String> dependentBeans = this.dependentBeanMap.get(canonicalName);
|
dependentBeans = this.dependentBeanMap.get(canonicalName);
|
||||||
if (dependentBeans == null) {
|
if (dependentBeans == null) {
|
||||||
dependentBeans = new LinkedHashSet<String>(8);
|
dependentBeans = new LinkedHashSet<String>(8);
|
||||||
this.dependentBeanMap.put(canonicalName, dependentBeans);
|
this.dependentBeanMap.put(canonicalName, dependentBeans);
|
||||||
@@ -417,7 +431,8 @@ public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements
|
|||||||
* @param dependentBeanName the name of the dependent bean
|
* @param dependentBeanName the name of the dependent bean
|
||||||
*/
|
*/
|
||||||
protected boolean isDependent(String beanName, String dependentBeanName) {
|
protected boolean isDependent(String beanName, String dependentBeanName) {
|
||||||
Set<String> dependentBeans = this.dependentBeanMap.get(beanName);
|
String canonicalName = canonicalName(beanName);
|
||||||
|
Set<String> dependentBeans = this.dependentBeanMap.get(canonicalName);
|
||||||
if (dependentBeans == null) {
|
if (dependentBeans == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user