我们需要将bean配置为基础结构bean BeanDefinition.ROLE_INFRASTRUCTURE,以便InfrastructureAdvisorAutoProxyCreator考虑它。
但是我们找不到通过xml配置bean角色的方法。
目前我们有bean实现BeanFactoryAware,然后在setBeanFactory中设置角色,如下所示:
ConfigurableListableBeanFactory configurableListableBeanFactory = (ConfigurableListableBeanFactory) beanFactory;
AbstractBeanDefinition beanDefinition = (AbstractBeanDefinition) configurableListableBeanFactory.getBeanDefinition("hibernateSessionAnnotationAdvisor");
beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
这显然不是很好,我们宁愿通过xml。
这样做即使我们的bean是通过xml配置的,有没有办法使用@Role注释?
答案 0 :(得分:4)
您可以使用BeanFactoryPostProcessor
并配置要更改的bean名称(或类型)。
例如:
public class RoleBeanDefinitionConfigurer implements BeanDefinitionRegistryPostProcessor {
private String[] beanNames;
@Override
public void postProcessBeanFactory(
ConfigurableListableBeanFactory beanFactory) throws BeansException {
}
@Override
public void postProcessBeanDefinitionRegistry(
BeanDefinitionRegistry registry) throws BeansException {
if (beanNames == null)
return;
for (String name : beanNames) {
if (registry.containsBeanDefinition(name))
((AbstractBeanDefinition) registry.getBeanDefinition(name)).setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
}
}
public String[] getBeanNames() {
return beanNames;
}
public void setBeanNames(String[] beanNames) {
this.beanNames = beanNames;
}
}