Changeset 3929
- Timestamp:
- 11/14/08 12:06:29 (2 months ago)
- Files:
-
- trunk/pfixcore/src/org/pustefixframework/container/spring/beans/AnnotationBeanDefinitionPostProcessor.java (modified) (10 diffs)
- trunk/pfixcore/src/org/pustefixframework/container/spring/beans/BeanFactoryImplNotSupportedException.java (added)
- trunk/pfixcore/src/org/pustefixframework/container/spring/beans/PustefixWebApplicationContext.java (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/pfixcore/src/org/pustefixframework/container/spring/beans/AnnotationBeanDefinitionPostProcessor.java
r3928 r3929 34 34 import org.springframework.beans.factory.config.BeanDefinition; 35 35 import org.springframework.beans.factory.config.BeanDefinitionHolder; 36 import org.springframework.beans.factory.config.BeanFactoryPostProcessor; 37 import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; 36 38 import org.springframework.beans.factory.config.RuntimeBeanReference; 37 39 import org.springframework.beans.factory.support.BeanDefinitionBuilder; 40 import org.springframework.beans.factory.support.BeanDefinitionRegistry; 38 41 import org.springframework.beans.factory.support.BeanDefinitionValidationException; 39 42 import org.springframework.beans.factory.support.DefaultListableBeanFactory; … … 46 49 * @author Sebastian Marsching <sebastian.marsching@1und1.de> 47 50 */ 48 public class AnnotationBeanDefinitionPostProcessor { 51 public class AnnotationBeanDefinitionPostProcessor implements BeanFactoryPostProcessor { 52 49 53 private Map<String, String> scopedProxyMap = new HashMap<String, String>(); 50 54 … … 62 66 * is an interface the {@link ImplementedBy} annotation on this interface 63 67 * is used to determine the type of the bean. 68 * Automatically creating new beans can only work if the passed BeanFactory 69 * implements the {@link BeanDefinitionRegistry} interface, otherwise this 70 * method will throw a {@link BeanFactoryImplNotSupportedException}. 64 71 * 65 72 * @param beanFactory bean factory containing the bean definitions to check 66 73 */ 67 public void postProcess (DefaultListableBeanFactory beanFactory) {74 public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) { 68 75 prepareScopedProxyMap(beanFactory); 69 76 String[] beanNames = beanFactory.getBeanDefinitionNames(); … … 75 82 } 76 83 77 private void prepareScopedProxyMap( DefaultListableBeanFactory beanFactory) {84 private void prepareScopedProxyMap(ConfigurableListableBeanFactory beanFactory) { 78 85 this.scopedProxyMap.clear(); 79 86 for (String beanName : beanFactory.getBeanDefinitionNames()) { … … 98 105 * invalid method 99 106 */ 100 private void processBeanDefinition(String beanName, BeanDefinition beanDefinition, DefaultListableBeanFactory beanFactory) {107 private void processBeanDefinition(String beanName, BeanDefinition beanDefinition, ConfigurableListableBeanFactory beanFactory) { 101 108 ClassLoader beanClassLoader = getClassLoader(beanFactory); 102 //TODO: remove quickfix103 if (beanDefinition.getBeanClassName().contains("${")) return;104 109 Class<?> beanClass; 105 110 try { … … 186 191 * could be found or created 187 192 */ 188 private RuntimeBeanReference findOrCreateBeanDefinition(Class<?> wantedType, DefaultListableBeanFactory beanFactory) {193 private RuntimeBeanReference findOrCreateBeanDefinition(Class<?> wantedType, ConfigurableListableBeanFactory beanFactory) { 189 194 190 195 RuntimeBeanReference beanRef = beanRefCache.get(wantedType); … … 201 206 } 202 207 BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName); 203 //TODO: remove quickfix204 if (beanDefinition.getBeanClassName().contains("${")) continue;205 208 Class<?> beanClass; 206 209 try { … … 230 233 beanFactory.getBeanDefinition(matchingBeanName); 231 234 } catch (NoSuchBeanDefinitionException e) { 235 if(!(beanFactory instanceof BeanDefinitionRegistry)) { 236 throw new BeanFactoryImplNotSupportedException("Automatically creating bean definitions for " + 237 "beans injected using the @Inject annotation requires a BeanFactory which implements " + 238 "the BeanDefinitionRegistry interface."); 239 } 240 BeanDefinitionRegistry beanRegistry = (BeanDefinitionRegistry)beanFactory; 232 241 Scope annotation = beanClass.getAnnotation(Scope.class); 233 242 BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(beanClass); … … 241 250 BeanDefinitionHolder beanHolder = new BeanDefinitionHolder(beanDefinition, matchingBeanName); 242 251 if (scopeName != null && !(scopeName.equals("singleton") || scopeName.equals("prototype"))) { 243 beanHolder = ScopedProxyUtils.createScopedProxy(beanHolder, bean Factory, true);244 } 245 bean Factory.registerBeanDefinition(beanHolder.getBeanName(), beanHolder.getBeanDefinition());252 beanHolder = ScopedProxyUtils.createScopedProxy(beanHolder, beanRegistry, true); 253 } 254 beanRegistry.registerBeanDefinition(beanHolder.getBeanName(), beanHolder.getBeanDefinition()); 246 255 } 247 256 } … … 293 302 * @return class loader to load bean classes with 294 303 */ 295 private ClassLoader getClassLoader( DefaultListableBeanFactory beanFactory) {304 private ClassLoader getClassLoader(ConfigurableListableBeanFactory beanFactory) { 296 305 ClassLoader loader = beanFactory.getBeanClassLoader(); 297 306 if (loader == null) { trunk/pfixcore/src/org/pustefixframework/container/spring/beans/PustefixWebApplicationContext.java
r3926 r3929 86 86 87 87 } 88 89 AnnotationBeanDefinitionPostProcessor annotationPostProcessor = new AnnotationBeanDefinitionPostProcessor(); 90 annotationPostProcessor.postProcess(beanFactory); 88 89 addAnnotationBeanDefinitionPostProcessor(beanFactory); 90 } 91 92 private void addAnnotationBeanDefinitionPostProcessor(BeanDefinitionRegistry registry) { 93 BeanDefinitionBuilder beanBuilder = BeanDefinitionBuilder.genericBeanDefinition(AnnotationBeanDefinitionPostProcessor.class); 94 beanBuilder.setScope("singleton"); 95 BeanDefinition definition = beanBuilder.getBeanDefinition(); 96 DefaultBeanNameGenerator beanNameGenerator = new DefaultBeanNameGenerator(); 97 String name = beanNameGenerator.generateBeanName(definition, registry); 98 registry.registerBeanDefinition(name, definition); 91 99 } 92 100
