夜光序言:
如果,你見到一個有着憂傷雙目的漂亮男孩,一定記得告訴他回家的路。
正文:
package com.Genius.second;
import com.google.inject.Inject;
import com.google.inject.Provider;
/*
*
* @title StringWritingApplet
* @describe 提供打印helloworld的功能
* @author hy
* @version
* @date 2019/6/18
*
*/
public class StringWritingApplet implements MyApplet{
private MyDestination destination;
private Provider<String> stringProvider;
@Inject
public StringWritingApplet(MyDestination destination,@Output Provider<String> stringProvider){
super();
this.destination = destination;
this.stringProvider = stringProvider;
}
public void writeString(){
destination.write(stringProvider.get());
}
@Override
public void run(){
writeString();
}
}
package com.Genius.second;
import com.google.inject.Inject;
import java.io.PrintStream;
public class PrintStreamWriter implements MyDestination {
private PrintStream destination;
@Inject
public PrintStreamWriter(PrintStream destination){
super();
this.destination = destination;
}
@Override
public void write(String string){
destination = System.out;
destination.println(string);
}
}
package com.Genius.second;
import com.google.inject.BindingAnnotation;
import javax.xml.ws.BindingType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/*
*
* @title Output
* @describe 提供註解~
* @author hy
* @version
* @date 2019/6/18
*
*/
@Retention(RetentionPolicy.RUNTIME)
@BindingAnnotation
public @interface Output {
}
package com.Genius.second;
/*
*
* @title MyDestination
* @describe 提供write方法~
* @author hy
* @version
* @date 2019/6/18
*
*/
public interface MyDestination {
void write(String string);
}
package com.Genius.second;
/*
*
* @title MyApplet
* @describe 提供run方法
*
* @author hy
* @version
* @date 2019/6/18
*
*/
public interface MyApplet extends Runnable {
}
package com.Genius.second;
import com.google.inject.AbstractModule;
/*
*
* @title MainModule
* @describe Guice用來配置的類~
* @author hy
* @version
* @date 2019/6/18
*
*/
public class MainModule extends AbstractModule {
@Override
protected void configure(){
install(new HelloWorldModule());
}
}
package com.Genius.second;
import com.google.inject.AbstractModule;
import java.io.PrintStream;
/*
*
* @title HelloWorldModule
* @describe HelloWorld模塊的依賴配置
* @author hy
* @version
* @date 2019/6/18
*
*/
public class HelloWorldModule extends AbstractModule {
@Override
protected void configure(){
bind(MyApplet.class).to(StringWritingApplet.class);
bind(MyDestination.class).to(FirstStreamWriter.class);
bind(PrintStream.class).toInstance(System.out);
bind(String.class).annotatedWith(Output.class).toInstance("hi~~夜光");
}
}
package com.Genius.second;
import com.google.inject.Inject;
import java.io.PrintStream;
public class FirstStreamWriter implements MyDestination {
private PrintStream destination;
@Inject
public FirstStreamWriter(PrintStream destination){
super();
this.destination = destination;
}
@Override
public void write(String string){
destination = System.out;
destination.println(string);
}
}
package com.Genius.second;
import com.google.inject.Guice;
public class App {
/**
* main方法的作用
* bootstrap:
* parse command line:解析命令行參數
* set up environment:配置環境參數
* kick off main logic:啓動程序邏輯
*
*/
public static void main(String[] args) {
MyApplet mainApplet = Guice.createInjector(new MainModule())
.getInstance(MyApplet.class);
mainApplet.run();
}
}