【问题标题】:Spring cloud default profileSpring Cloud 默认配置文件
【发布时间】:2016-03-21 11:57:27
【问题描述】:

在我目前正在进行的一个项目中,我们需要多个配置文件,即“默认”和“云”。
DefaultContext 和 CloudContext 都包含相同的 bean 定义 我们正在使用 PCF(Pivotal Cloud Foundry)

我们已经创建了一个界面

public interface Config {
    public DataSource getDataSource();
    public SomeService getService();
}

然后用这个接口实现每个配置文件

@Primary
@Configuration
@Profile("default")
public class DevConfig implements Config
{
    public DataSource getDataSource() {
         // create and return production datasource
    }

    public SomeService getService() {
        // Create and return production service
    }
}

然后对云做同样的事情。

@Configuratio
@Profile("cloud")
public class CloudConfig extends AbstractCloudConfig implements Config
{
    public DataSource getDataSource() {
         // create and return dummy datasource
    }

    public SomeService getService() {
        // Create and return dummy service
    }
}

我们在服务调用中自动装配,在处理器文件中。

@Service("processor")
public class Processor {

    @Autowired Config dsConfig;

    public object get(int Number)
    {
        return dao.get(Number,dsConfig.getDataSource());
    }
}

如果我们在 PCF 中部署,它工作正常,因为配置文件是云。如果我们在本地运行,它应该获得默认配置文件,但 dsConfig 为空。 你能帮忙吗?

【问题讨论】:

  • 你不应该注入Config。将@Bean 放在每个方法上。然后,您应该注入单个 bean。

标签: java spring spring-cloud spring-cloud-connectors cloud-foundry


【解决方案1】:

@Configuration 类不能用于自动装配。

正如@spencergibb 在评论中指出的那样,您需要告诉容器使这些类可用于自动装配。

为此用@Component注释它们。

类似这样的:

@Component
@Profile("default")
public class DevConfig implements Config
{
    public DataSource getDataSource() {
         // create and return production datasource
    }

    public SomeService getService() {
        // Create and return production service
    }
}

如果还是不行,请检查以下两点:

  • 您是否将配置(DevConfigCloudconfig)放在不同的包中,因此 ContextScan 找不到?
  • 您是否在本地运行另一个配置文件? (比如Dev)。

你可以把这个片段放到你的代码中(它来自 JHipster)来记录活动的配置文件。

    @Autowired
    private Environment env;

    /**
     * Initializes Application.
     * <p/>
     * Spring profiles can be configured with a program arguments --spring.profiles.active=your-active-profile
     * <p/>
     */
    @PostConstruct
    public void initApplication() throws IOException {
        if (env.getActiveProfiles().length == 0) {
            log.warn("No Spring profile configured, running with default configuration");
        }
        else {
            log.info("Running with Spring profile(s) : {}", Arrays.toString(env.getActiveProfiles()));
        }
    }

【讨论】:

  • 谢谢。我检查了你提到的几点。 1. DevConfig 和 CloudConfig 在同一个包中。 2. 我在本地的默认配置文件中运行。当我用代码检查日志时。我收到以下消息“未配置 Spring 配置文件,使用默认配置运行”。但 dsConfig 为空
【解决方案2】:

我宁愿自动装配数据源和服务类而不是配置类。 这样你就不需要任何配置实例,直接自动装配你想要的任何类。

所以类将如下所示。 默认配置:

@Primary
@Configuration
@Profile("default")
public class DevConfig implements Config
{
    @Bean
    public DataSource getDataSource() {
     // create and return production datasource
    }

    @Bean
    public SomeService getService() {
        // Create and return production service
    }
}

云配置:

@Configuration
@Profile("cloud")
public class CloudConfig extends AbstractCloudConfig implements Config
{
    @Bean
    public DataSource getDataSource() {
         // create and return dummy datasource
    }

    @Bean
    public SomeService getService() {
        // Create and return dummy service
    }
}

处理器类:

@Service("processor")
public class Processor {

    @Autowired
    private DataSource dataSource;

    public object get(int Number)
    {
        return dao.get(Number,datasource);
    }
}

【讨论】:

    猜你喜欢
    • 2023-02-15
    • 1970-01-01
    • 2012-04-19
    • 2021-04-18
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    相关资源
    最近更新 更多