使用Provider來例項化/注入第三方物件
能有一個用Guice來例項化/注入一個DataSource,或者第三方物件的例子麼?
比如在Spring的環境下可以如下配置:
class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
...
2
sa
...
Dhanji R.Prasanna————
雖然他能工作,但意味著:
1,BDS現在是一個singleton的了
2,BDS是迫切的初始化(eagerly instantiated)
3,你將模組的繫結和工廠程式碼混淆在一起了
4,你將url,username等應該放在一個非java檔案的東西用於例項化了。
比如在Spring的環境下可以如下配置:
...
...
Dhanji R.Prasanna————
你可以建立一個Provider來滿足這個需求並且配置其中的值:
public class BDSProvider implements Provider {
@Inject @Named("ds.initial_size") int initialSize;
@Inject @Named("ds.username") String username;
//..
public BasicDataSource get() {
BasicDataSource source = new BasicDataSource();
source.setInitialSize(initialSize);
source.setUsername(username);
//...etc.
return source;
}
}
然後把該provider繫結:
bind(BasicDataSource.class).toProvider(BDSProvider.class);
你可以建立一個Provider
public class BDSProvider implements Provider
@Inject @Named("ds.initial_size") int initialSize;
@Inject @Named("ds.username") String username;
//..
public BasicDataSource get() {
BasicDataSource source = new BasicDataSource();
source.setInitialSize(initialSize);
source.setUsername(username);
//...etc.
return source;
}
}
然後把該provider繫結:
bind(BasicDataSource.class).toProvider(BDSProvider.class);
接著可以從某個配置檔案(properties)中配置
bindProperties()....
bindProperties()....
jfz————
下面是一個能工作的程式碼,他有什麼設計問題?
protected void configure() {
...
final BasicDataSource bds = new BasicDataSource();
bds.setUrl("url");bds.setUsername("uName");...
bind(BasicDataSource.class).toInstance(bds);
...
}
下面是一個能工作的程式碼,他有什麼設計問題?
protected void configure() {
...
final BasicDataSource bds = new BasicDataSource();
bds.setUrl("url");bds.setUsername("uName");...
bind(BasicDataSource.class).toInstance(bds);
...
}
Dhanji R.Prasanna————
雖然他能工作,但意味著:
1,BDS現在是一個singleton的了
2,BDS是迫切的初始化(eagerly instantiated)
3,你將模組的繫結和工廠程式碼混淆在一起了
4,你將url,username等應該放在一個非java檔案的東西用於例項化了。
討論到這裡,並沒有給一個全面的使用Provider的示例,
下面給出一個我使用Provider的測試:
首先模擬一個DataSource:
package com.easyjf.guicUse.third;
public class MockDataBase {
private String userName;
private String userName;
private String password;
private int initialNum;
public int getInitialNum() {
return initialNum;
}
return initialNum;
}
public void setInitialNum(int initialNum) {
this.initialNum = initialNum;
}
this.initialNum = initialNum;
}
public String getPassword() {
return password;
}
return password;
}
public void setPassword(String password) {
this.password = password;
}
this.password = password;
}
public String getUserName() {
return userName;
}
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String connect(){
return this.initialNum+this.userName+this.password;
}
this.userName = userName;
}
public String connect(){
return this.initialNum+this.userName+this.password;
}
}
然後建立一個Porvider來代理
package com.easyjf.guicUse.third;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.name.Named;
import com.google.inject.Provider;
import com.google.inject.name.Named;
public class BDSProvider implements Provider{
@Inject
@Named("ds.initial_size")
int initialSize;
@Inject
@Named("ds.initial_size")
int initialSize;
@Inject
@Named("ds.userName")
String userName;
@Named("ds.userName")
String userName;
@Inject
@Named("ds.password")
String password;
@Named("ds.password")
String password;
public MockDataBase get(){
MockDataBase source=new MockDataBase();
source.setInitialNum(this.initialSize);
source.setUserName(userName);
source.setPassword(password);
MockDataBase source=new MockDataBase();
source.setInitialNum(this.initialSize);
source.setUserName(userName);
source.setPassword(password);
return source;
}
}
}
接著建立一個mockDao來使用該DataSource:
package com.easyjf.guicUse.third;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Provider;
public class MockDao {
private MockDataBase dataSource;
@Inject
public MockDao(Provider provider){
dataSource = provider.get();
}
public String go(){
return dataSource.connect();
}
private MockDataBase dataSource;
@Inject
public MockDao(Provider
dataSource = provider.get();
}
public String go(){
return dataSource.connect();
}
}
然後是一個Module來繫結該Provider:
package com.easyjf.guicUse.third;
import java.io.File;
import java.io.FileInputStream;
import java.util.Properties;
import java.io.FileInputStream;
import java.util.Properties;
import com.google.inject.AbstractModule;
import com.google.inject.name.NamedImpl;
import com.google.inject.name.NamedImpl;
public class MyModule extends AbstractModule {
private int num;
private String userName;
private String password;
public MyModule() throws Exception{
Properties properties=new Properties();
File file=new File("config.properties");
properties.load(new FileInputStream(file));
this.num=Integer.parseInt(properties.getProperty("ds.initial_size"));
this.userName=properties.getProperty("ds.userName");
this.password=properties.getProperty("ds.password");
}
@Override
protected void configure() {
// TODO Auto-generated method stub
bind(MockDataBase.class).toProvider(BDSProvider.class);
this.bind(int.class).annotatedWith(Names.named("ds.initial_size")).toInstance(num);
this.bind(String.class).annotatedWith(Names.named("ds.userName")).toInstance(userName);
this.bind(String.class).annotatedWith(Names.named("ds.password")).toInstance(password);
}
private String userName;
private String password;
public MyModule() throws Exception{
Properties properties=new Properties();
File file=new File("config.properties");
properties.load(new FileInputStream(file));
this.num=Integer.parseInt(properties.getProperty("ds.initial_size"));
this.userName=properties.getProperty("ds.userName");
this.password=properties.getProperty("ds.password");
}
@Override
protected void configure() {
// TODO Auto-generated method stub
bind(MockDataBase.class).toProvider(BDSProvider.class);
this.bind(int.class).annotatedWith(Names.named("ds.initial_size")).toInstance(num);
this.bind(String.class).annotatedWith(Names.named("ds.userName")).toInstance(userName);
this.bind(String.class).annotatedWith(Names.named("ds.password")).toInstance(password);
}
}
這裡把引數放在了一個config.properties檔案裡面
下面是測試:
package com.easyjf.guicUse.third;
import junit.framework.TestCase;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Injector;
public class DaoTest extends TestCase {
public void testGo() throws Exception{
Injector injector=Guice.createInjector(new MyModule());
MockDao dao=new MockDao(injector.getProvider(MockDataBase.class));
assertEquals("1stefpassword",dao.go());
}
}
OK,第一個關於Guice的文章完成~
Injector injector=Guice.createInjector(new MyModule());
MockDao dao=new MockDao(injector.getProvider(MockDataBase.class));
assertEquals("1stefpassword",dao.go());
}
}
OK,第一個關於Guice的文章完成~
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13270562/viewspace-211685/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- php例項化物件的例項方法PHP物件
- js 物件反射使用程式碼例項JS物件反射
- ThinkPHP6 例項化 Http 類和依賴注入PHPHTTP依賴注入
- ejb主物件,物件,例項 ?物件
- 引用物件與例項物件物件
- 例項和物件物件
- Java經典例項:使用ChoiceFormat來格式化複數JavaORM
- Java經典例項:使用DateFormatter來格式化日期時間JavaORM
- javascript 依賴注入程式碼例項JavaScript依賴注入
- Java獲取Class物件的方式和例項化物件的方式Java物件
- Angular 使用 Injector API 人工獲取依賴注入的例項AngularAPI依賴注入
- QQ第三方登入例項demo(QQSDK包優化)優化
- jquery將物件序列化為字串程式碼例項jQuery物件字串
- js建立字典物件例項JS物件
- Spring原始碼分析(二)bean的例項化和IOC依賴注入Spring原始碼Bean依賴注入
- sql 注入越過登入驗證例項SQL
- PHP程式碼審計03之例項化任意物件漏洞PHP物件
- 例項物件和函式物件的區別物件函式
- 原生js使用物件導向的方法開發選項卡例項教程JS物件
- 來說說 Java 中的例項初始化器Java
- 來說說Java中的例項初始化器Java
- provider的使用以及優化心得IDE優化
- C#例項化物件的三種方式及效能對比C#物件
- 4、Spring IOC容器 Bean物件例項化的3種方式SpringBean物件
- 類載入、物件例項化知識點一網打盡物件
- 物件的例項化、記憶體佈局以及訪問定位物件記憶體
- jQuery將表單序列化為物件的程式碼例項jQuery物件
- 理清原型物件、 例項物件、建構函式原型物件函式
- JS函式,物件,例項方法,物件方法理解JS函式物件
- Laravel kernel例項化Laravel
- SQL優化例項SQL優化
- MySQL 優化例項MySql優化
- javascript如何建立一個物件例項JavaScript物件
- pinctrl使用例項
- 波哥學JAVA,定義類 宣告屬性 建立物件 例項化物件 物件呼叫屬性或者方法Java物件
- 關於涉及較大資料量時的物件例項化問題大資料物件
- 例項演示如何使用CCE XGPU虛擬化GPU
- AS3 快速入門篇------使用ActionScript 建立物件例項小結S3物件