Spring @初级飞行

Spring @初级飞行,spring,kotlin,spring-data-jpa,Spring,Kotlin,Spring Data Jpa,我需要一个建议 我有一个基本的Maven项目,在这里我声明了我的所有存储库、实体和持久性类。它们都是无XML配置的。每个数据库及其所有相关类都划分在包中。此项目中的所有内容都有注释,如:@Entity、@Repository、@Configuration、@Primary等。。。看起来是这样的: 现在,radiusftx.domain包上的bean被注释为@Primary。这个项目基本上是it,它自己什么都不做 然后,当我创建一个需要访问任何数据库的新项目时,我只需使用Maven导入第一个项目

我需要一个建议

我有一个基本的Maven项目,在这里我声明了我的所有存储库、实体和持久性类。它们都是无XML配置的。每个数据库及其所有相关类都划分在包中。此项目中的所有内容都有注释,如:@Entity、@Repository、@Configuration、@Primary等。。。看起来是这样的:

现在,radiusftx.domain包上的bean被注释为@Primary。这个项目基本上是it,它自己什么都不做

然后,当我创建一个需要访问任何数据库的新项目时,我只需使用Maven导入第一个项目,在新项目初始化时,我会这样更改它(是Kotlin,但我很确定您可以理解):


您可以使用
@Qualifier
,也可以根本不将组件标记为
@component
,而是将它们作为简单类保留在lib中,并在客户端应用程序中将任意一个设置为
@Bean

通过这种方式,您可以拥有单个数据源,或者如果需要更多数据源,您可以在所需的
@Bean
上添加
@Primary


关于配置文件,您可以在prod/dev/test之外设置其他配置文件,例如
prod、ds1
prod、ds2
test、tds1
,等等。

您可以使用
@Qualifier
,或者根本不将组件标记为
@component
,相反,将它们作为简单类保留在lib中,并在客户机应用程序中将任意一个设置为
@Bean

通过这种方式,您可以拥有单个数据源,或者如果需要更多数据源,您可以在所需的
@Bean
上添加
@Primary


关于配置文件,除了prod/dev/test之外,您还可以设置其他配置文件,例如
prod、ds1
prod、ds2
test、tds1
,等等。

感谢所有的答案,您让我看到了正确的方向

虽然我了解@Qualifier的用法,但它对于我的特定项目来说还不够,因为据我所知,注释必须位于导入的“library”项目上。我的问题实际上与事务有关,因为在导入持久性配置尚未标记为@Primary的特定包之后,我无法指定@Primary

这就是我解决问题的方法

除了在“library”项目上创建存储库之外,我还在那里创建了@Service层。这些@Services我还可以用@Transactional注释,并命名transactionManager Spring需要用于该特定服务的名称。因此,例如,在“ServiceDummy”中,我可以添加@Transactional(“tmDummy”)并在另一个应用程序上仅自动连接@Service。这样,Spring就不会争论是否有2个、3个或更多的TransactionManager可供选择

简要示例:

package com.entre.databases.dummy.service

@Service
@Transactional("tmDummy")
class DummyService(
    val dummyRepository: DummyRepository)
{

    fun findDummy(id: Int): Optional<Dummy> {
        return dummyRepository.findById(id)
    }

}
package com.entre.databases.dummy.service
@服务
@事务(“tmDummy”)
类DummyService(
val Dummy存储库:Dummy存储库)
{
fun findDummy(id:Int):可选{
返回dummyRepository.findById(id)
}
}
以及导入“库”的另一个应用程序上的:

@springboot应用程序
@组件扫描(基本包=[
“com.entre.rest.boot”,
“com.entre.databases.dummy.service”,
“com.entre.rest.web”
])
班级申请
趣味主线(args:Array){
运行应用程序(*args)
}

谢谢你的回答,你让我看到了正确的方向

虽然我了解@Qualifier的用法,但它对于我的特定项目来说还不够,因为据我所知,注释必须位于导入的“library”项目上。我的问题实际上与事务有关,因为在导入持久性配置尚未标记为@Primary的特定包之后,我无法指定@Primary

这就是我解决问题的方法

除了在“library”项目上创建存储库之外,我还在那里创建了@Service层。这些@Services我还可以用@Transactional注释,并命名transactionManager Spring需要用于该特定服务的名称。因此,例如,在“ServiceDummy”中,我可以添加@Transactional(“tmDummy”)并在另一个应用程序上仅自动连接@Service。这样,Spring就不会争论是否有2个、3个或更多的TransactionManager可供选择

简要示例:

package com.entre.databases.dummy.service

@Service
@Transactional("tmDummy")
class DummyService(
    val dummyRepository: DummyRepository)
{

    fun findDummy(id: Int): Optional<Dummy> {
        return dummyRepository.findById(id)
    }

}
package com.entre.databases.dummy.service
@服务
@事务(“tmDummy”)
类DummyService(
val Dummy存储库:Dummy存储库)
{
fun findDummy(id:Int):可选{
返回dummyRepository.findById(id)
}
}
以及导入“库”的另一个应用程序上的:

@springboot应用程序
@组件扫描(基本包=[
“com.entre.rest.boot”,
“com.entre.databases.dummy.service”,
“com.entre.rest.web”
])
班级申请
趣味主线(args:Array){
运行应用程序(*args)
}

如果需要更好的控制,不要使用
@Primary
。当我想在开发和生产上更改数据源时,请考虑使用“我使用配置文件”。但我想不出有什么办法能帮到我。如果应用程序有多个数据源,仍然需要设置一个@Primary。或者尝试
@Qualifier
来精确确定您要使用哪一个?我不知道这一个,它看起来很有希望。我会再打给你的。如果你需要更好的控制,不要使用
@Primary
。当我想在开发和生产上更改数据源时,请考虑使用“我使用配置文件”。但我想不出有什么办法能帮到我。如果应用程序有多个数据源,仍然需要设置一个@Primary。或者尝试
@Qualifier
来精确确定您要使用哪一个?我不知道这一个,它看起来很有希望。我会再打给你的。
package com.entre.databases.dummy.service

@Service
@Transactional("tmDummy")
class DummyService(
    val dummyRepository: DummyRepository)
{

    fun findDummy(id: Int): Optional<Dummy> {
        return dummyRepository.findById(id)
    }

}
@SpringBootApplication
@ComponentScan(basePackages = [
    "com.entre.rest.boot",
    "com.entre.databases.dummy.service",
    "com.entre.rest.web"
])
class Application

fun main(args: Array<String>) {
    runApplication<Application>(*args)
}