guice的能力简述

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

guice的能⼒简述
guice这个google出的bean容器框架,ES有⽤到他。

1. 是⼀个bean容器
2. 能AOP
1. 以module创建injector。

可以看成是⼀个容器。

Module需要⾃定义且继承⾃他的AbstractModule。

覆写config⽅法完成装配关系的确
定。

详细参见
2. 绑定顶层接⼝到具体实现类。

bind(TransactionLog.class).to(DatabaseTransactionLog.class); ⽀持bind(A).to(B) 然后链式的
bind(B).to(C)
3. ⽀持在构造函数上打上Inject注解标签,⽤于注⼊字段
4. ⽀持⾃定义注解⽤于标志装配⽬标,⽐如⾃定义注解Paypal。

对于加了PayPal注解的参数,注⼊PaypalCreditCardProcessor实现,
其余的注⼊GoogleCheckoutProcessor实现。

bind(CreditCardProcessor.class).annotatedWith(PayPal.class).to(PaypalCreditCardProcessor.class);
5. 对于加了Named注解其值为testnamed的地⽅注⼊TestNamedCreditCardProcessor实现。

bind(CreditCardProcessor.class).annotatedWith(d("testnamed")).to(TestNamedCreditCardProcessor.class);
6. 结合Named注解可以将⼀个参数绑定⼀个特定的instance ⽽不是⼀个实现类。

bind(Integer.class).annotatedWith(d("chargeTimeout")).toInstance(200);
7. 可以使⽤Provides注解主动对外提供创建的bean 有点类似 Spring的@Bean注解,这种⽅式可以对bean做⾃定义加⼯。

相当于反转了
bind的那个动作同时也可以结合⾃定义注解使⽤⽐如上⾯的@Paypal 效果相同。

但是这种⽅式创建的bean不能参与AOP 因为instance是⽤户创建的嘛,所以任何额外逻辑编编织不进去了。

那怎么解决这个问题,guice在bind后提供了toConstructor⽅法去指定实现类。

这样就连Inject注解都不需要了。

因为这个实现类可能是三⽅提供的。

8. ⽤⾃定义注解的⽅式结合bindInterceptor⽅式完成本质上是个拦截器 AOP这些接⼝遵循AOP联盟约定。

有点类似jfinal的理念。

部分⽰例代码
全部的参见
测试主类
package com.code260.ss.guice.demo.bill;
import com.google.inject.Guice;
import com.google.inject.Injector;
public class TestMain {
public static void main(String[] args) {
/**
* 1. 以module创建injector
*/
Injector injector = Guice.createInjector(new BillingModule());
RealBillingService billingService = injector.getInstance(RealBillingService.class);
billingService.chargeOrder(null,null);
TestCustomAnnotationBillingService testCustomAnnotationBillingService = injector.getInstance(TestCustomAnnotationBillingService.class);
testCustomAnnotationBillingService.chargeOrder(null,null);
TestNamedBillingService testNamedBillingService = injector.getInstance(TestNamedBillingService.class);
testNamedBillingService.chargeOrder(null,null);
}
}
package com.code260.ss.guice.demo.bill;
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
import com.google.inject.matcher.Matcher;
import com.google.inject.matcher.Matchers;
import s;
public class BillingModule extends AbstractModule {
@Override
protected void configure() {
/**
* 2. 绑定接⼝到实现类
*/
/**
* LinkedBindings
* ⽀持 bind(A).to(B) 然后链式的 bind(B).to(C)
* to完之后还⽀持in in后⾯接的是Scope 有Singleton
*/
bind(TransactionLog.class).to(DatabaseTransactionLog.class);
bind(CreditCardProcessor.class).to(GoogleCheckoutProcessor.class);
/**
* 6. 结合Named注解可以将⼀个参数绑定⼀个特定的instance ⽽不是⼀个实现类
*/
bind(Integer.class).annotatedWith(d("chargeTimeout")).toInstance(200);
/**
* 4. 对于加了PayPal注解的参数,注⼊PaypalCreditCardProcessor实现,其余的注⼊GoogleCheckoutProcessor实现
*/
bind(CreditCardProcessor.class).annotatedWith(PayPal.class).to(PaypalCreditCardProcessor.class);
/**
* 5. 对于加了Named注解其值为testnamed的地⽅注⼊TestNamedCreditCardProcessor实现
*/
bind(CreditCardProcessor.class).annotatedWith(d("testnamed")).to(TestNamedCreditCardProcessor.class); /**
* 8. ⽤⾃定义注解的⽅式结合bindInterceptor⽅式完成本质上是个拦截器有点类似jfinal的理念
*/
bindInterceptor(Matchers.any(), Matchers.annotatedWith(NonWeekend.class), new NotOnWeekendsInterceptor());
}
/**
* 7. 可以使⽤Provides注解主动对外提供创建的bean 有点类似 Spring的@Bean注解,这种⽅式可以对bean做⾃定义加⼯ * 相当于反转了bind的那个动作同时也可以结合⾃定义注解使⽤⽐如上⾯的@Paypal 效果相同
* 但是这种⽅式创建的bean不能参与AOP 因为instance是⽤户创建的嘛,所以任何额外逻辑编编织不进去了。

* 那怎么解决这个问题,guice在bind后提供了toConstructor⽅法去指定实现类。

* 这样就连Inject注解都不需要了。

因为这个实现类可能是三⽅提供的
* @return
*/
@Provides
public AlertService provideAlertService() {
RedAlertService redAlertService = new RedAlertService();
redAlertService.setTestAttribute();
return redAlertService;
}
}
⽤于AOP
package com.code260.ss.guice.demo.bill;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class NotOnWeekendsInterceptor implements MethodInterceptor {
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
System.out.println("do something before NotOnWeekendsInterceptor invoke");
Object result = methodInvocation.proceed();
System.out.println("do something after NotOnWeekendsInterceptor invoke");
return result;
}
}。

相关文档
最新文档