Guice總結


Guice總結

Jar包:guice-4.1.0.jar

輔包:

  1. guava-15.0.jar
  2. aopalliance-.jar
  3. javaee-api-6.0-RC2.jar

Guice的IoC

兩種模式,一種是基於Module的,Module的實現類將會在config()方法中進行配置,指定某一個基類/接口都應對應哪一個具體實現;這樣,在通過@Inject來注解屬性/構造函數的時候,就可以自動根據配置進行實例化。

但是Guice實例和Spring一個很大區別在於獲取實例的方式一定是通過如下方式獲取(因為Guice沒有掃描和自動發現功能):

Public void config(Binder binder){
         Binder.bind(BaseClass.class).to(ImplClass.class);
}
… …

injector = Guice.createInjector(new ObjectPool());
BaseClass instace = injector.getInstance(BaseClass.class);

 

在這個過程中才會應用config中的配置來對注解內容進行操作;instance的類型是ImplClass。OjectPool對象實現了Module,並重寫了config()。

當然,如果沒有這種根據抽象類/接口來選擇實現對象的場景,可以不使用Module,比如作為一個類,里面的屬相可能就是比較直白的類,直接new就可以了,這個時候,你可以采用@Inject進行注解構造函數的方式,來進行自動實例化構造參數。

Private C1 c1;
Private C2 c2;

@Inject
Public MyClass(C1 c1, C2 c2){

}

….

Injector = Guice.createInjector();
MyClass mc = Injector.getInstance(MyClass.class);
…

類似的,還可以直接進行字段注解,在getInstance()的過程中,將會自動對於字段進行實例化,這個過程有點像一個熔爐的感覺,扔進去一個類,出來的是一個經過處理的實例了。

Guice的IoC有兩大作用,一個是通過config來定義抽象類/接口的具體實現類,第二個是在構建實例的時候,自動來實例化參數以及字段,本質都是實例化,一個是選擇性,一個是內部關聯對象實例化。即一個是實例化那個,一個怎么實例化。

另外,在怎么實例化的時候,在對於抽象列/接口類型字段/參數的時候也會有一個實例化那個的處理。

 

創建AOP

第一步,

創建一個AOP的攔截對象,繼承MethodInterceptor(需要引入aopalliance-.jar),重寫invoke方法:

    @Override
    public Object invoke(MethodInvocation arg0) throws Throwable {
       doBefore(arg0);
       Object ret = arg0.proceed();
       doAfter(arg0);
       return ret;
    }

實現doBefore以及doAfter來進行前置操作和后置操作;

第二步,

就是在Module的實現類中通過配置config函數來制定綁定AOP的規則,下面定義的規則就是注解“Data2Aop”的方法將會被使用Data2Aop來進行AOP(Data2Aop繼承了MethodInterceptor並重寫了invoke):

    @Override
public void configure(Binder binder) {
  binder.bindInterceptor(Matchers.any(), Matchers.annotatedWith(Names.named("Data2Aop")), new Data2Aop());
}

第三步,

在Data2Handler類中的handler方法體(真正要切的函數)上面通過@Named來進行注解。

@Named("Data2Aop")
protected void handleInternal(TransportSession tSession, CommandExchangeBuffer ceb) throws Exception {
  … …
}

第四步,

在需要進行Data2Handler實例化的時候,通過Guice的Injector來進行獲得(實踐規則),即可實現AOP了。

實例化之后,使用Guice來注入成員

可以實例化之后,在通過injector.injectMembers(instance)來注入@Inject成員
TaskContainer container = new TaskContainer();
this.taskManager = new TaskManager(container);
Platform.getInjector().injectMembers(taskManager);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM