xie233 / Note

some ex
0 stars 0 forks source link

Guice了解一下 #2

Open xie233 opened 5 years ago

xie233 commented 5 years ago

相比于spring的庞大,Guice是一个小巧的依赖注入框架,可以在自己的项目中使用。引入Maven依赖

<dependency>
    <groupId>com.google.inject</groupId>
    <artifactId>guice</artifactId>
    <version>4.0</version>
</dependency>
import javax.inject.Singleton;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;

interface IPrinter{
    void print();
}//接口

@Singleton
class HelloPrinter implements IPrinter{

    public void print() {
        System.out.println("Hello");
    }

}//实现类1
@Singleton
class SimplePrinter implements IPrinter{

    public void print() {
        System.out.println("Simple");
    }

}//实现类2

@Singleton
class CoolPrinter implements IPrinter{

    public void print() {
        System.out.println("Cool");
    }

}//实现类3

class ConfigModule extends AbstractModule{
    @Override
    protected void configure() {
        bind(IPrinter.class).to(CoolPrinter.class);
    }
}//绑定接口的实现类

@Singleton
public class Ex1 {

    @Inject
    private IPrinter printer;

    public void hello() {
        printer.print();
    }

    public static void main(String[] args) {
        Injector injector = Guice.createInjector(new ConfigModule());//初始化配置,绑定关系
        Ex1 sample = injector.getInstance(Ex1.class);
        sample.hello();
    }
}

//output: Cool
xie233 commented 5 years ago

上面只是制定了一个接口的实现类,要使用多个实现类的话不就乱了吗..

class ConfigModule extends AbstractModule{
    @Override
    protected void configure() {
        bind(IPrinter.class).annotatedWith(Names.named("cool")).to(CoolPrinter.class);
        bind(IPrinter.class).annotatedWith(Names.named("simple")).to(SimplePrinter.class);
    }
}//加入命名空间

@Singleton
public class Ex1 {

    @Inject
    @Named("simple")//想用哪个用哪个
    private IPrinter printer;

    public void hello() {
        printer.print();
    }

    public static void main(String[] args) {
        Injector injector = Guice.createInjector(new ConfigModule());
        Ex1 sample = injector.getInstance(Ex1.class);
        sample.hello();
    }

}

//output: Simple
xie233 commented 5 years ago

要是想要好好安排实现类可以使用Set,Map将其统一管理也是挺方便,引入Maven依赖

<dependency>
    <groupId>com.google.inject.extensions</groupId>
    <artifactId>guice-multibindings</artifactId>
    <version>4.0</version>
</dependency>