maven源码阅读之一(Guice介绍)

maven源码阅读之一(Guice介绍)本文介绍了 Google 的轻量级 IOC 框架 Guice 以及它在 Maven 中的应用

大家好,欢迎来到IT知识分享网。

 guice文档 

guice是google开发的一个轻量级的IOC框架,maven则使用的是guice来进行其内部的IOC操作。而guice本身是比较简单的。下面的代码展示了guice的主要功能,也展示了它主要的角色。guice内部可以看作是一个<Key,Provider>的map。通过各种module将<Key,Provider>注册到guice中,guice则将这些<Key,Provider>的binding构建一个injector给用户,而用户则通过injector利用key来获取对那个的provider来获得对象。

public class Test { interface A{ void say() ; } static class B implements A{ @Override public void say() { System.out.println("hahaha"); } } static class TestModule extends AbstractModule{ @Override protected void configure() { bind(Key.get(A.class)).toProvider(() -> new B()).in(Singleton.class); } } public static void main(String[] args){ Injector injector = Guice.createInjector(new TestModule()) ; A a = injector.getInstance(A.class) ; a.say(); } }

绑定方式

Guice提供了多种的对象的绑定的方式:

  • ConstructorBinding:这种方式是直接注册一个实例对象的构造器,通过这个构造器进行对象实例化
  • LinkedBinding: 这种方式是将key绑定到另一个key上
  • ProviderInstanceBinding:绑定Provider实例
  • InstanceBinding:直接绑定实现对象
  • ProviderKeyBinding:绑定Provider的key,从injector中找prvider对象
  • UntargettedBinding:只绑定一个key,通过@ImplementedBy等注解获取对应的实现类

下面展示了不同方式绑定的实例。

public class TestBinding { private static class A{} private static class B{} private static class C{C(){new RuntimeException().printStackTrace();}} private static class D{} private static class E{} @ImplementedBy(F.class) private interface IF{} private static class F implements IF{} private static class P implements Provider<E> { @Override public E get() { System.out.println("create e") ; return new E(); } } public static void main(String[] args){ Injector injector = Guice.createInjector(new AbstractModule() { @Override protected void configure() { Constructor constructor = A.class.getDeclaredConstructors()[0] ; bind(A.class).annotatedWith(Names.named("a")).toConstructor(constructor) ; //ConstructorBinding bind(B.class).annotatedWith(Names.named("b")).to(B.class); //LinkedBinding bind(C.class).annotatedWith(Names.named("c")).toProvider(()->new C()) ; //ProviderInstanceBinding bind(D.class).annotatedWith(Names.named("d")).toInstance(new D());//InstanceBinding bind(E.class).annotatedWith(Names.named("e")).toProvider(Key.get(P.class));//ProviderKeyBinding bind(IF.class) ; //UntargettedBinding } }) ; System.out.println(injector.getInstance(Key.get(A.class,Names.named("a")))); System.out.println(injector.getInstance(Key.get(B.class,Names.named("b")))); System.out.println(injector.getInstance(Key.get(C.class,Names.named("c")))); System.out.println(injector.getInstance(Key.get(D.class,Names.named("d")))); System.out.println(injector.getInstance(Key.get(E.class,Names.named("e")))); System.out.println(injector.getInstance(IF.class)); } }

参数配置

guice主要是提供了4种参数,这4种参数的配置直接是通过binder()中的方法来进行绑定的。

  • requireAtInjectOnConstructors:

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/147558.html

(0)
上一篇 2025-04-06 18:10
下一篇 2025-04-06 18:20

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信