Google Guice注入Guice是Google开源的一个依赖注入类库,相比于Spring IoC来说更小更快,而最大的区别在于脱离的XML配置,大量使用Annotation来实现注入,支持属性,构造器,setter等多种功能方式注入对象。我们常用的Elastic Search中大量使用Guice。
1. Module容器
Guice中容器即Module,用于绑定接口和实现类,类似Spring的applicationContext.xml。Module就像一个Map,获取对象时需要传入绑定的class就能获得实体类,有两种方法完成配置:
- 实现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 {
//需要实现的配置关联方法
@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;
}
- 构造函数注入
构造函数上添加@Inject注解,可以实现在对象初始化的时候自动提供参数。
public class UserServiceImpl implements UserService {
private final UserRepository userRepository;
@Inject
public UserServiceImpl(UserRepository userRepository) {
this.userRepository = userRepository;
}
}
- 属性注入
属性注入时 必须通过Guice.createInjector().getInstance(UserService.class);来获取实现类, 如果直接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方法调用
最后直接使用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());
}
测试工程
为了方便大家看到实际效果,下载代码可以看到以下目录结构。在命令行中cd到目录,运行gradle runMain
就能看到效果,同时可以任意修改代码进行测试。
代码下载地址: https://pan.baidu.com/s/1_1BK4MYhYKnimA6jFVPm1Q
提取码: qspx
//解压运行即可
gradle runMain
网友评论