簡體   English   中英

可以彈跳在BeanFactoryPostProcessor中創建的Autowire Bean

[英]Can Spring Autowire beans created in a BeanFactoryPostProcessor

我有一個標准的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已正確創建。

有什么建議么?

此異常表示在構建項目時,沒有為FirstRepository類定義任何bean。 我在這里也看不到它。

最簡單的解決方案是在application-context.xml具有如下所示的bean定義:

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

在這種情況下,在啟動時將有該bean定義。

我認為您不需要在bean名稱前加上&

definition.setFactoryBeanName("&jpaR");

我在項目中使用了類似的方法

definition.setFactoryBeanName("jpaR");

它按預期工作

如果需要獲取名為first的bean的工廠bean,則需要&。 &first應該返回jpaR。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM