我正在开发一个SpringBoot应用程序(例如MyApp),它依赖于两个具有不同实现的数据项目:
data-jdbc.jar
- 使用
spring-boot-starter-jdbc
构建,它公开了JDBCDataService类,该类将被我的应用程序使用
示例代码:
@Service
public class JDBCDataServiceImpl implements JDBCDataService {
@Autowired
private JDBCDataRepository jdbcDataRepository;
...
}
- 使用
my.data.jdbc
包 - 没有SpringBoot主类。Spring配置仅为单元测试类创建
- 存储库类正在使用
JDBCTemplate
示例存储库:
@Repository
public class JDBCDataRepositoryImpl implements JDBCDataRepository {
@Autowired
protected JdbcTemplate jdbcTemplate;
...
}
data-jpa.jar
- 使用
spring-boot-starter-data-jpa
构建,该工具还提供了JPADataService类,我的应用程序也将使用它
示例代码:
@Service
public class JPADataServiceImpl implements JPADataService {
@Autowired
private JPADataRepository jpaDataRepository;
...
}
- 使用
my.data.jpa
包 - 没有SpringBoot主类。Spring配置仅为单元测试类创建
- 存储库类扩展了
CrudRepository
接口
示例存储库:
@Repository
public interface JPADataRepository extends CrudRepository<MyObject, Integer{
...
}
在我的SpringBoot项目中,我有以下的SpringBoot主应用程序:
@SpringBootApplication
public class MyApp extends SpringBootServletInitializer {
}
在我的业务服务
MainService
类中,我有以下的注入。@Service
public class MainServiceImpl implements MainService {
@Autowired
private JDBCDataService jdbcDataService;
@Autowired
private JPADataService jpaDataService;
然而,我遇到了问题“Could not Autowire. No beans of 'JPADataService' type found”,该问题仅存在于
JPADataService
类中,但对于JDBCService
类却可以正常工作。我尝试了以下问题中提到的解决方案,但在我的情况下都不起作用: 无法为存在于依赖库jar中的Bean使用@Autowire吗?
@ComponentScan(basePackages = {"org.example.main", "package.of.user.class"})
@Configuration
@ComponentScan("com.package.where.my.class.is")
class Config {
...
}
我已经找到了解决方案。为了扫描我的数据库库,我必须将主要的MyApp.java文件上移一个包级别。
我不再将MyApp.java
放在my.app
包下,而是必须将其移到my
下,以便成功扫描带有my.data.jpa
和my.data.jdbc
包的库。
JPADataService
类上标注了@Component
才能使用@ComponentScan
。您需要在@Configuration
类中添加一个带有@Bean
注释的方法。http://docs.spring.io/spring-javaconfig/docs/1.0.0.m3/reference/html/creating-bean-definitions.html - Christopher Schneider@Service
注解。据我所知,@ComponentScan
也应该能够读取这些类。 - Jown