SPRINGBOOT - 自动解决要全局注入的依赖项

Mat*_*ttV 1 java spring spring-boot

我通常喜欢做(我在 JS/TS 中这样做)基于接口的注入,并“注册一个令牌”指向一个默认的实现。所以如果有一天我需要创建一个新的实现,我不需要改变整个代码,我只需要将该令牌更改为另一个实现。

我试图在春天做同样的事情。但是我仍在学习它的 IOC 和 DI,我找不到这样的东西。

所以我的问题是,当我注入接口时,在我的控制器中,我需要使用“ @Qualifier ”,或者在我的实现中指定哪个是“@Primary”,以便@Autowired可以注入正确的实现。@Qualifier()的策略很好,因为它允许我按名称指定它,但是如果有一天需要更改实现,我仍然需要在整个项目中进行更改。

但我想知道是否有某种方法可以全局定义指向单个实现的默认注入点的配置?

提前致谢。对不起,如果我的解释不清楚,请告诉我

控制器方法

@Autowired
private IOrdinaryService iOrdinaryService;

@GetMapping("/")
void getMethodHangler() {
    iCreateProjectService.execute(newEmployee);
}
Run Code Online (Sandbox Code Playgroud)

界面

package com.example.demo.modules.projects.services;
import com.example.demo.modules.projects.entities.Projects;

public interface IOrdinaryService{
    void execute();
}
Run Code Online (Sandbox Code Playgroud)

实施1

@Service
public class OldWayOrdinaryService implements IOrdinaryService {
    
    @Override
    public void execute() {
        System.out.println("foo");

    }
}
Run Code Online (Sandbox Code Playgroud)

实施2

@Service
public class NewWayOrdinaryService implements IOrdinaryService {
    
    @Override
    public void execute() {
        System.out.println("bar");

    }
}
Run Code Online (Sandbox Code Playgroud)

Ism*_*ail 5

您可以使用Spring框架的配置类来实现这一点:

@Configuration
public class InjectionConfiguration {

    @Bean
    public IOrdinaryService ordinaryService() {
        return new OldWayOrdinaryService();
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,您就不需要@Service在实现上使用注释,因此删除它,您将使用@Autowired 在控制器类中获得所需的实例。

当你想改变 a 的实现时IOrdinaryService,你只需改变上面的配置方法。