3

在我目前正在进行的一个项目中,我们需要多个配置文件,即“默认”和“云”。
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 为空。你能帮忙吗?

4

2 回答 2

2

@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()));
        }
    }
于 2015-12-15T16:44:50.890 回答
0

我宁愿自动装配数据源和服务类而不是配置类。通过这种方式,您不需要任何配置实例并直接自动装配您想要的任何类。

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

@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);
    }
}
于 2015-12-17T22:41:09.843 回答