zoukankan      html  css  js  c++  java
  • Atitit.guice3 ioc 最佳实践 o9o

    Atitit.guice3 ioc  最佳实践 o9o

    1. Guice的优点and跟个spring的比较 1

    2. 两个部分:::绑定and注入@Inject 1

    3. 绑定所有的方法总结 2

    3.1. 绑定自身。代替new..binder.bind(BeanService1.class);绑定自身 2

    3.2. 1.1.1 链式绑定 2

    3.3. 使用多个同样的接口,不一样的实现,使用命名绑定Annotations命名绑定 2

    3.4. 3)绑定注释和实例基本类型Stringint这样的基本类型 3

    3.5. 实例绑定 3

    3.6. 默认绑定 4

    3.7. 单例绑定 4

    4. 别的anno 说明 4

    4.1. @ImplementedBy ,吧推荐,直接父类/接口指定实现类 4

    4.2. @ProvidedBy  复杂对象的生成... 4

    5. 跟spring的集成 5

    6. Guice的缺点 5

    7. 参考 5

    1. Guice的优点and跟个spring的比较

    快速100...

    不需要配置文件...简单... Spr使用注解也要配置文件配置sacn package...麻烦的..

    有编译器检查和重构支持 ,因为code实现

    2. 两个部分:::绑定and注入@Inject

    绑定Module

    Guice的核心就是com.google.inject.Module,它类似于Springbean工厂

     3.2 属性注入

    属性绑定的目的是告诉Guice,当创建该类型的对象时,哪些属性也需要进行依赖注入。用一个例子来看:
     

    其它方面,比如说Struts2ActionService层之间的注入等,直接用@Inject就得了,不要那么多set,get

     

     

    作者:: 老哇的爪子 Attilax 艾龙,  EMAIL:1466519819@qq.com

    转载请注明来源: http://blog.csdn.net/attilax

     

    3. 绑定所有的方法总结

    3.1. 绑定自身。代替new..binder.bind(BeanService1.class);绑定自身

    像BeanService1是个实现类而没有实现什么接口,它当然也可能被其他类注入,可以使用 默认绑定自身,尽管这样做没什么意义,对于注入的类参数,Guice识别出来后会直接创建。

    或者使用.binder.bind(BeanService1.class);

    3.2. 1.1.1 链式绑定

    链式绑定是最简单,最直接,也是使用最多的绑定方式。

     

     

    3.3. 使用多个同样的接口,不一样的实现,使用命名绑定Annotations命名绑定

    链式绑定就不好区分该用哪种实现了。可以把Annotations绑定方式看作是链式绑定的一种扩展,专门用来解决这种同一个接 口有多种实现的问题。Annotations绑定又可以分为两种,一种是需要自己写Annotations,另外一种则简化了一些。

     

    使用@Named的方式和上面自己写Annotation的方式很类似,只不过做了相应的简化,不再需要自己去写Annotation了。[java]view plaincopy

     

    public class RealBillingService implements BillingService {  

      

      @Inject  

      public RealBillingService(@Named("Checkout") CreditCardProcessor processor,  

     

     

    bind(CreditCardProcessor.class)  

        .annotatedWith(Names.named("Checkout"))  

        .to(CheckoutCreditCardProcessor.class);  

     

    3.4.  3)绑定注释和实例基本类型Stringint这样的基本类型

    。如果被注入的是如String、int这样的基本类型,需要做两件事情:一是对被注入的参数加上名称注释@Named,如下所示:

      @Inject

       public void setName(@Named("beanService1Name") String name) {

           this.name = name;

       }

    @Inject @Named("thql")

    public String testHql;

     

    bd.bindConstant().annotatedWith(Names.named("thql")).to(" from TUserUsers ");

    bind(String.class)

        .annotatedWith(Names.named("JDBC URL"))

        .toInstance("jdbc:mysql://localhost/pizza");

    3.5. 实例绑定 

    上面介绍的链式绑定是把接口的class对象绑定到实现类的class对象,而实例绑定则可以看作是链式绑定的一种特例,它直接把一个实例对象绑定到它的class对象上。

    ?

    1

    2

    3

    4

    5

    6

    bind(String.class)

        .annotatedWith(Names.named("JDBC URL"))

        .toInstance("jdbc:mysql://localhost/pizza");

    bind(Integer.class)

        .annotatedWith(Names.named("login timeout seconds"))

        .toInstance(10);

    3.6. 默认绑定

    Xx=new xx()

    3.7. 单例绑定

    bind(AnotherConcreteClass.class).in(Singleton.class);

    binder.bind(HelloWorld.class).to(HelloWorldImplAgain.class).in(Scopes.SINGLETON);

    事实上Guice提供两种Scope,com.google.inject.Scopes.SINGLETON和com.google.inject.Scopes.NO_SCOPE,所谓没有scope即是每次生成一个新的实例。

    或者...

    @Singleton
    2     public class HelloWorldImpl implements HelloWorld {

     

    3.8. 指定构造函数绑定 

    在configure方法中,将一种类型绑定到另外一种类型的过程中,指定目标类型用那种构造函数生成对象。 

    ?

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    public class BillingModule extends AbstractModule {

      @Override

      protected void configure() {

        try {

          bind(TransactionLog.class).toConstructor(

              DatabaseTransactionLog.class.getConstructor(DatabaseConnection.class));

        } catch (NoSuchMethodException e) {

          addError(e);

        }

      }

    }

    这种绑定方式主要用于不方便用注解@Inject修饰目标类型的构造函数的时候。比如说目标类型是第三方提供的类型,或者说目标类型中有多个构造函数,并且可能会在不同情况采用不同的构造函数。

     

    4. 别的anno 说明

    4.1. @ImplementedBy ,在父类型中进行绑定 

    4.2.  吧推荐,直接父类/接口指定实现类

    @ImplementedBy(Class)的注释方式。可以直接从你的接口指向一个缺省的实现,而省略掉对com.google.inject.Module的实现。其实这样就违背了多态的原则,一般使用较少,最后还是把控制权交给Module来处理。

    这个通常十做为默认实现类来实现兰,还是k有用的....走十好像只能应用到个接口上...

    4.3. @ProvidedBy  复杂对象的生成...

    如果方法中创建对象的过程很复杂,我们就会考虑,是不是可以把它独立出来,形成一个专门作用的类

    参考 DI框架 Google-Guice入门介绍 - OPEN 开发经验库.htm

    4.3.1.1. 在@Provides方法中进行绑定

    5. 跟spring的集成

    10 final BeanFactory beanFactory = new ClassPathXmlApplicationContext(   

    11                 new String[] { "applicationContext.xml", "daoContext.xml" });   

    12         binder.bind(BeanFactory.class).toInstance(beanFactory);  

    定义了Guice与Spring整合后,将spring工厂也由Guice托管

    13 binder.bind(HelloWorld.class).toProvider(   

    14                 fromSpring(HelloWorld.class, "helloWorld"));  

    6. Guice的缺点

    Guice当然也有缺点——太过于简单。不少JavaEE开发人员感觉似乎没有什么实际价值,更像是一种玩具。但我看好Guice的思想——简单而且类型安全。

     

    7. 参考

    Google-Guice入门介绍 - forlong401的专栏 博客频道 - CSDN.NET.htm

    Guice真的无法享受企业级组件吗-梧桐雨—168-ITPUB博客.htm

    google guice 绑定常量的另类用法----读取并注入配置信息 - Sky's blog - BlogJava.htm

    DI框架 Google-Guice入门介绍 - OPEN 开发经验库.htm

    我要啦免费统计
  • 相关阅读:
    iis管理器的程序应用池中没有Asp.NET v4.0
    Rowlock、UPDLOCK
    转SQLSERVER 会不会自动加锁
    安装IE11必备更新
    阻止表单提交刷新页面的问题
    C#分屏控件用法实例
    Flex内存泄露解决方法和内存释放优化原则
    DataSet.Clear() Method()
    短文件名漏洞修复
    vs2017创建dotnetcore web项目,并部署到centos7上
  • 原文地址:https://www.cnblogs.com/attilax/p/5963866.html
Copyright © 2011-2022 走看看