Atitit.guice3 ioc 最佳实践 o9o
1. Guice的长处and跟个spring的比較 1
2. 两个部分:::绑定and注入@Inject 1
3.1. 绑定自身。取代new..binder.bind(BeanService1.class);绑定自身 2
3.3. 使用多个相同的接口,不一样的实现,使用命名绑定Annotations命名绑定 2
3.4. 3)绑定凝视和实例基本类型String、int这种基本类型 3
4.1. @ImplementedBy ,吧推荐。直接父类/接口指定实现类 4
4.2. @ProvidedBy 复杂对象的生成... 4
1. Guice的长处and跟个spring的比較
高速100倍...
不须要配置文件...简单... Spr使用注解也要配置文件配置sacn package...麻烦的..
有编译器检查和重构支持 ,由于code实现
2. 两个部分:::绑定and注入@Inject绑定Module
Guice的核心就是com.google.inject.Module,它类似于Spring的bean工厂
3.2 属性注入
1 属性绑定的目的是告诉Guice。当创建该类型的对象时。哪些属性也须要进行依赖注入。用一个样例来看:
2 其他方面,比方说Struts2的Action或Service层之间的注入等。直接用@Inject就得了。不要那么多set,get,
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]
3 public class RealBillingService implements BillingService {
4
5 @Inject
6 public RealBillingService(@Named("Checkout") CreditCardProcessor processor,
7 bind(CreditCardProcessor.class)
8 .annotatedWith(Names.named("Checkout"))
9 .to(CheckoutCreditCardProcessor.class);
3.4. 3)绑定凝视和实例基本类型String、int这种基本类型
。假设被注入的是如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的思想——简单并且类型安全。