SlideShare a Scribd company logo
RoboGuice well-known DI framework for Android 5/7/2011 1 Android May Days 2011
Dependency Injection Устранение зависимостей в коде Замена паттерна new() Избавление от рутины создания фабрик, заводов и цехов Возможность использования нескольких конфигураций Ограничение кол-ва инстанций класса Упрощение тестирования 5/7/2011 Android May Days 2
RoboGuice http://code.google.com/p/roboguice/ Первым делом, это DI фрэймворк, который также позволяет: @InjectView() @InjectResource() @InjectPreference() @Inject System Services @ObservesEvents 5/7/2011 I’m footer and nobody reads me 3
Injecting RoboGuice СкачатьRoboGuice 1.1.1 и guice-2.0-no_aop.jar и подключить их к проекту. Или есть прекрасная возможность начать пользоваться Maven’ом      (чего я еще не сделал) Добавить в проект класс наследник RoboApplication и прописать его в AndroidManifest.xlmв тэге application значением параметра android:name (“.MyRoboApplication”) 5/7/2011 Damn footer live 4
Application Code Sample 5/7/2011 publicclassDiscoBoxApplicationextendsRoboApplication { @Override protectedvoidaddApplicationModules(List<Module> modules) { modules.add(newNetSocketModule()); modules.add(newDiscoBoxModule()); super.addApplicationModules(modules);     } } I’m a poop-poor footer, no one likes me 5
Modules Происходит настройка bind-ингов классов на конкретные объекты Статическая инициализация 5/7/2011 I could be a header 6 bind(Client.class).to(SocketClient.class); @Providespublic Client provideClient() {         Client c = newSocketClient(); requestInjection(c); return c; } requestStaticInjection(ClientServiceAPI.class);
Module Sample 5/7/2011 footer sample 7 publicclassNetSocketModuleextendsAbstractModule { publicstaticfinal String SERVER_BROADCAST_IN_PORT = "SERVER_BROADCAST_IN_PORT"; publicstaticfinal String SERVER_BROADCAST_OUT_PORT = "BROADCAST_OUT_PORT"; publicstaticfinal String SO_TIMEOUT = "SO_TIMEOUT"; privatestaticfinalintSERVER_BROADCAST_IN_PORT_VALUE = 2012; privatestaticfinalintSERVER_BROADCAST_OUT_PORT_VALUE = 2013; privatestaticfinalintSO_TIMEOUT_VALUE = 20 * 1000; @Override protectedvoid configure() {         bind(ProtocolProcessor.class).to(DefaultProtocolProcessor.class);         bind(Connection.class).to(DefaultConnection.class);         bind(Client.class).to(SocketClient.class);         bind(Server.class).to(SocketServer.class).in(Scopes.SINGLETON);         bind(ServerFinder.class).to(SocketServerFinder.class);                 bind(Integer.class).annotatedWith(Names.named(SO_TIMEOUT))             .toInstance(SO_TIMEOUT_VALUE);         bind(Integer.class).annotatedWith(Names.named(SERVER_BROADCAST_IN_PORT))             .toInstance(SERVER_BROADCAST_IN_PORT_VALUE);         bind(Integer.class).annotatedWith(Names.named(SERVER_BROADCAST_OUT_PORT))             .toInstance(SERVER_BROADCAST_OUT_PORT_VALUE);     } }
Injecting С помощью @Inject C помощью Injector 5/7/2011 blah-blah-blah 8    @Inject protected Injector injector; @Inject publicSocketServer(@Named(NetSocketModule.SERVER_PORT) intport) {         ... } @Inject publicvoidsetProtocolProcessor(ProtocolProcessor processor) { this.processor = processor; } Connection connection = injector.getInstance(Connection.class);
Lazy Injection Использование интерфейса Provider<T> 5/7/2011 and lazy footer 9 @Injectpublic Provider<Server> serverProvider; publicvoidmethodRequersServer() {     Server servet = serverProvider.get(); ... }
Scopes Можно пометить класс аннотацией @Singleton, для ограничения кол-ва инстанций тяжелого ресурсоемкого класса 5/7/2011 scopes looks like footer friends 10 @Singleton publicclassSocketServerimplements Server { ... }
Constructors with params Использование аннотаций и специальных биндингов 5/7/2011 what footers are good for? 11 @Inject publicSocketServer(@Named(NetSocketModule.SERVER_PORT) int port,  @Named(NetSocketModule.SERVER_BROADCAST_ADDRESS) String broadcastAddress, @Named(NetSocketModule.SERVER_BROADCAST_IN_PORT) intbroadcastInPort, @Named(NetSocketModule.SERVER_BROADCAST_OUT_PORT) intbroadcastOutPort) { } @Override protectedvoid configure() {    ... bind(Integer.class).annotatedWith(Names.named(SERVER_BROADCAST_IN_PORT))             .toInstance(SERVER_BROADCAST_IN_PORT_VALUE); bind(Integer.class).annotatedWith(Names.named(SERVER_BROADCAST_OUT_PORT))             .toInstance(SERVER_BROADCAST_OUT_PORT_VALUE); bind(String.class).annotatedWith(Names.named(SERVER_BROADCAST_ADDRESS))             .toInstance(SERVER_BROADCAST_ADDRESS_VALUE); }
Constructors with params Использование @Provides в модуле 5/7/2011 footer is watching you 12 @Provides Server provideServer() {         Server server = newSocketServer(2011, "224.0.0.0", 2013, 2014); requestInjection(server); return server;     }
Events Использовать уже готовые событий или написать свои 5/7/2011 footer, simple as is 13 publicvoidperformShutDown(@ObservesOnDestroyEvent event) { doSomeCleanUp();     } @Inject protectedEventManagereventManager; protectedvoid buy() { eventManager.notify(MyOtherActivity.this, newMyBuyEvent() );     } protectedvoidhandleBuy(@ObservesMyBuyEventbuyEvent ) { Toast.makeToast(this, "You won't regret it!", Toast.LENGTH_LONG).show();     }     //The event class can be anything you want publicclassMyBuyEvent {         ... }
Views Устранение лишнего,повторяющегося от активити к активити нудного тупого обезьяньего кодаfindViewById(R.id.damn_view_id) в onCreate() 5/7/2011 cool footer is not a crime 14 @InjectView(R.id.server_search_button_panel)ViewSwitchersearchButtonSwitcher; @InjectView(R.id.server_selector)Spinner serverSelector; @InjectView(R.id.server_search_button) Button searchButton; @InjectView(R.id.client_music_mode_button) Button musicModuleButton;
Logging RoboGuice'sLn logger Отличный формат вызова Автоматическое отключение debug и verbose логов при release-ой сборке В тэге лога сам пишет класс и номер строки кода Можно легко переопределить формат отображения и перенаправить вывод лога в файл 5/7/2011 we footers hate each other 15 Ln.d("text"); Ln.d("formatted %s", "text"); Ln.d(exception, "reason %s", "text");
Спасибо за внимание Презентацию подготовил Шауберт Александр shaubert.alexander@gmail.com     Специально для Android May Days 2011 5/7/2011 and who will say thanks to footer 16

More Related Content

What's hot

Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
Platonov Sergey
 
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестов
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестовЮлия Ковалёва. Fscheck — альтернативный путь для unit тестов
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестов
MskDotNet Community
 
Moxy. Из чего состоит и как этим пользоваться
Moxy. Из чего состоит и как этим пользоватьсяMoxy. Из чего состоит и как этим пользоваться
Moxy. Из чего состоит и как этим пользоваться
Yuri Shmakov
 
Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.
Dima Dzuba
 
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Noveo
 
Эльдар Марков
Эльдар МарковЭльдар Марков
Эльдар Марковalarin
 
Олексій Стульніков “WinAppDriver – автоматизація Desktop ніколи не була такою...
Олексій Стульніков “WinAppDriver – автоматизація Desktop ніколи не була такою...Олексій Стульніков “WinAppDriver – автоматизація Desktop ніколи не була такою...
Олексій Стульніков “WinAppDriver – автоматизація Desktop ніколи не була такою...
Dakiry
 
Solit 2012, Enterprise разработка PHP приложений, Иван Захарченко
Solit 2012, Enterprise разработка PHP приложений, Иван ЗахарченкоSolit 2012, Enterprise разработка PHP приложений, Иван Захарченко
Solit 2012, Enterprise разработка PHP приложений, Иван Захарченкоsolit
 
Android осень 2013 лекция 4
Android осень 2013 лекция 4Android осень 2013 лекция 4
Android осень 2013 лекция 4Technopark
 
ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...
ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...
ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...ZFConf Conference
 
DI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыDI в C++ тонкости и нюансы
DI в C++ тонкости и нюансы
Platonov Sergey
 
Unit тестирование
Unit тестированиеUnit тестирование
Unit тестированиеMaxim Volchenko
 
Android - 11 - Multithreading
Android - 11 - MultithreadingAndroid - 11 - Multithreading
Android - 11 - Multithreading
Noveo
 
введение в Laravel 5
введение в Laravel 5введение в Laravel 5
введение в Laravel 5
Аскар Рымбаев
 
Что нового в Android O (Grodno HTP)
Что нового в Android O (Grodno HTP)Что нового в Android O (Grodno HTP)
Что нового в Android O (Grodno HTP)
Kirill Rozov
 
Konstantin slisenko - Spring Framework
Konstantin slisenko - Spring FrameworkKonstantin slisenko - Spring Framework
Konstantin slisenko - Spring Frameworkbeloslab
 
Selenium, а давай подождем?
Selenium, а давай подождем?Selenium, а давай подождем?
Selenium, а давай подождем?
SQALab
 
Code Contracts ABC 16.04.2011
Code Contracts ABC 16.04.2011Code Contracts ABC 16.04.2011
Code Contracts ABC 16.04.2011Dmytro Mindra
 
Zend framework 2
Zend framework 2Zend framework 2
Zend framework 2
Alex Simanovich
 

What's hot (19)

Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестов
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестовЮлия Ковалёва. Fscheck — альтернативный путь для unit тестов
Юлия Ковалёва. Fscheck — альтернативный путь для unit тестов
 
Moxy. Из чего состоит и как этим пользоваться
Moxy. Из чего состоит и как этим пользоватьсяMoxy. Из чего состоит и как этим пользоваться
Moxy. Из чего состоит и как этим пользоваться
 
Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.Архитектура. Доступноять программных систем.
Архитектура. Доступноять программных систем.
 
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
 
Эльдар Марков
Эльдар МарковЭльдар Марков
Эльдар Марков
 
Олексій Стульніков “WinAppDriver – автоматизація Desktop ніколи не була такою...
Олексій Стульніков “WinAppDriver – автоматизація Desktop ніколи не була такою...Олексій Стульніков “WinAppDriver – автоматизація Desktop ніколи не була такою...
Олексій Стульніков “WinAppDriver – автоматизація Desktop ніколи не була такою...
 
Solit 2012, Enterprise разработка PHP приложений, Иван Захарченко
Solit 2012, Enterprise разработка PHP приложений, Иван ЗахарченкоSolit 2012, Enterprise разработка PHP приложений, Иван Захарченко
Solit 2012, Enterprise разработка PHP приложений, Иван Захарченко
 
Android осень 2013 лекция 4
Android осень 2013 лекция 4Android осень 2013 лекция 4
Android осень 2013 лекция 4
 
ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...
ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...
ZFConf 2011: Создание REST-API для сторонних разработчиков и мобильных устрой...
 
DI в C++ тонкости и нюансы
DI в C++ тонкости и нюансыDI в C++ тонкости и нюансы
DI в C++ тонкости и нюансы
 
Unit тестирование
Unit тестированиеUnit тестирование
Unit тестирование
 
Android - 11 - Multithreading
Android - 11 - MultithreadingAndroid - 11 - Multithreading
Android - 11 - Multithreading
 
введение в Laravel 5
введение в Laravel 5введение в Laravel 5
введение в Laravel 5
 
Что нового в Android O (Grodno HTP)
Что нового в Android O (Grodno HTP)Что нового в Android O (Grodno HTP)
Что нового в Android O (Grodno HTP)
 
Konstantin slisenko - Spring Framework
Konstantin slisenko - Spring FrameworkKonstantin slisenko - Spring Framework
Konstantin slisenko - Spring Framework
 
Selenium, а давай подождем?
Selenium, а давай подождем?Selenium, а давай подождем?
Selenium, а давай подождем?
 
Code Contracts ABC 16.04.2011
Code Contracts ABC 16.04.2011Code Contracts ABC 16.04.2011
Code Contracts ABC 16.04.2011
 
Zend framework 2
Zend framework 2Zend framework 2
Zend framework 2
 

Viewers also liked

English
EnglishEnglish
English
Vicky Perez
 
Adverbs
AdverbsAdverbs
Adverbs
Vicky Perez
 
Native Development
Native DevelopmentNative Development
Native Development
Alexander Shaubert
 
Cptedreview 100417135250-phpapp02
Cptedreview 100417135250-phpapp02Cptedreview 100417135250-phpapp02
Cptedreview 100417135250-phpapp02
Marti LaMar
 
First Android Mini-party (Part I)
First Android Mini-party (Part I)First Android Mini-party (Part I)
First Android Mini-party (Part I)Alexander Shaubert
 
trabajo de tic
trabajo de tictrabajo de tic
trabajo de tic
gigimar
 
Ingles leccion 5 y 8
Ingles  leccion 5 y 8Ingles  leccion 5 y 8
Ingles leccion 5 y 8
Vicky Perez
 
Crime Prevention Through Environmental Design
Crime Prevention Through Environmental DesignCrime Prevention Through Environmental Design
Crime Prevention Through Environmental Design
Housing Education and Research Association
 
Adverbs
AdverbsAdverbs
Adverbs
Vicky Perez
 

Viewers also liked (9)

English
EnglishEnglish
English
 
Adverbs
AdverbsAdverbs
Adverbs
 
Native Development
Native DevelopmentNative Development
Native Development
 
Cptedreview 100417135250-phpapp02
Cptedreview 100417135250-phpapp02Cptedreview 100417135250-phpapp02
Cptedreview 100417135250-phpapp02
 
First Android Mini-party (Part I)
First Android Mini-party (Part I)First Android Mini-party (Part I)
First Android Mini-party (Part I)
 
trabajo de tic
trabajo de tictrabajo de tic
trabajo de tic
 
Ingles leccion 5 y 8
Ingles  leccion 5 y 8Ingles  leccion 5 y 8
Ingles leccion 5 y 8
 
Crime Prevention Through Environmental Design
Crime Prevention Through Environmental DesignCrime Prevention Through Environmental Design
Crime Prevention Through Environmental Design
 
Adverbs
AdverbsAdverbs
Adverbs
 

Similar to RoboGuice

iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
Andrii Dzynia
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobileUA Mobile
 
Что нового в Visual Studio 2010 и .Net 4.0
Что нового в Visual Studio 2010 и .Net 4.0Что нового в Visual Studio 2010 и .Net 4.0
Что нового в Visual Studio 2010 и .Net 4.0
akrakovetsky
 
C# Web. Занятие 11.
C# Web. Занятие 11.C# Web. Занятие 11.
C# Web. Занятие 11.
Igor Shkulipa
 
.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека
.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека
.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека
NETFest
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Andrey Rebrov
 
Gwt jug basic
Gwt jug basicGwt jug basic
Gwt jug basic
Alex Tumanoff
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
Oleksii Okhrymenko
 
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Ontico
 
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGвебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGAndrey Rebrov
 
C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.
Igor Shkulipa
 
Школа-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. РазноеШкола-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. РазноеГлеб Тарасов
 
MVP, Moxy. Как правильно пользоваться
MVP, Moxy. Как правильно пользоватьсяMVP, Moxy. Как правильно пользоваться
MVP, Moxy. Как правильно пользоваться
Yuri Shmakov
 
Selenium 2.0: обзор новых возможностей
Selenium 2.0: обзор новых возможностейSelenium 2.0: обзор новых возможностей
Selenium 2.0: обзор новых возможностейPaul Stashevsky
 
Разработка Web-приложений на Angular JS. Архитектурные семинары Softengi
Разработка Web-приложений на Angular JS. Архитектурные семинары SoftengiРазработка Web-приложений на Angular JS. Архитектурные семинары Softengi
Разработка Web-приложений на Angular JS. Архитектурные семинары Softengi
Softengi
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Kirill Chebunin
 
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf Conference
 
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, ControllersШкола-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, ControllersГлеб Тарасов
 

Similar to RoboGuice (20)

iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
 
Что нового в Visual Studio 2010 и .Net 4.0
Что нового в Visual Studio 2010 и .Net 4.0Что нового в Visual Studio 2010 и .Net 4.0
Что нового в Visual Studio 2010 и .Net 4.0
 
C# Web. Занятие 11.
C# Web. Занятие 11.C# Web. Занятие 11.
C# Web. Занятие 11.
 
.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека
.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека
.NET Fest 2018. Сергей Калинец. Azure веб разработка здорового человека
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
 
Gwt jug basic
Gwt jug basicGwt jug basic
Gwt jug basic
 
Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2Превышаем скоростные лимиты с Angular 2
Превышаем скоростные лимиты с Angular 2
 
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
Превышаем скоростные лимиты с Angular 2 / Алексей Охрименко (IPONWEB)
 
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNGвебинар - функциональное тестирование с использованием Selenium 2 и TestNG
вебинар - функциональное тестирование с использованием Selenium 2 и TestNG
 
C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.C++ STL & Qt. Занятие 05.
C++ STL & Qt. Занятие 05.
 
Школа-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. РазноеШкола-Студия разработки приложений для iOS. 5 лекция. Разное
Школа-Студия разработки приложений для iOS. 5 лекция. Разное
 
MVP, Moxy. Как правильно пользоваться
MVP, Moxy. Как правильно пользоватьсяMVP, Moxy. Как правильно пользоваться
MVP, Moxy. Как правильно пользоваться
 
Zend Framework и Doctrine
Zend Framework и DoctrineZend Framework и Doctrine
Zend Framework и Doctrine
 
Selenium 2.0: обзор новых возможностей
Selenium 2.0: обзор новых возможностейSelenium 2.0: обзор новых возможностей
Selenium 2.0: обзор новых возможностей
 
Разработка Web-приложений на Angular JS. Архитектурные семинары Softengi
Разработка Web-приложений на Angular JS. Архитектурные семинары SoftengiРазработка Web-приложений на Angular JS. Архитектурные семинары Softengi
Разработка Web-приложений на Angular JS. Архитектурные семинары Softengi
 
Чуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОПЧуть сложнее чем Singleton: аннотации, IOC, АОП
Чуть сложнее чем Singleton: аннотации, IOC, АОП
 
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to UsZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
 
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, ControllersШкола-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
Школа-студия разработки приложений для iOS. 2 лекция. MVC, View, Controllers
 
The Best Portlet
The Best PortletThe Best Portlet
The Best Portlet
 

RoboGuice

  • 1. RoboGuice well-known DI framework for Android 5/7/2011 1 Android May Days 2011
  • 2. Dependency Injection Устранение зависимостей в коде Замена паттерна new() Избавление от рутины создания фабрик, заводов и цехов Возможность использования нескольких конфигураций Ограничение кол-ва инстанций класса Упрощение тестирования 5/7/2011 Android May Days 2
  • 3. RoboGuice http://code.google.com/p/roboguice/ Первым делом, это DI фрэймворк, который также позволяет: @InjectView() @InjectResource() @InjectPreference() @Inject System Services @ObservesEvents 5/7/2011 I’m footer and nobody reads me 3
  • 4. Injecting RoboGuice СкачатьRoboGuice 1.1.1 и guice-2.0-no_aop.jar и подключить их к проекту. Или есть прекрасная возможность начать пользоваться Maven’ом (чего я еще не сделал) Добавить в проект класс наследник RoboApplication и прописать его в AndroidManifest.xlmв тэге application значением параметра android:name (“.MyRoboApplication”) 5/7/2011 Damn footer live 4
  • 5. Application Code Sample 5/7/2011 publicclassDiscoBoxApplicationextendsRoboApplication { @Override protectedvoidaddApplicationModules(List<Module> modules) { modules.add(newNetSocketModule()); modules.add(newDiscoBoxModule()); super.addApplicationModules(modules); } } I’m a poop-poor footer, no one likes me 5
  • 6. Modules Происходит настройка bind-ингов классов на конкретные объекты Статическая инициализация 5/7/2011 I could be a header 6 bind(Client.class).to(SocketClient.class); @Providespublic Client provideClient() { Client c = newSocketClient(); requestInjection(c); return c; } requestStaticInjection(ClientServiceAPI.class);
  • 7. Module Sample 5/7/2011 footer sample 7 publicclassNetSocketModuleextendsAbstractModule { publicstaticfinal String SERVER_BROADCAST_IN_PORT = "SERVER_BROADCAST_IN_PORT"; publicstaticfinal String SERVER_BROADCAST_OUT_PORT = "BROADCAST_OUT_PORT"; publicstaticfinal String SO_TIMEOUT = "SO_TIMEOUT"; privatestaticfinalintSERVER_BROADCAST_IN_PORT_VALUE = 2012; privatestaticfinalintSERVER_BROADCAST_OUT_PORT_VALUE = 2013; privatestaticfinalintSO_TIMEOUT_VALUE = 20 * 1000; @Override protectedvoid configure() { bind(ProtocolProcessor.class).to(DefaultProtocolProcessor.class); bind(Connection.class).to(DefaultConnection.class); bind(Client.class).to(SocketClient.class); bind(Server.class).to(SocketServer.class).in(Scopes.SINGLETON); bind(ServerFinder.class).to(SocketServerFinder.class); bind(Integer.class).annotatedWith(Names.named(SO_TIMEOUT)) .toInstance(SO_TIMEOUT_VALUE); bind(Integer.class).annotatedWith(Names.named(SERVER_BROADCAST_IN_PORT)) .toInstance(SERVER_BROADCAST_IN_PORT_VALUE); bind(Integer.class).annotatedWith(Names.named(SERVER_BROADCAST_OUT_PORT)) .toInstance(SERVER_BROADCAST_OUT_PORT_VALUE); } }
  • 8. Injecting С помощью @Inject C помощью Injector 5/7/2011 blah-blah-blah 8 @Inject protected Injector injector; @Inject publicSocketServer(@Named(NetSocketModule.SERVER_PORT) intport) { ... } @Inject publicvoidsetProtocolProcessor(ProtocolProcessor processor) { this.processor = processor; } Connection connection = injector.getInstance(Connection.class);
  • 9. Lazy Injection Использование интерфейса Provider<T> 5/7/2011 and lazy footer 9 @Injectpublic Provider<Server> serverProvider; publicvoidmethodRequersServer() { Server servet = serverProvider.get(); ... }
  • 10. Scopes Можно пометить класс аннотацией @Singleton, для ограничения кол-ва инстанций тяжелого ресурсоемкого класса 5/7/2011 scopes looks like footer friends 10 @Singleton publicclassSocketServerimplements Server { ... }
  • 11. Constructors with params Использование аннотаций и специальных биндингов 5/7/2011 what footers are good for? 11 @Inject publicSocketServer(@Named(NetSocketModule.SERVER_PORT) int port, @Named(NetSocketModule.SERVER_BROADCAST_ADDRESS) String broadcastAddress, @Named(NetSocketModule.SERVER_BROADCAST_IN_PORT) intbroadcastInPort, @Named(NetSocketModule.SERVER_BROADCAST_OUT_PORT) intbroadcastOutPort) { } @Override protectedvoid configure() { ... bind(Integer.class).annotatedWith(Names.named(SERVER_BROADCAST_IN_PORT)) .toInstance(SERVER_BROADCAST_IN_PORT_VALUE); bind(Integer.class).annotatedWith(Names.named(SERVER_BROADCAST_OUT_PORT)) .toInstance(SERVER_BROADCAST_OUT_PORT_VALUE); bind(String.class).annotatedWith(Names.named(SERVER_BROADCAST_ADDRESS)) .toInstance(SERVER_BROADCAST_ADDRESS_VALUE); }
  • 12. Constructors with params Использование @Provides в модуле 5/7/2011 footer is watching you 12 @Provides Server provideServer() { Server server = newSocketServer(2011, "224.0.0.0", 2013, 2014); requestInjection(server); return server; }
  • 13. Events Использовать уже готовые событий или написать свои 5/7/2011 footer, simple as is 13 publicvoidperformShutDown(@ObservesOnDestroyEvent event) { doSomeCleanUp(); } @Inject protectedEventManagereventManager; protectedvoid buy() { eventManager.notify(MyOtherActivity.this, newMyBuyEvent() ); } protectedvoidhandleBuy(@ObservesMyBuyEventbuyEvent ) { Toast.makeToast(this, "You won't regret it!", Toast.LENGTH_LONG).show(); } //The event class can be anything you want publicclassMyBuyEvent { ... }
  • 14. Views Устранение лишнего,повторяющегося от активити к активити нудного тупого обезьяньего кодаfindViewById(R.id.damn_view_id) в onCreate() 5/7/2011 cool footer is not a crime 14 @InjectView(R.id.server_search_button_panel)ViewSwitchersearchButtonSwitcher; @InjectView(R.id.server_selector)Spinner serverSelector; @InjectView(R.id.server_search_button) Button searchButton; @InjectView(R.id.client_music_mode_button) Button musicModuleButton;
  • 15. Logging RoboGuice'sLn logger Отличный формат вызова Автоматическое отключение debug и verbose логов при release-ой сборке В тэге лога сам пишет класс и номер строки кода Можно легко переопределить формат отображения и перенаправить вывод лога в файл 5/7/2011 we footers hate each other 15 Ln.d("text"); Ln.d("formatted %s", "text"); Ln.d(exception, "reason %s", "text");
  • 16. Спасибо за внимание Презентацию подготовил Шауберт Александр shaubert.alexander@gmail.com Специально для Android May Days 2011 5/7/2011 and who will say thanks to footer 16

Editor's Notes

  1. OnActivityResultEventOnConfigurationChangedEventOnContentChangedEventOnContentViewAvailableEventOnCreateEventOnDestroyEventOnNewIntentEventOnPauseEventOnRestartEventOnResumeEventOnStartEventOnStopEvent