我有一个带有静态字段的类,并且我想将在Runtime中创建的bean引用设置为该字段。下面我就是这么写的。
@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();
}但是当我使用Beauty时。然后,staticService让null.How使其正常工作。
顺便说一句:由于我想获得可以代理的staticService bean,所以我不能在初始化建议bean之前使用applicationContext.getBean来设置字段。
发布于 2017-06-29 23:59:21
试试这个:
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;
}
}https://stackoverflow.com/questions/44826003
复制相似问题