Inject injection

183
INJECT INJECTION

Transcript of Inject injection

Page 1: Inject injection

INJECT

INJECTION

Page 2: Inject injection

Юра Литвиненко

• Джавист• http://linkd.in/lytvynenko

• @surg

Page 3: Inject injection

speechat.co

Page 4: Inject injection

План

Page 5: Inject injection

План

•Проблема

Page 6: Inject injection

План

•Проблема• Внедрение DI

Page 7: Inject injection

План

•Проблема• Внедрение DI

• Трудности

Page 8: Inject injection

План

•Проблема• Внедрение DI

• Трудности •Польза

Page 9: Inject injection

План

•Проблема• Внедрение DI

• Трудности •Польза• ??????????

Page 10: Inject injection

План

•Проблема• Внедрение DI

• Трудности •Польза• ??????????

• PROFIT!

Page 11: Inject injection

Проблема

Page 12: Inject injection

Проблема: Проект

Page 13: Inject injection

Проблема: Проект

• С 2005 года

Page 14: Inject injection

Проблема: Проект

• С 2005 года

• До черта кода

Page 15: Inject injection

Проблема: Проект

• С 2005 года

• До черта кода• Много технического долга

Page 16: Inject injection

Проблема: Проект

• С 2005 года

• До черта кода• Много технического долга•Монолитный

Page 17: Inject injection

Проблема: Монолит

Page 18: Inject injection

Проблема: Монолит

Page 19: Inject injection

Проблема: Монолит

Page 20: Inject injection

Проблема: Монолит

Page 21: Inject injection

Проблема: Монолит

Page 22: Inject injection

Проблема: Монолит

Page 23: Inject injection

Проблема: Монолит

Page 24: Inject injection

Проблема: Монолит

Page 25: Inject injection

Проблема: Монолит

Page 26: Inject injection

Проблема: Монолит

Page 27: Inject injection

А душа просит...

Page 28: Inject injection

Модульность!

Page 29: Inject injection

Модульность

Page 30: Inject injection

Модульность

Page 31: Inject injection

Модульность

Page 32: Inject injection

Модульность

Page 33: Inject injection

Модульность

Page 34: Inject injection

А еще...

Page 35: Inject injection

Работа с базой

Page 36: Inject injection

Проблема: БД

void  updateSmth()  {

}

Page 37: Inject injection

Проблема: БД

void  updateSmth()  {

 IDbConnection  con  =  getConnection();

}

Page 38: Inject injection

Проблема: БД

void  updateSmth()  {

 IDbConnection  con  =  getConnection();

 try  {

     

 }  

     

}

Page 39: Inject injection

Проблема: БД

void  updateSmth()  {

 IDbConnection  con  =  getConnection();

 try  {

     //  do  stuff  with  con

 }  

     

}

Page 40: Inject injection

Проблема: БД

void  updateSmth()  {

 IDbConnection  con  =  getConnection();

 try  {

     //  do  stuff  with  con

 }  finally  {

     con.close();

}}

Page 41: Inject injection

Проблема: БД

void  updateSmth()  {

   //  do  stuff  with  con

}

Page 42: Inject injection

Проблема: БД@Transactionalvoid  updateSmth()  {

   //  do  stuff  with  con

}

Page 43: Inject injection

План

•Проблема•Внедрение DI

• Трудности • Польза• ??????????

• PROFIT!

Page 44: Inject injection

Что надеть?

Page 45: Inject injection

Что надеть?выбрать

Page 46: Inject injection

Внедрение: Выбор

• Spring

• Guice

• Pico-, nano- container

• Apache Avalon

• Apache HiveMind

Page 47: Inject injection

Внедрение: Выбор

•Spring

•Guice

• Pico-, nano- container

• Apache Avalon

• Apache HiveMind

Page 48: Inject injection

Внедрение: Выбор

vs

Page 49: Inject injection

Внедрение: Выбор

vs

Page 50: Inject injection

Внедрение: Guice

• Легковесность

Page 51: Inject injection

Внедрение: Guice

• Легковесность• Конфигурация в коде

Page 52: Inject injection

Внедрение: Guice

• Легковесность• Конфигурация в коде• Мультибиндинг

Page 53: Inject injection

Внедрение: Guice

• Легковесность• Конфигурация в коде• Мультибиндинг• Упрощенное AOP

Page 54: Inject injection

Внедрение: Guice

• Легковесность• Конфигурация в коде• Мультибиндинг• Упрощенное AOP

• RI JSR-330

Page 55: Inject injection

Guice

Page 56: Inject injection

Guice: Знакомство

Page 57: Inject injection

Guice: Знакомство

Page 58: Inject injection

Guice: Знакомство

Page 59: Inject injection

Guice: Знакомство

•Биндинг

Page 60: Inject injection

Guice: Знакомство

•Биндинг (binding)

Page 61: Inject injection

Guice: Знакомство

• Биндинг (binding) – привязка интерфейса к реализации. Конфигурация зависимостей

Page 62: Inject injection

Guice: Знакомство

• Биндинг (binding) – привязка интерфейса к реализации. Конфигурация зависимостей

•Модуль

Page 63: Inject injection

Guice: Знакомство

• Биндинг (binding) – привязка интерфейса к реализации. Конфигурация зависимостей

• Модуль – класс, в котором происходит биндинг. Строительный элемент Guice

Page 64: Inject injection

Guice: Биндинг в коде

Page 65: Inject injection

Guice: Биндинг в коде

• Вовлечен компилятор

Page 66: Inject injection

Guice: Биндинг в коде

• Вовлечен компилятор• Java

Page 67: Inject injection

Guice: Биндинг в коде

• Вовлечен компилятор• Java

• Выразительный DSL

Page 68: Inject injection

Guice: Биндинг в коде

• Вовлечен компилятор• Java

• Выразительный DSL

• Появился в Spring 3.1

Page 69: Inject injection

Guice: Биндинг в коде

Page 70: Inject injection

Guice: Биндинг в кодеbind(FlightFactory.class)

Page 71: Inject injection

Guice: Биндинг в кодеbind(FlightFactory.class)  .to(StubFlightFactory.class)

Page 72: Inject injection

Guice: Биндинг в кодеbind(FlightFactory.class)  .to(StubFlightFactory.class)

...

bind(FlightFactory.class)  

Page 73: Inject injection

Guice: Биндинг в кодеbind(FlightFactory.class)  .to(StubFlightFactory.class)

...

bind(FlightFactory.class)  .toInstance(                                  )

Page 74: Inject injection

Guice: Биндинг в кодеbind(FlightFactory.class)  .to(StubFlightFactory.class)

...

bind(FlightFactory.class)  .toInstance(flightFactoryMock)

Page 75: Inject injection

Guice: Биндинг в кодеclass  Foo  {

   ...

}

Page 76: Inject injection

Guice: Биндинг в кодеclass  Foo  {

   @Inject      FlightFactory  flightFactory;

   ...

}

Page 77: Inject injection

Guice: Multibinding

Page 78: Inject injection

Guice: Multibinding

• Коллекция в качестве зависимости

Page 79: Inject injection

Guice: Multibinding

• Коллекция в качестве зависимости• Определяется в разных модулях

Page 80: Inject injection

Guice: Multibinding

• Коллекция в качестве зависимости• Определяется в разных модулях• По сути - поддержка плагинов

Page 81: Inject injection

Guice: Multibinding

Page 82: Inject injection

Guice: MultibindingMultibinder<Service>  binder  =

           

Page 83: Inject injection

Guice: MultibindingMultibinder<Service>  binder  =    Multibinder.newSetBinder(            binder(),  Service.class);

           

Page 84: Inject injection

Guice: MultibindingMultibinder<Service>  binder  =    Multibinder.newSetBinder(            binder(),  Service.class);

binder.addBinding()            

Page 85: Inject injection

Guice: MultibindingMultibinder<Service>  binder  =    Multibinder.newSetBinder(            binder(),  Service.class);

binder.addBinding()            .to(DocumentService.class);            

Page 86: Inject injection

Guice: MultibindingMultibinder<Service>  binder  =    Multibinder.newSetBinder(            binder(),  Service.class);

binder.addBinding()            .to(DocumentService.class);...            

Page 87: Inject injection

Guice: MultibindingMultibinder<Service>  binder  =    Multibinder.newSetBinder(            binder(),  Service.class);

binder.addBinding()            .to(DocumentService.class);...binder.addBinding()

           

Page 88: Inject injection

Guice: MultibindingMultibinder<Service>  binder  =    Multibinder.newSetBinder(            binder(),  Service.class);

binder.addBinding()            .to(DocumentService.class);...binder.addBinding()            .toInstance(userService);            

Page 89: Inject injection

Guice: Multibindingpublic  class  ServiceRegistry  {

   ...

}

Page 90: Inject injection

Guice: Multibindingpublic  class  ServiceRegistry  {

   @Inject    private  Set<Service>  services;

   ...

}

Page 91: Inject injection

Guice: Ошибки

Page 92: Inject injection

Guice: Ошибки

• Ошибки сложно отследить

Page 93: Inject injection

Guice: Ошибки

• Ошибки сложно отследить• Guice подробно разъясняет

Page 94: Inject injection

Guice: Ошибки

• Ошибки сложно отследить• Guice подробно разъясняет

• ...в чем ошибка

Page 95: Inject injection

Guice: Ошибки

• Ошибки сложно отследить• Guice подробно разъясняет

• ...в чем ошибка

• ...и главное - где

Page 96: Inject injection

Например

Page 97: Inject injection

НапримерЗабыли забиндить интерфейс UserService

Page 98: Inject injection

Guice: Ошибкиpublic  class  UserManager  {

}

Page 99: Inject injection

Guice: Ошибкиpublic  class  UserManager  {

   @Inject      private  UserService  service;

   ...

}

Page 100: Inject injection

Guice: Ошибкиpublic  class  UserManager  {

   @Inject      private  UserService  service;

   ...

}

inj.getInstance(UserManager.class);

Page 101: Inject injection

Guice: ОшибкиGuice  configuration  errors:

Page 102: Inject injection

Guice: ОшибкиGuice  configuration  errors:

1)  No  implementation  for  com.UserService  was  bound.    

Page 103: Inject injection

Guice: ОшибкиGuice  configuration  errors:

1)  No  implementation  for  com.UserService  was  bound.    while  locating  com.UserService    

Page 104: Inject injection

Guice: ОшибкиGuice  configuration  errors:

1)  No  implementation  for  com.UserService  was  bound.    while  locating  com.UserService        for  field  at  com.UserManager.service(UserManager.java:17)    

Page 105: Inject injection

Guice: ОшибкиGuice  configuration  errors:

1)  No  implementation  for  com.UserService  was  bound.    while  locating  com.UserService        for  field  at  com.UserManager.service(UserManager.java:17)    while  locating  com.UserManager

Page 106: Inject injection

Guice: ОшибкиGuice  configuration  errors:

1)  No  implementation  for  com.UserService  was  bound.    while  locating  com.UserService        for  field  at  com.UserManager.service(UserManager.java:17)    while  locating  com.UserManager

1  error   at  ...

Page 107: Inject injection

Guice: ОшибкиGuice  configuration  errors:

1)  No  implementation  for  com.UserService  was  bound.    while  locating  com.UserService        for  field  at  com.UserManager.service(UserManager.java:17)    while  locating  com.UserManager

1  error   at  ...

Page 108: Inject injection

Guice: Ошибки...

com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1004)

Page 109: Inject injection

Guice: Ошибки...

com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1004)

  at  com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:961)

Page 110: Inject injection

Guice: Ошибки...

com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1004)

  at  com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:961)

  at  com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1013)

Page 111: Inject injection

Guice: Ошибки...

com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:1004)

  at  com.google.inject.internal.InjectorImpl.getProvider(InjectorImpl.java:961)

  at  com.google.inject.internal.InjectorImpl.getInstance(InjectorImpl.java:1013)

  at  com.jeeconf.Main.main(Main.java:21)

Page 112: Inject injection

Guice: И еще...

Page 113: Inject injection

Guice: А также

• Поддержка GWT (GIN)

Page 114: Inject injection

Guice: А также

• Поддержка GWT (GIN)

• Assisted Inject

Page 115: Inject injection

Guice: А также

• Поддержка GWT (GIN)

• Assisted Inject

• Поддержка TestNG

Page 116: Inject injection

Guice: А также

• Поддержка GWT (GIN)

• Assisted Inject

• Поддержка TestNG

• etc...

Page 117: Inject injection

С чего начать?

Page 118: Inject injection

ВнедрениеServlet

Page 119: Inject injection

ВнедрениеServlet

Struts Remoting

Page 120: Inject injection

ВнедрениеServlet

Struts Remoting

Managers (BO)

Page 121: Inject injection

План

• Проблема• Внедрение DI

•Трудности

•Польза• ??????????

• PROFIT!

Page 122: Inject injection

Трудности: Struts

Page 123: Inject injection

Трудности: Struts

• Action’ы и Controller’ы - синглтоны

Page 124: Inject injection

Трудности: Struts

• Action’ы и Controller’ы - синглтоны

• Hardcoded

Page 125: Inject injection

Решение: Struts

Page 126: Inject injection

Решение: Struts

• Один базовый класс

Page 127: Inject injection

Решение: Struts

• Один базовый класс• Явная инъекция в конструкторе

Page 128: Inject injection

Решение: Struts

• Один базовый класс• Явная инъекция в конструкторе• Field injection

Page 129: Inject injection

Решение: Struts

• Один базовый класс• Явная инъекция в конструкторе• Field injection

• Провайдеры

Page 130: Inject injection

Решение: Strutsinterface  Provider        {

   

}

Page 131: Inject injection

Решение: Strutsinterface  Provider<T>  {

}

Page 132: Inject injection

Решение: Strutsinterface  Provider<T>  {

   T  get();

}

Page 133: Inject injection

Решение: Strutsclass  BaseAction  extends  Action  {

}

Page 134: Inject injection

Решение: Strutsclass  BaseAction  extends  Action  {

   public  BaseAction()  {

   }

}

Page 135: Inject injection

Решение: Strutsclass  BaseAction  extends  Action  {

   public  BaseAction()  {

       Injector  injector  =  ...;

   }

}

Page 136: Inject injection

Решение: Strutsclass  BaseAction  extends  Action  {

   public  BaseAction()  {

       Injector  injector  =  ...;

       injector.injectMembers(this);

   }

}

Page 137: Inject injection

Решение: Strutsclass  MyAction  extends  BaseAction  {

}

Page 138: Inject injection

Решение: Strutsclass  MyAction  extends  BaseAction  {

   Provider<MyManager>  myManager;

}

Page 139: Inject injection

Решение: Strutsclass  MyAction  extends  BaseAction  {

   @Inject    Provider<MyManager>  myManager;

}

Page 140: Inject injection

Решение: Strutsclass  MyAction  extends  BaseAction  {

   @Inject    Provider<MyManager>  myManager;

   ...  execute(Context  context)  {

   }

}

Page 141: Inject injection

Решение: Strutsclass  MyAction  extends  BaseAction  {

   @Inject    Provider<MyManager>  myManager;

   ...  execute(Context  context)  {

       myManager.get().doSmth();

   }

}

Page 142: Inject injection

Трудности: Сервлет

Page 143: Inject injection

Трудности: Сервлет

• Сервлеты 2.0 - только в web.xml

Page 144: Inject injection

Трудности: Сервлет

• Сервлеты 2.0 - только в web.xml

• Хак: Guice servlet

Page 145: Inject injection

Трудности: Сервлет

• Сервлеты 2.0 - только в web.xml

• Хак: Guice servlet

• Stack overflow в некоторых случаях

Page 146: Inject injection

Решение: Сервлет

Page 147: Inject injection

Решение: Сервлет

• Servlet 3.0

Page 148: Inject injection

Решение: Сервлет

• Servlet 3.0

• Программная регистрация фильтров и сервлетов

Page 149: Inject injection

Решение: Сервлет

• Servlet 3.0

• Программная регистрация фильтров и сервлетов

• Свой API (близкий к Guice-Servlet)

Page 150: Inject injection

Трудности: Статика

Page 151: Inject injection

Трудности: Статика

• Большинство методов в менеджерах - статические

Page 152: Inject injection

Трудности: Статика

• Большинство методов в менеджерах - статические

• Очень плохо тестируется

Page 153: Inject injection

Трудности: Статика

• Большинство методов в менеджерах - статические

• Очень плохо тестируется• Некоторые лучше не трогать

Page 154: Inject injection

Трудности: Статика

• Большинство методов в менеджерах - статические

• Очень плохо тестируется• Некоторые лучше не трогать• Вирусность

Page 155: Inject injection

Решение: Статика

Page 156: Inject injection

Решение: Статика

• Фасады

Page 157: Inject injection

Решение: Статика

• Фасады (Да, кэп!)

Page 158: Inject injection

Решение: Статика

• Фасады• Расширение - по необходимости

(Да, кэп!)

Page 159: Inject injection

Решение: Статика

• Фасады• Расширение - по необходимости

• Более удобный API

(Да, кэп!)

Page 160: Inject injection

Решение: Статика

• Фасады• Расширение - по необходимости

• Более удобный API

• Спрятать “checked” исключения

(Да, кэп!)

Page 161: Inject injection

Решение: Статикаclass  UserManager  {

}

Page 162: Inject injection

Решение: Статикаclass  UserManager  {

   static  User  getUser(String  login)  

}

Page 163: Inject injection

Решение: Статикаclass  UserManager  {

   static  User  getUser(String  login)          throws  SQLException,        RetrieveFailedException  {  ...  }}

Page 164: Inject injection

Решение: Статикаclass  UserManager  {

   static  User  getUser(String  login)          throws  SQLException,        RetrieveFailedException  {  ...  }}

interface  UserManagerFacade  {

}

Page 165: Inject injection

Решение: Статикаclass  UserManager  {

   static  User  getUser(String  login)          throws  SQLException,        RetrieveFailedException  {  ...  }}

interface  UserManagerFacade  {

   User  getUser(String  userLogin);

}

Page 166: Inject injection

Решение: Статикаclass  UserManagerFacadeImpl  

}

Page 167: Inject injection

Решение: Статикаclass  UserManagerFacadeImpl      implements  UserManagerFacade  {

}

Page 168: Inject injection

Решение: Статикаclass  UserManagerFacadeImpl      implements  UserManagerFacade  {

   User  getUser(String  login)  {  

   }}

Page 169: Inject injection

Решение: Статикаclass  UserManagerFacadeImpl      implements  UserManagerFacade  {

   User  getUser(String  login)  {          try  {

       }                      

   }}

Page 170: Inject injection

Решение: Статикаclass  UserManagerFacadeImpl      implements  UserManagerFacade  {

   User  getUser(String  login)  {          try  {        return  UserManager.getUser(login)        }              

   }}

Page 171: Inject injection

Решение: Статикаclass  UserManagerFacadeImpl      implements  UserManagerFacade  {

   User  getUser(String  login)  {          try  {        return  UserManager.getUser(login)        }  catch(Exception  e)  {                    }

   }}

Page 172: Inject injection

Решение: Статикаclass  UserManagerFacadeImpl      implements  UserManagerFacade  {

   User  getUser(String  login)  {          try  {        return  UserManager.getUser(login)        }  catch(Exception  e)  {            //  rethrow  unchecked  exception        }

   }}

Page 173: Inject injection

не все так плохо

Page 174: Inject injection

План• Проблема

• Внедрение DI

• Трудности •Польза

• ??????????

• PROFIT!

Page 175: Inject injection

Польза

Page 176: Inject injection

Польза

•Первый шаг к модульности

Page 177: Inject injection

Польза

•Первый шаг к модульности

•Работа с БД

Page 178: Inject injection

Польза

•Первый шаг к модульности

•Работа с БД

• Код компактнее

Page 179: Inject injection

Польза

•Первый шаг к модульности

•Работа с БД

• Код компактнее• Юнит тесты

Page 180: Inject injection

Польза

•Первый шаг к модульности

•Работа с БД

• Код компактнее• Юнит тесты• Виднее избыток зависимостей

Page 181: Inject injection

?

Page 182: Inject injection

PROFIT?

• @surg

• http://speechat.co/injection

Page 183: Inject injection

Спасибо!