title: Guice依賴注入入門
date: 2019-12-17 18:55:00
tags: 依賴注入 googlespring
在Springboot中,用的最多的一個註解就是@Autowire了,我一直知道它是依賴注入,要用哪一個類的方法,加上這個註解就能夠了,可是依賴注入,
總感受這個說法很專業,很抽象,算了會用就好了。segmentfault
今天用到了google的Guice依賴注入,由於它很小,很輕量。我又想起來到底什麼是依賴注入。通過我吧官方的
demo實踐了一遍。對依賴注入的理解又深入了幾分。個人理解就是,若是A類用到了B類的方法,那麼咱們稱A類依賴B類,
由於A類不能單獨的運行,必需要有B類作支撐,這叫作A類依賴B類,注入 我理解在A類中實例化出一個B類的對象。
因此總的來講,依賴注入就是在一個類裏面注入一個其餘類的實例對象。框架
咱們只能在A類中new 出一個B類的實例對象,而後調用該對象的方法。這樣顯得不夠優雅,也不直觀。代碼可讀性也很差。測試
在Spring中,咱們直接使用@Autorire 能夠達到一樣的效果。ui
在Vert.x或者其它項目中,咱們總不至於爲了使用個依賴注入,引入一個龐大的spring框架吧,Google爲咱們提供了一個
輕量級的注入框架Guice。和Spring相似。咱們只須要使用@Inject註解就能夠了。與Springboot不一樣的是,咱們須要加一點配置。google
guice的依賴包是必須的,junit是咱們測試使用spa
<dependency> <groupId>com.google.inject</groupId> <artifactId>guice</artifactId> <version>4.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>
如圖中 咱們在Application中依賴了log 和UserService,兩個接口。咱們注入使用的是@Inject註解。爲了對比,
我在test方法也使用了new 一個新對象的方法(和依賴注入效果是同樣的)。LogImpl和UserServiceImpl都很簡單,裏面都只有一個方法,方法類容是打印一句話。.net
上圖中使用了@Inject註解可是咱們尚未配置注入關係,這樣是有問題的,由於咱們注入的是接口,在調用方法的時候,並不知道去那裏調用具體實現類的方法。
因此須要配置一下綁定關係,新建立一個類,繼承自AbstractModule類。3d
public class MyAppModule extends AbstractModule { protected void configure() { bind(Log.class).to(LogImpl.class); bind(UserService.class).to(UserServiceImpl.class); bind(Application.class).to(ApplicationImpl.class); } }
咱們將接口和實現類進行綁定。日誌
這裏須要注意的是,須要建立一個injector注射器,咱們經過這個注射器的getInstance方法,傳入接口名稱,
獲得,實例,這樣咱們就可使用實例的方法了。
public class Test { private static Injector injector; @BeforeClass public static void init(){ injector = Guice.createInjector( new MyAppModule()); } @org.junit.Test public void test(){ // UserService instance = injector.getInstance(UserService.class); // instance.sayHello(); Application instance = injector.getInstance(Application.class); instance.test(); } }
固然更簡單的你也能夠直接在ApplicationImpl中直接測試。可是一樣,在咱們呢須要在一個類加載的
初期,初始化一個注射器injector對象,而後用該注射器拿到咱們須要的實例,執行方法便可
public class ApplicationImpl implements Application { @Inject private UserService userService; @Inject private Log log; private static Injector injector; static { injector = Guice.createInjector(new MyAppModule()); } public void test() { userService.sayHello(); log.writeLog(); } public static void main(String[] args) { Application instance = injector.getInstance(Application.class); instance.test(); } }
結果以下
hello hi --------記錄日誌-------
本文由博客一文多發平臺 OpenWrite 發佈!