2012-09-01 87 views
1

我有一个标准的bean,需要自动装配一些属性。Spring Spring Autowire在BeanFactoryPostProcessor中创建的bean

@Service 
public class MyServiceImpl implements MyService { 

    @Autowired 
    private FirstRepository first; 

    public MyServiceImpl() { 

    } 

我使用Java配置找到豆:

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

然而,FirstRepository豆不存在,所以我在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已正确创建。

有什么建议吗?

回答

0

这个例外是说当项目正在构建时没有为FirstRepository类定义bean。 我在这里也看不到它。

最简单的解决办法是有一个bean定义在application-context.xml这样的:

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

在这种情况下,在启动时,会出现该bean定义。

+0

对不起,如果我不清楚。问题的关键是必须在BeanFactoryPostProcessor中创建bean。它不能被添加到application-context.xml中。 – dough