在我的用例中,我有两个项目,分别是projectA和projectB,projectB被添加为projectA中的maven依赖项。我正在尝试从projectA调用projectB服务。为此,我在projectB中创建了一个配置类:
@Configuration
public class BeanConfig {
@Bean
@ConditionalOnMissingBean
public MyService<String, Object> myBean(){
return new MyServiceImpl();
}
}在MyServiceImpl中,我正在自动编写MyDao。错误是它不能为MyDao创建bean。
如果我在下面的projectA主类中提到的话。
@SpringBootApplication(scanBasePackages = { "org.my.service" }) 一切运行正常。
如何创建Bean而不在项目A中提及基包?
发布于 2018-09-14 20:53:58
您正在实例化MyServiceImpl
return new MyServiceImpl();所以Spring不能自动生成这个类中的任何东西。
这与您的多模块项目无关。
要么使用自动装配,要么必须在配置方法中设置服务类上的DAO。
发布于 2018-09-14 21:07:20
如果您想要扫描单个bean而不启用整个包的组件扫描,您可以使用:
@Import(MyServiceImpl.class)然后,这个特定的bean将启用spring,并扫描适当的spring注释。
更新:正如其他人在创建服务时指出的那样
return new MyServiceImpl();这种类型的创建将禁用MyServiceImpl的自动装配功能。这样做的原因是,一旦您自己调用了构造函数,Spring就不再参与bean及其依赖项的创建。
我通过@Import声明向您指出的机制假定您尚未从projectA启用对projectB的组件扫描。在这种情况下,如果我们假设BeanConfig驻留在projectA中。然后你需要确保两件事:
1.您在projectB中的存储库应该使用@Repository注释,因为您的MyServiceImpl应该使用@Service2注释。在类级别的BeanConfig中,您应该放置以下定义:
@Configuration
@Import({MyServiceImpl.class, MyDao.class})
public class BeanConfig {
}由于MyServiceImpl和MyDao使用服务和存储库进行了注释,因此您将不再需要使用@Bean方法myBean进行注释。
为了让projectB中的@Repository注释工作,您需要在projectA上启用Repositories。确保通过EnableJpaRepositories启用它,方法是从包含此注释的projectB导入相关类,或者在projectA中注释Config类。
发布于 2018-09-14 21:11:23
如果您的spring boot应用程序结构正确,那么您不应该指定一个基础包来获取您的配置。Spring boot应该自然地扫描包含您的配置的包并相应地注册您的bean。
参考:https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-structuring-your-code.html
https://stackoverflow.com/questions/52331686
复制相似问题