1 16 17 package org.springframework.beans.factory.support; 18 19 import java.util.ArrayList ; 20 import java.util.HashMap ; 21 import java.util.Iterator ; 22 import java.util.List ; 23 import java.util.Map ; 24 import java.util.Set ; 25 26 import org.springframework.beans.BeansException; 27 import org.springframework.beans.factory.BeanCreationException; 28 import org.springframework.beans.factory.BeanFactoryUtils; 29 import org.springframework.beans.factory.BeanIsNotAFactoryException; 30 import org.springframework.beans.factory.BeanNotOfRequiredTypeException; 31 import org.springframework.beans.factory.FactoryBean; 32 import org.springframework.beans.factory.ListableBeanFactory; 33 import org.springframework.beans.factory.NoSuchBeanDefinitionException; 34 import org.springframework.beans.factory.SmartFactoryBean; 35 import org.springframework.util.StringUtils; 36 37 56 public class StaticListableBeanFactory implements ListableBeanFactory { 57 58 59 private final Map beans = new HashMap (); 60 61 62 68 public void addBean(String name, Object bean) { 69 this.beans.put(name, bean); 70 } 71 72 73 77 public Object getBean(String name) throws BeansException { 78 String beanName = BeanFactoryUtils.transformedBeanName(name); 79 80 Object bean = this.beans.get(beanName); 81 if (bean == null) { 82 throw new NoSuchBeanDefinitionException(beanName, 83 "Defined beans are [" + StringUtils.collectionToCommaDelimitedString(this.beans.keySet()) + "]"); 84 } 85 86 if (BeanFactoryUtils.isFactoryDereference(name) && !(bean instanceof FactoryBean)) { 89 throw new BeanIsNotAFactoryException(beanName, bean.getClass()); 90 } 91 92 if (bean instanceof FactoryBean && !BeanFactoryUtils.isFactoryDereference(name)) { 93 try { 94 return ((FactoryBean) bean).getObject(); 95 } 96 catch (Exception ex) { 97 throw new BeanCreationException(beanName, "FactoryBean threw exception on object creation", ex); 98 } 99 } 100 return bean; 101 } 102 103 public Object getBean(String name, Class requiredType) throws BeansException { 104 Object bean = getBean(name); 105 if (requiredType != null && !requiredType.isAssignableFrom(bean.getClass())) { 106 throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass()); 107 } 108 return bean; 109 } 110 111 public boolean containsBean(String name) { 112 return this.beans.containsKey(name); 113 } 114 115 public boolean isSingleton(String name) throws NoSuchBeanDefinitionException { 116 Object bean = getBean(name); 117 return (bean instanceof FactoryBean && ((FactoryBean) bean).isSingleton()); 119 } 120 121 public boolean isPrototype(String name) throws NoSuchBeanDefinitionException { 122 Object bean = getBean(name); 123 return ((bean instanceof SmartFactoryBean && ((SmartFactoryBean) bean).isPrototype()) || 125 (bean instanceof FactoryBean && !((FactoryBean) bean).isSingleton())); 126 } 127 128 public boolean isTypeMatch(String name, Class targetType) throws NoSuchBeanDefinitionException { 129 Class type = getType(name); 130 return (targetType == null || (type != null && targetType.isAssignableFrom(type))); 131 } 132 133 public Class getType(String name) throws NoSuchBeanDefinitionException { 134 String beanName = BeanFactoryUtils.transformedBeanName(name); 135 136 Object bean = this.beans.get(beanName); 137 if (bean == null) { 138 throw new NoSuchBeanDefinitionException(beanName, 139 "Defined beans are [" + StringUtils.collectionToCommaDelimitedString(this.beans.keySet()) + "]"); 140 } 141 142 if (bean instanceof FactoryBean && !BeanFactoryUtils.isFactoryDereference(name)) { 143 return ((FactoryBean) bean).getObjectType(); 145 } 146 return bean.getClass(); 147 } 148 149 public String [] getAliases(String name) { 150 return new String [0]; 151 } 152 153 154 158 public boolean containsBeanDefinition(String name) { 159 return this.beans.containsKey(name); 160 } 161 162 public int getBeanDefinitionCount() { 163 return this.beans.size(); 164 } 165 166 public String [] getBeanDefinitionNames() { 167 return StringUtils.toStringArray(this.beans.keySet()); 168 } 169 170 public String [] getBeanNamesForType(Class type) { 171 return getBeanNamesForType(type, true, true); 172 } 173 174 public String [] getBeanNamesForType(Class type, boolean includePrototypes, boolean includeFactoryBeans) { 175 boolean isFactoryType = (type != null && FactoryBean.class.isAssignableFrom(type)); 176 List matches = new ArrayList (); 177 Set keys = this.beans.keySet(); 178 Iterator it = keys.iterator(); 179 while (it.hasNext()) { 180 String name = (String ) it.next(); 181 Object beanInstance = this.beans.get(name); 182 if (beanInstance instanceof FactoryBean && !isFactoryType) { 183 if (includeFactoryBeans) { 184 Class objectType = ((FactoryBean) beanInstance).getObjectType(); 185 if (objectType != null && type.isAssignableFrom(objectType)) { 186 matches.add(name); 187 } 188 } 189 } 190 else { 191 if (type.isInstance(beanInstance)) { 192 matches.add(name); 193 } 194 } 195 } 196 return StringUtils.toStringArray(matches); 197 } 198 199 public Map getBeansOfType(Class type) throws BeansException { 200 return getBeansOfType(type, true, true); 201 } 202 203 public Map getBeansOfType(Class type, boolean includePrototypes, boolean includeFactoryBeans) 204 throws BeansException { 205 206 boolean isFactoryType = (type != null && FactoryBean.class.isAssignableFrom(type)); 207 Map matches = new HashMap (); 208 209 Iterator it = this.beans.entrySet().iterator(); 210 while (it.hasNext()) { 211 Map.Entry entry = (Map.Entry ) it.next(); 212 String beanName = (String ) entry.getKey(); 213 Object beanInstance = entry.getValue(); 214 215 if (beanInstance instanceof FactoryBean && !isFactoryType) { 217 if (includeFactoryBeans) { 218 FactoryBean factory = (FactoryBean) beanInstance; 220 Class objectType = factory.getObjectType(); 221 if ((includePrototypes || factory.isSingleton()) && 222 objectType != null && type.isAssignableFrom(objectType)) { 223 matches.put(beanName, getBean(beanName)); 224 } 225 } 226 } 227 else { 228 if (type.isInstance(beanInstance)) { 229 if (isFactoryType) { 232 beanName = FACTORY_BEAN_PREFIX + beanName; 233 } 234 matches.put(beanName, beanInstance); 235 } 236 } 237 } 238 return matches; 239 } 240 241 } 242 | Popular Tags |