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