core/src/main/java/org/springframework/security/access/method/DelegatingMethodSecurityMetadataSource.java
public Collection<ConfigAttribute> getAttributes(Method method, Class<?> targetClass) {
		DefaultCacheKey cacheKey = new DefaultCacheKey(method, targetClass);
		synchronized (attributeCache) {
			Collection<ConfigAttribute> cached = attributeCache.get(cacheKey);
			// Check for canonical value indicating there is no config attribute,

			if (cached != null) {
				return cached;
			}

			// No cached value, so query the sources to find a result
			Collection<ConfigAttribute> attributes = null;
			for (MethodSecurityMetadataSource s : methodSecurityMetadataSources) {
				attributes = s.getAttributes(method, targetClass);
				if (attributes != null && !attributes.isEmpty()) {
					break;
				}
			}

			// Put it in the cache.
			if (attributes == null || attributes.isEmpty()) {
				this.attributeCache.put(cacheKey, NULL_CONFIG_ATTRIBUTE);
				return NULL_CONFIG_ATTRIBUTE;
			}

			if (logger.isDebugEnabled()) {
				logger.debug("Caching method [" + cacheKey + "] with attributes "
						+ attributes);
			}

			this.attributeCache.put(cacheKey, attributes);

			return attributes;
		}
	}
public Collection<ConfigAttribute> getAttributes(Method method, Class<?> targetClass) {
		DefaultCacheKey cacheKey = new DefaultCacheKey(method, targetClass);
		synchronized (attributeCache) {
			Collection<ConfigAttribute> cached = attributeCache.get(cacheKey);
			// Check for canonical value indicating there is no config attribute,

			if (cached != null) {
				return cached;
			}

			// No cached value, so query the sources to find a result
			Collection<ConfigAttribute> attributes = null;
			for (MethodSecurityMetadataSource s : methodSecurityMetadataSources) {
				attributes = s.getAttributes(method, targetClass);
				if (attributes != null && !attributes.isEmpty()) {
					break;
				}
			}

			// Put it in the cache.
			if (attributes == null || attributes.isEmpty()) {
				this.attributeCache.put(cacheKey, NULL_CONFIG_ATTRIBUTE);
				return NULL_CONFIG_ATTRIBUTE;
			}

			if (logger.isDebugEnabled()) {
				logger.debug("Caching method [" + cacheKey + "] with attributes "
						+ attributes);
			}

			this.attributeCache.put(cacheKey, attributes);

			return attributes;
		}
	}
public Collection < ConfigAttribute > getAttributes ( Method method , Class < ? > targetClass ) { DefaultCacheKey cacheKey = new DefaultCacheKey ( method , targetClass ) ; synchronized ( attributeCache ) { Collection < ConfigAttribute > cached = attributeCache . get ( cacheKey ) ; // Check for canonical value indicating there is no config attribute, if ( cached != null ) { return cached ; } // No cached value, so query the sources to find a result Collection < ConfigAttribute > attributes = null ; for ( MethodSecurityMetadataSource s : methodSecurityMetadataSources ) { attributes = s . getAttributes ( method , targetClass ) ; if ( attributes != null && ! attributes . isEmpty ( ) ) { break ; } } // Put it in the cache. if ( attributes == null || attributes . isEmpty ( ) ) { this . attributeCache . put ( cacheKey , NULL_CONFIG_ATTRIBUTE ) ; return NULL_CONFIG_ATTRIBUTE ; } if ( logger . isDebugEnabled ( ) ) { logger . debug ( "Caching method [" + cacheKey + "] with attributes " + attributes ) ; } this . attributeCache . put ( cacheKey , attributes ) ; return attributes ; } }
========================================================================================================
========================================================================================================