私はJavaプロジェクトを持っており、Guiceを実装する必要があります。Guiceデータベース工場
私はモジュラープロジェクトを持っているので、データベースを簡単に切り替えることができます。工場出荷時は次のようにMySQLの探し接続返す
public abstract class DBConnectionFactory {
// List of DAO types supported by the factory
public static final int MYSQL = 1;
public static final int ORACLE = 2;
public abstract FilterDAO getFilterDAO();
public abstract PhotoDAO getPhotoDAO();
public abstract SetDAO getSetDAO();
public static DBConnectionFactory getDBConnectionFactory(int whichFactory) {
switch (whichFactory) {
case MYSQL:
return new MySQLFactory();
case ORACLE:
return new OracleFactory();
default:
return null;
}
}
}
::私はこのようになります工場のDBConnection持っていることを行うには私のServletControllerで
public class MySQLFactory extends DBConnectionFactory {
public static final String DRIVER= "com.mysql.jdbc.Driver";
public static final String DBURL= "jdbcurl";
private static final String PASSWORD = "password";
private static final String USERNAME = "username";
// method to create MySQL connection
public static Connection createConnection() {
try {
// This will load the MySQL driver, each DB has its own driver
Class.forName(DRIVER);
Connection connect = DriverManager.getConnection(DBURL, USERNAME, PASSWORD);
return connect;
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
public FilterDAO getFilterDAO() { return new MySQLFilterDAO(); }
public PhotoDAO getPhotoDAO() {
return new MySQLPhotoDAO();
}
public SetDAO getSetDAO() {
return new MySQLSetDAO();
}
}
を私は接続を確立するには、このコードを持っています:
// Create a DAO
private DBConnectionFactory MySQLFactory = DBConnectionFactory.getDBConnectionFactory(DBConnectionFactory.MYSQL);
@Override
public void init(){
photoDAO = MySQLFactory.getPhotoDAO();
}
私は工場を取り除き、Guiceを使用しようとしていますが、どこから始めるべきかわかりません。前もって感謝します!
基本的な前提は、あなたはもう、これらすべての工場を必要としないということです。 '(PhotoDAOInterface.class).to(PhotoDAOImpl.class)'をバインドし、他のクラスのコンストラクタに '@Inject'することができます。それぞれの 'PhotoDAOImpl'はコンストラクタに注入された設定値を持つことができ、クラスを別々に簡単にテストすることができます。ファクトリーは簡単にテストされません。したがって、基本的な例を提供するには: '@Inject public ServletController(PhotoDAO photoDAO){this.photoDAO = photoDAO; } 'テストのために、'(PhotoDAOInterface.class).to(PhotoDAOTestingImpl.class) 'をバインドすることができ、何も変わりません! – AmazingDreams
ありがとう!しかし、今私はどのデータベースを使用するかを定義するのですか? (MySQLまたはOracle?) – Robert
'MySQLConnection'と' OracleConnection'の両方が同じインターフェースを使用すると仮定します。 guiceを使って 'FlagDAO'のコンストラクタへの別の種類の接続を' @Inject 'します。より理解しやすい説明のために私の答えを見てください。 – AmazingDreams