gpt4 book ai didi

java - 可以在 BeanFactoryPostProcessor 中创建 Spring Autowire beans

转载 作者:行者123 更新时间:2023-12-01 05:09:29 25 4
gpt4 key购买 nike

我有一个标准 bean,其中有一些需要 Autowiring 的属性。

@Service
public class MyServiceImpl implements MyService {

@Autowired
private FirstRepository first;

public MyServiceImpl() {

}

我使用 Java 配置来查找 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 定义。

关于java - 可以在 BeanFactoryPostProcessor 中创建 Spring Autowire beans,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12225134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com