如何让Guice调用方法并为我注入参数?

时间:2014-05-30 18:01:15

标签: java json guice

所以我正在解决以下问题,作为课程作业的一部分:

我的程序接收不同格式的推文,并将其保存为各种查询。主类称为TwitterKnowledgeCenter,它处理大多数应用程序逻辑。

截至目前,它可以接收两种格式的推文:

  1. 每条推文的一些行格式:15/05/2013 13:08:08, 334611146092994560
  2. JSON格式(我认为是官方来自twitter):{"created_at":"Wed May 15 10:08:07 +0000 2013","id":3346111419..}
  3. 我希望TwitterKnowledgeCenter使用以下调用导入推文:

    String[] lines = ...
    TwitterKnowledgeCenter tw = new TwitterKnowledgeCenter(...);
    tw.import(lines, lineparser)
    

    其中lines表示格式为#1的推文,而lineparser是实现TweetParser接口的类的实例,该接口可以解析从格式#1到Tweet对象的推文TwitterKnowledgeCenter成立。

    我希望TwitterKnowledgeCenter的用户能够自由地交换推文格式。这意味着他应该可以互换地使用tw.import(lines, lineparser)tw.import(jsonTweets, jsonparser)

    如何使用Guice实现这一目标? 我认为代码应该首先看起来像这样:

    String[] lines = ....
    String[] jsonTweets = ..
    TwitterKnowledgeCenter tw = new TwitterKnowledgeCenter(...);
    bind(TweetParser.class).to(JsonParser.class);
    <what to write here that'll call tw.import()>
    

    似乎Guice必须根据绑定来处理调用方法import()。如何实现或不可能实现?

    是否有不同的方法来构建这个有意义且有效的方法?

1 个答案:

答案 0 :(得分:0)

好的,这是你必须要做的事情。

1.创建两个不同的 guice模块,其中包含每个推文格式的绑定,即line和Json

<强> LineTweetModule.java

public class LineTweetModule extends AbstractModule {
  @Override 
  protected void configure() {

     bind(TweetParser.class).to(LineParser.class);   
  }
}

<强> JsonTweetModule.java

public class JsonTweetModule extends AbstractModule {
  @Override 
  protected void configure() {

     bind(TweetParser.class).to(JsonParser.class);   
  }
}

2.假设班级 TwitterKnowledgeCenter 有一个构造函数,它将TweetParser作为参数。你需要注释那个 带有 @inject 的构造函数,以便明确地被Guice调用

<强> TwitterKnowledgeCenter.java

  @inject
    public TwitterKnowledgeCenter(TweetParser parser) {

    }

3.现在您的客户端代码中,您需要为各自的推文格式创建一个注入器

// To import line format tweets
Injector injector = Guice.createInjector(new LineTweetModule());

TwitterKnowledgeCenter tw = injector.getInstance(TwitterKnowledgeCenter.class);

String[] lines = {},
tw.import(line);

// To import Json format tweets
Injector injector = Guice.createInjector(new JsonTweetModule());

TwitterKnowledgeCenter tw = injector.getInstance(TwitterKnowledgeCenter.class);

String[] lines = {},
tw.import(line);

希望这有帮助。