Can Spring可以在BeanFactoryPostProcessor中创建自动装配bean

时间:2012-09-01 05:21:52

标签: java spring

我有一个标准bean,其中包含一些需要自动装配的属性。

@Service
public class MyServiceImpl implements MyService {

    @Autowired
    private FirstRepository first;

    public MyServiceImpl() {

    }

我使用Java Config查找bean:

@Configuration
@ComponentScan(basePackages = "com.company", excludeFilters = { @Filter(Configuration.class) })
public class MainConfig {
}

但是,FirstRepository Bean不存在所以我在BeanFactoryPostProcessor中创建它:

public class RepoGeneratorPostProcessor implements BeanFactoryPostProcessor {

    public void postProcessBeanFactory(
            ConfigurableListableBeanFactory beanFactory) throws BeansException {

        GenericBeanDefinition jpaR = new GenericBeanDefinition();
        jpaR.setBeanClass(JpaRepositoryFactoryBean.class);
        jpaR.setAutowireCandidate(true);
        jpaR.setAutowireMode(GenericBeanDefinition.AUTOWIRE_BY_TYPE);
        jpaR.setLazyInit(false);
        jpaR.setPropertyValues(new MutablePropertyValues().add("repositoryInterface", FirstRepository.class));

        RootBeanDefinition definition = new RootBeanDefinition();
        definition.setBeanClass(FirstRepository.class);
        definition.setAutowireCandidate(true);
        definition.setFactoryBeanName("&jpaR");
        definition.setFactoryMethodName("getObject");
        definition.setAutowireMode(GenericBeanDefinition.AUTOWIRE_BY_NAME);
        definition.setLazyInit(false);
        definition.setAttribute(RequiredAnnotationBeanPostProcessor.SKIP_REQUIRED_CHECK_ATTRIBUTE, Boolean.TRUE);


        BeanDefinitionRegistry registry = (BeanDefinitionRegistry)beanFactory;
        registry.registerBeanDefinition("jpaR", jpaR);
        registry.registerBeanDefinition("first", definition);

 }

当我启动我的应用程序时,我得到以下异常,这似乎表明Spring无法找到FirstRepository bean。

org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [com.company.FirstRepository] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency.

如果我删除@Autowired注释,我可以在启动后看到正确创建了FirstRepository bean。

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

此异常表示在构建项目时没有为FirstRepository类定义bean。 我在这里也看不到它。

最简单的解决方案是在application-context.xml中使用这样的bean定义:

<bean id="firstRepository" class="your.package.FirstRepository" autowire="byName"/>

在这种情况下,启动时会有bean定义。

答案 1 :(得分:0)

我认为你不需要&amp;在

中的beanname之前
definition.setFactoryBeanName("&jpaR");

我在我的项目中使用了类似的东西

definition.setFactoryBeanName("jpaR");

它按预期工作

&amp;如果你需要获取名为first的bean的工厂bean,则需要它。 &amp;首先应该返回jpaR。

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#beans-factory-extension-factorybean