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

问题描述 投票:1回答:1

我按照我在网上找到的教程使用@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方法。

这是日志的片段:

在申请开始

@PostConstructLocalIceProvider方法和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

java spring-boot dependency-injection
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.