首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >设置为静态字段的RuntimeBeanReference

设置为静态字段的RuntimeBeanReference
EN

Stack Overflow用户
提问于 2017-06-29 21:05:37
回答 1查看 94关注 0票数 0

我有一个带有静态字段的类,并且我想将在Runtime中创建的bean引用设置为该字段。下面我就是这么写的。

代码语言:javascript
运行
复制
@Service
public class Beauty extends Base{
    public static staticService;

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

Base.class

代码语言:javascript
运行
复制
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();
}

但是当我使用Beauty时。然后,staticService让null.How使其正常工作。

顺便说一句:由于我想获得可以代理的staticService bean,所以我不能在初始化建议bean之前使用applicationContext.getBean来设置字段。

EN

回答 1

Stack Overflow用户

发布于 2017-06-29 23:59:21

试试这个:

代码语言:javascript
运行
复制
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();
}

和美容服务

代码语言:javascript
运行
复制
@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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44826003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档