Google Guice - 轻量级 DI 依赖注入框架
2017-03-09 16:28
746 查看
Guice简单使用
示例代码 Anddd7/Demo-Guice参考了 博客 - Google Guice 系列教程 和 Github - greengerong/guice-demo
Guice是一个DI (依赖注入) 框架 ,和Spring的依赖注入基本相同
轻量级 ,启动迅速
使用比较简单
但是
只有依赖注入的功能 ,如果是企业级的程序 ,需要整合其他资源 ,Spring的生态圈还是好很多的
开始
引入依赖@Inject,同Spring
@Autowired
public class MessageServiceImpl implements MessageService { @Inject MessageDao messageDao; public void sendMessage(Message msg) { messageDao.sendMessage(msg); } public Message receiveMessage() { return messageDao.receiveMessage(); } }
注入对象
@Provide,同Spring
@Bean; 同时会将方法中包含的其他对象注入(nameService1,nameService2)
@Provides public List<BookService> getAllItemServices(@Named("book1") BookService nameService1, @Named("book2") BookService nameService2) { return of(nameService1, nameService2); }
依赖管理
AbstractModule,Spring是通过扫描注解 ,Guice则是按照模块手动控制
/** * Message模块 依赖管理 * 绑定接口和实现 */ public class MessageModule extends AbstractModule { protected void configure() { final Binder binder = binder(); //interface-impl 依赖关系 binder.bind(MessageService.class).to(MessageServiceImpl.class).in(SINGLETON); binder.bind(MessageDao.class).to(MessageDaoImpl.class).in(SINGLETON); //单独注入 ,单例 binder.bind(SingleScopeBean.class).in(SINGLETON); binder.bind(NoScopeBean.class).in(NO_SCOPE); //可以将已经引入的对象绑定到容器中 binder.bind(HelloWorld.class).toInstance(helloWorld); } private HelloWorld helloWorld; public MessageModule(HelloWorld helloWorld) { this.helloWorld = helloWorld; } }
多实现
/**
* User模块 依赖管理
* <p>
* 一个interface是无法绑定不同的impl的 ,可以通过两种方式
* 使用Multibinder
* 使用注解别名区别
*/
public class UserModule extends AbstractModule {
protected void configure() {
final Binder binder = binder();
//具有多个实现的service ,会以 Set<UserService> 存在
final Multibinder<UserService> userServiceMultibinder = Multibinder.newSetBinder(binder, UserService.class);
userServiceMultibinder.addBinding().to(EmployeeServiceImpl.class);
userServiceMultibinder.addBinding().to(EmployerServiceImpl.class);
//通过名称绑定
binder.bind(BookService.class).annotatedWith(Names.named("book1")).to(Book1ServiceImpl.class);
binder.bind(BookService.class).annotatedWith(Names.named("book2")).to(Book2ServiceImpl.class);
}
/**
* 同@Bean ,将返回值作为一个容器对象
*/
@Provides public List<BookService> getAllItemServices(@Named("book1") BookService nameService1, @Named("book2") BookService nameService2) { return of(nameService1, nameService2); }
}
使用
public class AppBindTest { private static final Logger log = LoggerFactory.getLogger(AppBindTest.class); private Injector injector; /** * 创建module(相当于 bean 工厂) ,可加载多个 */ @Before public void setUp() throws Exception { injector = Guice.createInjector( new MessageModule(new HelloWorld("Test 初始化")),//这里的HelloWorld是手动创建 再关联到容器中的 new UserModule()); } /** * 测试绑定已有对象 ,HelloWorld */ @Test public void runtimeTest() throws Exception { HelloWorld instance = injector.getInstance(HelloWorld.class); HelloWorld instance2 = injector.getInstance(HelloWorld.class); Assert.assertEquals(instance, instance2); } /** * 测试依赖注入 @Inject ,通过接口取用 ; Service中包含了Dao */ @Test public void injectTest() throws Exception { MessageService instance = injector.getInstance(MessageService.class); instance.sendMessage(new Message("send", "土豆土豆 ,我是地瓜")); Message receive = instance.receiveMessage(); log.debug(receive.toString()); Assert.assertThat(instance, is(instanceOf(MessageServiceImpl.class))); } /** * 测试单例 Singleton */ @Test public void singletonTest() throws Exception { SingleScopeBean instance = injector.getInstance(SingleScopeBean.class); SingleScopeBean instance2 = injector.getInstance(SingleScopeBean.class); log.debug(instance.toString()); log.debug(instance2.toString()); Assert.assertEquals(instance, instance2); } /** * 测试非单例 NoScope */ @Test public void noScopeTest() throws Exception { NoScopeBean instance = injector.getInstance(NoScopeBean.class); NoScopeBean instance2 = injector.getInstance(NoScopeBean.class); log.debug(instance.toString()); log.debug(instance2.toString()); Assert.assertNotEquals(instance, instance2); } /** * 测试多重绑定 ,取出的是一个Set */ @Test public void multiBindTest() throws Exception { Set<UserService> instances = injector.getInstance( new Key<Set<UserService>>() { }); List<User> users = new ArrayList<User>(); instances.forEach(e -> users.addAll(e.getUser())); users.forEach(e -> log.debug(e.toString())); Assert.assertEquals(4, users.size()); } /** * 测试 @Provide 装配的对象 */ @Test public void provideTest() throws Exception { List<BookService> instances = injector.getInstance(new Key<List<BookService>>() { }); instances.forEach(e -> log.debug(e.info())); Assert.assertEquals(2, instances.size()); } }
相关文章推荐
- 从零开始写javaweb框架笔记15-搭建轻量级JAVAWEB框架-实现依赖注入功能
- Yii框架依赖注入DI容器
- Zenject——轻量级依赖注入框架 for Unity
- Android 依赖注入(DI)框架 Dagger
- 依赖注入[5]: 创建一个简易版的DI框架[下篇]
- 超轻量级DI容器框架Google Guice与Spring框架的区别教程详解及其demo代码片段分享
- Objection, 一个轻量级的Objective-C依赖注入框架
- YII框架的依赖注入容器DI使用方法-实例说明
- Objection 一个轻量级的Objective-C依赖注入框架
- 从零开始写javaweb框架笔记15-搭建轻量级JAVAWEB框架-实现依赖注入功能
- Google Guice 依赖注入框架:简明教程
- 框架 day36 Spring3 入门,DI依赖注入,装配bean基于xml/注解, 整合Junit4,配置约束自动提示
- IoC框架(依赖注入 DI)
- 超轻量级DI容器框架Google Guice与Spring框架的区别教程详解及其demo代码片段分享
- IoC框架(依赖注入 DI)
- 依赖注入[4]: 创建一个简易版的DI框架[上篇]
- Dagger——Android的依赖注入框架
- MVC进阶之路:依赖注入(Di)和Ninject
- Spring依赖注入DI
- 控制翻转(IOC)与 依赖注入 (DI)