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就能獲得實體類,有兩種方法完成配置:
- 實現(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);
- 繼承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注入
- setter 方法注入
@Inject
public void setUserService(UserService userService) {
this.userService = userService;
}
- 構(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;
}
}
- 屬性注入
屬性注入時 必須通過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