我按照我在网上找到的教程使用@ConditionalOnProperty
和@Bean
来选择@Autowired
的实现。
为了完整性(虽然它与问题无关),其目的是选择“ICE服务器列表”提供程序 - 在配置文件中本地配置或使用Twilio API获取STUN和TURN列表WebRTC的服务器。
这是相关代码:
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
方法。
这是日志的片段:
@PostConstruct
的LocalIceProvider
方法和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
?
从@Component
实现中删除IceProvider
注释。您已经在bean定义方法上使用@Bean
将它们声明为bean。