2017-06-29 98 views
0

我有一個靜態字段的類,我想設置一個在運行時創建的這個字段的bean引用。這是我在下面寫的。RuntimeBeanReference設置爲一個靜態字段

@Service 
public class Beauty extends Base{ 
    public static staticService; 

    @Override 
    protected void initField() { 
     initBean() 
    } 
} 

Base.class

public abstract class Base implements BeanFactoryAware, BeanFactoryPostProcessor { 

    private BeanFactory beanFactory; 

    private ConfigurableListableBeanFactory configurableListableBeanFactory; 

    protected void initBean(){ 
     GenericBeanDefinition beanDefinition = new GenericBeanDefinition(); 
     beanDefinition.setBeanClassName("com.StaticService"); 
     beanDefinition.setInitMethodName("init"); 

     MutablePropertyValues values = new MutablePropertyValues(); 
     values.addPropertyValue("fieldA", "aValue"); 
     values.addPropertyValue("fieldB, "bValue"); 

     beanDefinition.setPropertyValues(values); 

     String beanName = "staticService"; 
     ((BeanDefinitionRegistry) beanFactory).registerBeanDefinition(beanName, beanDefinition); 
     String[] beanNames = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(configurableListableBeanFactory, this.getClass()); 
     if (null == beanNames || beanNames.length > 1) { 
      throw new RuntimeException("error with multi client"); 
     } 
     BeanDefinition beautyBean = ((BeanDefinitionRegistry) beanFactory).getBeanDefinition(beanNames[0]); 
     beautyBean.getPropertyValues().addPropertyValue(new PropertyValue(staticService, new RuntimeBeanReference(beanName))); 
    } 

    @Override 
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException { 
     this.beanFactory = beanFactory; 
    } 

    @Override 
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { 
     this.configurableListableBeanFactory = beanFactory; 
     initField(); 
    } 

    protected abstract void initField(); 
} 

但是當我使用美容。 staticService然後得到null.How使它工作。

順便說一句:因爲我想要得到的staticService bean可以被代理,所以我不能使用applicationContext.getBean設置到建議bean inited之前的字段。

回答

0

試試這個:

public abstract class Base implements BeanFactoryAware, BeanFactoryPostProcessor{  
    private AutowireCapableBeanFactory beanFactory; 

    private ConfigurableListableBeanFactory configurableListableBeanFactory; 

    protected void initBean(){ 
     GenericBeanDefinition beanDefinition = new GenericBeanDefinition(); 
     beanDefinition.setBeanClassName("com.StaticService.StaticService"); 
     beanDefinition.setInitMethodName("init"); 

     MutablePropertyValues values = new MutablePropertyValues(); 
     values.addPropertyValue("fieldA", "aValue"); 
     values.addPropertyValue("fieldB", "bValue"); 
     beanDefinition.setPropertyValues(values); 

     String beanName = "staticService"; 
     ((BeanDefinitionRegistry) beanFactory) 
        .registerBeanDefinition(beanName, beanDefinition); 
     beanFactory.autowireBeanProperties(this, 
         AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, false); 
    } 

    @Override 
    public void setBeanFactory(BeanFactory beanFactory) 
             throws BeansException { 
     this.beanFactory = (AutowireCapableBeanFactory) beanFactory; 
    } 

    @Override 
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) 
                 throws BeansException { 
     this.configurableListableBeanFactory = beanFactory; 
     initBean(); 
    } 

    protected abstract void initField(); 
} 

和美容服務

@Service 
public class Beauty extends Base{ 
    public static StaticService staticService; 

    @Override 
    protected void initField() { 
     initBean(); 
    } 

    public StaticService getStaticService() { 
     return staticService; 
    } 

    public void setStaticService(StaticService staticService) { 
     this.staticService = staticService; 
    } 
} 
+0

感謝您的答覆。正如我剛剛嘗試的那樣,它不是null,使用autowireBeanProperties,但正如我在BTW中指出的那樣,Beauty。我的方面bean不能提供staticService。 – neptune

+0

你可以顯示ascpet或你需要如何使用staticService嗎?它真的應該是靜態字段嗎? – xyz

+0

是的,它真的應該是靜態的領域,因爲我的問題說。這是我的方面。 @Around(「執行(* com.StaticService)」)。 – neptune