gpt4 book ai didi

java - 尽管@ConditionalOnProperty,@Autowired仍使用错误的实现

转载 作者:行者123 更新时间:2023-11-30 06:21:32 25 4
gpt4 key购买 nike

我按照网上找到的教程使用 @ConditionalOnProperty@Bean 来选择 @Autowired 的实现。

为了完整起见(尽管与问题无关),这样做的目的是选择一个“ICE 服务器列表”提供程序 - 可以在配置文件中本地配置,也可以使用 Twilio API 获取以下列表: WebRTC 的 STUN 和 TURN 服务器。

相关代码如下:

application.properties

ice.provider = twilio

Controller.java

@ComponentScan
@RestController
@EnableAutoConfiguration
@EnableWebSocket
public class Controller {

@Autowired
private IceProvider iceProvider;

@Bean
@ConditionalOnProperty(name = "ice.provider", havingValue = "local")
public IceProvider localIceProvider() {
logger.info("Creating ICE server provider - LOCAL");
return new LocalIceProvider();
}

@Bean
@ConditionalOnProperty(name = "ice.provider", havingValue = "twilio")
public IceProvider twilioIceProvider() {
logger.info("Creating ICE server provider - TWILIO");
return new TwilioIceProvider();
}
}

IceProvider.java

public interface IceProvider {
List<ICEServer> getIceServers(String username);
}

LocalIceProvider.java

@Component
public class LocalIceProvider implements IceProvider {

private final static Logger logger = Logger.getLogger(LocalIceProvider.class);

@PostConstruct
void init() {
logger.info("Reading local ICE Server list config file");

// ...
}

@Override
public List<ICEServer> getIceServers(String username) {
logger.info("Returning locally configured ICE servers");

// ...
}
}

TwilioIceProvider.java

@Component
public class TwilioIceProvider implements IceProvider {

private final static Logger logger = Logger.getLogger(TwilioIceProvider.class);

@Override
public List<ICEServer> getIceServers(String username) {
logger.info("Doing Twilio API call and returning result");

// ...
}
}

尽管 application.properties 设置为使用 twilio 提供程序,但应用程序正在使用local 提供程序。但是,调用 twilioIceProvider 工厂方法,而不是 localIceProvider 方法。

这是日志中的片段:

应用程序启动时

LocalIceProvider@PostConstruct方法和TwilioIceProvider的工厂方法都被调用,但不调用LocalIceProvider的工厂方法

...
[2017-12-31 21:11:53 INFO ] [localhost-startStop-1] [ice.LocalIceProvider] Reading local ICE Server list config file
...
[2017-12-31 21:11:55 INFO ] [main] [com.example.Controller] Creating ICE server provider - TWILIO
...

根据客户端发出的调用 iceProvider.getIceServers()

的请求
[2017-12-31 21:14:40 INFO ] [http-nio-9083-exec-5] [ice.LocalIceProvider] Returning locally configured ICE servers

既然只有 twilioIceProvider 工厂方法被调用localIceProvider 方法没有被调用,为什么是 LocalIceProvider > 是@Autowired

最佳答案

IceProvider 实现中删除 @Component 注释。您已经在 bean 定义方法上使用 @Bean 将它们声明为 bean。

关于java - 尽管@ConditionalOnProperty,@Autowired仍使用错误的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48046143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com