三分鐘快速了解 Google Guice依賴注入框架

Guice是Google開源的一個依賴注入類庫,相比于Spring IoC來說更小更快,而最大的區(qū)別在于脫離的XML配置,大量使用Annotation來實現(xiàn)注入,支持屬性,構(gòu)造器,setter等多種功能方式注入對象。我們常用的Elastic Search中大量使用Guice。

Google Guice注入

1. Module容器

Guice中容器即Module,用于綁定接口和實現(xiàn)類,類似Spring的applicationContext.xml。Module就像一個Map,獲取對象時需要傳入綁定的class就能獲得實體類,有兩種方法完成配置:

  1. 實現(xiàn)Module接口
Injector injector = Guice.createInjector(new Module(){
    @Override
    public void configure(Binder binder) {
        binder.bind(UserService.class).to(UserServiceImpl.class);
    }
});

// 獲取對象實例
UserService userService = injector.getInstance(UserService.class);
  1. 繼承AbstractModule抽象類
public class DependencyInjectionModule extends AbstractModule {
    //需要實現(xiàn)的配置關(guān)聯(lián)方法
    @Override
    protected void configure() {
        bind(UserService.class).to(UserServiceImpl.class);
        bind(UserRepository.class).to(UserRepositoryDynamoDB.class);
    }
}

2. Inject注入

  1. setter 方法注入
@Inject
public void setUserService(UserService userService) {
    this.userService = userService;
}
  1. 構(gòu)造函數(shù)注入
    構(gòu)造函數(shù)上添加@Inject注解,可以實現(xiàn)在對象初始化的時候自動提供參數(shù)。
public class UserServiceImpl implements UserService {
    private final UserRepository userRepository;
    @Inject
    public UserServiceImpl(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
}
  1. 屬性注入
    屬性注入時 必須通過Guice.createInjector().getInstance(UserService.class);來獲取實現(xiàn)類, 如果直接new, 會inject失敗。
public class UserServiceImpl implements UserService {
    @Inject
    private final UserRepository userRepository;
}

3. injectMembers方法

如果一個類是new出來的,但是它里面的對象需要依賴需要注入,則可使用injectMembers方法。在測試代碼中Handle是直接new出來。

Handler Handler = new Handler();
Guice.createInjector().injectMembers(Handler);

4. Main方法調(diào)用

最后直接使用Main方法測試下,gradle runMain,例子中的Main方法在DependencyInjectionModule類中。

public static void main(String[] args) {
    Injector injector = Guice.createInjector(new DependencyInjectionModule());
    UserService userService = injector.getInstance(UserService.class);
    User userByToken = userService.getUserByToken("1234");
    System.out.println(userByToken.getUsername());
}

測試工程

為了方便大家看到實際效果,下載代碼可以看到以下目錄結(jié)構(gòu)。在命令行中cd到目錄,運行gradle runMain就能看到效果,同時可以任意修改代碼進(jìn)行測試。

guice-ioc代碼結(jié)構(gòu)

代碼下載地址: https://pan.baidu.com/s/1_1BK4MYhYKnimA6jFVPm1Q
提取碼: qspx

//解壓運行即可
gradle runMain
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容