Changeset 3929

Show
Ignore:
Timestamp:
11/14/08 12:06:29 (2 months ago)
Author:
mtld
Message:

register AnnotationBeanDefinitionPostProcessor? as BeanFactoryPostProcessor?, fixes class name substitution issue

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/pfixcore/src/org/pustefixframework/container/spring/beans/AnnotationBeanDefinitionPostProcessor.java

    r3928 r3929  
    3434import org.springframework.beans.factory.config.BeanDefinition; 
    3535import org.springframework.beans.factory.config.BeanDefinitionHolder; 
     36import org.springframework.beans.factory.config.BeanFactoryPostProcessor; 
     37import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; 
    3638import org.springframework.beans.factory.config.RuntimeBeanReference; 
    3739import org.springframework.beans.factory.support.BeanDefinitionBuilder; 
     40import org.springframework.beans.factory.support.BeanDefinitionRegistry; 
    3841import org.springframework.beans.factory.support.BeanDefinitionValidationException; 
    3942import org.springframework.beans.factory.support.DefaultListableBeanFactory; 
     
    4649 * @author Sebastian Marsching <sebastian.marsching@1und1.de> 
    4750 */ 
    48 public class AnnotationBeanDefinitionPostProcessor { 
     51public class AnnotationBeanDefinitionPostProcessor implements BeanFactoryPostProcessor { 
     52     
    4953    private Map<String, String> scopedProxyMap = new HashMap<String, String>();  
    5054     
     
    6266     * is an interface the {@link ImplementedBy} annotation on this interface 
    6367     * 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}. 
    6471     *  
    6572     * @param beanFactory bean factory containing the bean definitions to check 
    6673     */ 
    67     public void postProcess(DefaultListableBeanFactory beanFactory) { 
     74    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) { 
    6875        prepareScopedProxyMap(beanFactory); 
    6976        String[] beanNames = beanFactory.getBeanDefinitionNames(); 
     
    7582    } 
    7683     
    77     private void prepareScopedProxyMap(DefaultListableBeanFactory beanFactory) { 
     84    private void prepareScopedProxyMap(ConfigurableListableBeanFactory beanFactory) { 
    7885        this.scopedProxyMap.clear(); 
    7986        for (String beanName : beanFactory.getBeanDefinitionNames()) { 
     
    98105     * invalid method 
    99106     */ 
    100     private void processBeanDefinition(String beanName, BeanDefinition beanDefinition, DefaultListableBeanFactory beanFactory) { 
     107    private void processBeanDefinition(String beanName, BeanDefinition beanDefinition, ConfigurableListableBeanFactory beanFactory) { 
    101108        ClassLoader beanClassLoader = getClassLoader(beanFactory); 
    102         //TODO: remove quickfix 
    103         if (beanDefinition.getBeanClassName().contains("${")) return; 
    104109        Class<?> beanClass; 
    105110        try { 
     
    186191     * could be found or created 
    187192     */ 
    188     private RuntimeBeanReference findOrCreateBeanDefinition(Class<?> wantedType, DefaultListableBeanFactory beanFactory) { 
     193    private RuntimeBeanReference findOrCreateBeanDefinition(Class<?> wantedType, ConfigurableListableBeanFactory beanFactory) { 
    189194         
    190195        RuntimeBeanReference beanRef = beanRefCache.get(wantedType); 
     
    201206            } 
    202207            BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName); 
    203             //TODO: remove quickfix 
    204             if (beanDefinition.getBeanClassName().contains("${")) continue; 
    205208            Class<?> beanClass; 
    206209            try { 
     
    230233                beanFactory.getBeanDefinition(matchingBeanName); 
    231234            } 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; 
    232241                Scope annotation = beanClass.getAnnotation(Scope.class); 
    233242                BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(beanClass); 
     
    241250                BeanDefinitionHolder beanHolder = new BeanDefinitionHolder(beanDefinition, matchingBeanName); 
    242251                if (scopeName != null && !(scopeName.equals("singleton") || scopeName.equals("prototype"))) { 
    243                     beanHolder = ScopedProxyUtils.createScopedProxy(beanHolder, beanFactory, true); 
    244                 } 
    245                 beanFactory.registerBeanDefinition(beanHolder.getBeanName(), beanHolder.getBeanDefinition()); 
     252                    beanHolder = ScopedProxyUtils.createScopedProxy(beanHolder, beanRegistry, true); 
     253                } 
     254                beanRegistry.registerBeanDefinition(beanHolder.getBeanName(), beanHolder.getBeanDefinition()); 
    246255            } 
    247256        } 
     
    293302     * @return class loader to load bean classes with 
    294303     */ 
    295     private ClassLoader getClassLoader(DefaultListableBeanFactory beanFactory) { 
     304    private ClassLoader getClassLoader(ConfigurableListableBeanFactory beanFactory) { 
    296305        ClassLoader loader = beanFactory.getBeanClassLoader(); 
    297306        if (loader == null) { 
  • trunk/pfixcore/src/org/pustefixframework/container/spring/beans/PustefixWebApplicationContext.java

    r3926 r3929  
    8686 
    8787        } 
    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); 
    9199    } 
    92100