Java Spring-在运行时解析依赖项
我用Java Spring-在运行时解析依赖项,java,spring,dependency-injection,spring-data,Java,Spring,Dependency Injection,Spring Data,我用Spring数据编写Spring应用程序。我有两个实体:客户和商户。我还有两个相应的存储库和服务:CustomerRepository、MerchantRepository、CustomerService和MerchantService。CustomerService和MerchantService中的逻辑非常相似,但与不同的存储库相关(相应地CustomerRepository和MerchantRepository)。所以它看起来或多或少像这样: class Customer {
Spring数据编写Spring
应用程序。我有两个实体:客户
和商户
。我还有两个相应的存储库和服务:CustomerRepository
、MerchantRepository
、CustomerService
和MerchantService
。CustomerService
和MerchantService
中的逻辑非常相似,但与不同的存储库相关(相应地CustomerRepository
和MerchantRepository
)。所以它看起来或多或少像这样:
class Customer {
// ...
}
class Merchant {
// ...
}
interface CustomerRepository extends CrudRepository<Customer, Long> {
// ...
}
interface MerchantRepository extends CrudRepository<Merchant, Long> {
}
class CustomerService {
private CommonHelper helper;
void method() {
helper.commonMethod();
// ...
}
}
class MerchantService {
private CommonHelper helper;
void method() {
helper.commonMethod();
// ...
}
}
class CommonHelper {
private CrudRepository repository;
public CommonHelper(CrudRepository repository) {
this.repository = repository;
}
public void commonMethod() {
repository.findAll();
// ...
}
}
class客户{
// ...
}
阶级商人{
// ...
}
接口CustomerRepository扩展了Crudepository{
// ...
}
接口商品存储扩展了CRUDREPOSITION{
}
类客户服务{
私人助理;
void方法(){
helper.commonMethod();
// ...
}
}
类别商品服务{
私人助理;
void方法(){
helper.commonMethod();
// ...
}
}
类CommonHelper{
私有积存库;
公共CommonHelper(CRUDepository存储库){
this.repository=存储库;
}
公共方法(){
repository.findAll();
// ...
}
}
我想创建第三个类,我们称之为CommonHelper
,以避免代码重复,并将公共逻辑放在那里(操作相同,但使用不同的存储库)。但是,我需要两个具有两个不同存储库的独立实例。当然,我可以使用new
来实例化它,但是还有更多的Spring
方法来实现相同的目标吗?您可以为CommonHelper
提取一个抽象类,并定义两个bean来实现它:一个用于商户关注点,另一个用于客户关注点。
接口可以是通用的,以便能够根据实现调整API类型
例如:
public abstract class BaseService<T, K> {
private CrudRepository<T, K> repository;
public BaseService(CrudRepository<T, K> repository){
this.repository = repository;
}
T commonMethod(K key){
T object = repository.findById(key);
// other processing...
}
}
公共抽象类BaseService{
私有积存库;
公共基础服务(CrudRepository存储库){
this.repository=存储库;
}
T通用方法(K键){
T object=repository.findById(key);
//其他处理。。。
}
}
和实施:
@Service
@Qualifier("customerBaseService")
public class CustomerBaseService extends BaseService<Customer, Long> {
public CustomerBaseService (CustomerRepository repository){
super(repository);
}
}
@Service
@Qualifier("merchantBaseService")
public class MerchantBaseService extends BaseService<Merchant, Long> {
public MerchantBaseService (MerchantRepository repository){
super(repository);
}
}
@服务
@限定符(“customerBaseService”)
公共类CustomerBaseService扩展了BaseService{
公共CustomerBaseService(CustomerRepository存储库){
超级(储存库);
}
}
@服务
@限定词(“merchantBaseService”)
公共类MerchantBaseService扩展了BaseService{
公共商品数据库服务(商品存储库){
超级(储存库);
}
}
然后,通过指定与匹配的限定符,将合适的代码注入CustomerService或MerchantService。但是,我需要两个独立的实现来编写两个独立的实现,从而复制代码。