Guice總結
Jar包:guice-4.1.0.jar
輔包:
- guava-15.0.jar
- aopalliance-.jar
- 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來注入成員