Guice,基于yaml config绑定不同的数据库提供程序

时间:2009-12-02 14:56:01

标签: hibernate guice

我有一个类似于这样的应用程序配置文件:

database:
  type: [db-type]
  username: [name]
  password: [pw]
  server: [ip]
  database: [db-name]

db-type可以是以下任何一种:{postgresql,mysql,mssql,file}。 我想配置绑定,这样(它是基于hibernate的)应用程序根据使用的值加载一个特殊的SessionFactory提供者,即PostgresqlSessionFactoryProvider。

问题是,Guice还负责将Config.class实例注入需要访问它的类中。现在我需要访问配置,同时设置绑定......这有点鸡蛋问题。

我如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

我找到了一种方法。这可能不是最好的方法,所以如果你知道的更好,我仍然会看到答案。

关键是,首先必须完全配置绑定器,因此它可以提供Config.class的实例。

所以我想出了一个自定义的SessionFactory.class提供程序,它需要一个配置 guice注入器本身,这样当所有信息都被guice啜饮时,它有办法提供基于配置的不同实现。

public class SessionFactoryProvider implements Provider<SessionFactory> {

    private Config config;
    private Injector injector;

    @Inject
    public SessionFactoryProvider(Config config, Injector injector) {
        this.config = config;
        this.injector = injector;
    }

    @Override
    public SessionFactory get() {
        switch (config.database.type) {
        case postgresql:
            return injector.getInstance(PostgresqlSessionFactoryProvider.class).get();
        case mysql:
            return injector.getInstance(MysqlSessionFactoryProvider.class).get();
        case file:
            return injector.getInstance(FileBasedSessionFactoryProvider.class).get();
            /* some more providers... */
        default:
            return injector.getInstance(FileBasedSessionFactoryProvider.class).get();
        }
    }
}
你怎么看?这是一个很好的方法吗?