Разделы презентаций


Патерн (принцип) IOC & DI

Содержание

IoCSpring Framework

Слайды и текст этой презентации

Слайд 1Патерн (принцип) IOC&DI
2008-2012

Патерн (принцип) IOC&DI2008-2012

Слайд 2IoC
Spring Framework

IoCSpring Framework

Слайд 3IoC
Spring Framework

IoCSpring Framework

Слайд 4IoC
Spring Framework

IoCSpring Framework

Слайд 5IoC
IoC Container – ядро Spring Framework
Патерн (принцип) IOC & DI

— Inversion of Control (IoC) and Dependency Injection (DI)


IoC контейнери
Патерн DI

IoCIoC Container – ядро Spring FrameworkПатерн (принцип) IOC & DI  — 	Inversion of Control (IoC) and

Слайд 6IoC
До залежності класів ... Динаміка ...
public class Class1
{
public

Class2 theClass2 = new Class2() ;
public Class3 theClass3

= new Class3() ;
public Class1()
{
}
}

Додається до коду, згенеро-ваного за діаграмою класів

Створення об'єктів

IoCДо залежності класів ... Динаміка ...public class Class1 {  public Class2 theClass2 = new Class2() ;

Слайд 7IoC
Патерн IOC&DI на прикладі

IoCПатерн IOC&DI на прикладі

Слайд 8IoC
Патерн IOC&DI на прикладі (1/4)
package com.kvf.demo;
public interface IGreeting {
void

printGreeting();
}
package com.kvf.demo;
import com.kvf.demo.IGreeting;
public class Hi implements IGreeting{
public void printGreeting()

{
System.out.println("Hi!");
}
}

package com.kvf.demo;
import com.kvf.demo.IGreeting;
public class Hello implements IGreeting{
public void printGreeting() {
System.out.println("Hello!");
}
}

class Class1 - ?

Задача: передбачити для класу Class1 (у якому використовується вітання printGreeting) можливість заміни об'єкту типу Hi на об'єкт типу Hello, забезпечуючи при тому незмінність коду Class1.

Залежність

?

“Близькі” класи

IoCПатерн IOC&DI на прикладі (1/4)package com.kvf.demo;public interface IGreeting { void printGreeting();}package com.kvf.demo;import com.kvf.demo.IGreeting;public class Hi implements IGreeting{

Слайд 9IoC
Патерн IOC&DI на прикладі (2/4)
package com.kvf.demo;
import com.kvf.demo.*;
public class Class1 {

private IGreeting greeting = new Hi();
public void foo()

{
greeting.printGreeting();
}
}

private IGreeting greeting = new Hello ();

Традиційний прийом із викорис-танням для об'єктів привітання методу printGreeting()

Class1 - звична версія. (Не підходить!)

Заміна коду!?

IoCПатерн IOC&DI на прикладі (2/4)package com.kvf.demo;import com.kvf.demo.*;public class Class1 { private IGreeting greeting = new Hi(); public

Слайд 10IoC
Патерн IOC&DI на прикладі (3/4)
package com.kvf.demo;
import com.kvf.demo.IGreeting;
public class Class1a {

private IGreeting greeting;
public void setGreeting(
IGreeting greeting)

{
this.greeting = greeting;
}
public void foo() {
greeting.printGreeting();
}
}

package com.kvf.demo;
import com.kvf.demo.*;
public class Super { // Runner
public static void main(String[] args) {
Class1a c = new Class1a();
c.setGreeting( new Hi () );
c.foo();
}
}

Незмінний java-код Class1a !

new Hello ()

Управління по створенню об'єктів типів Hi чи Hello “передано” (Inversion of Control ) класу Super (Runner). Запропонований код забезпечує ін'єкцію залежності (Dependency Injection ) Class1a від класу Hi чи від класу Hello відповідно.

Dependency Injection

Модифікація при пере-ході від Hi до Hello

IoCПатерн IOC&DI на прикладі (3/4)package com.kvf.demo;import com.kvf.demo.IGreeting;public class Class1a { private IGreeting greeting; public void setGreeting(

Слайд 11IoC
Патерн IOC&DI на прикладі (4/4)
Spring Core (IoC container) виконує роль,

подібну до Super, забезпечуючи створення об'єктів та їх ін'єкцію

IoCПатерн IOC&DI на прикладі (4/4)Spring Core (IoC container) виконує роль, подібну до Super, забезпечуючи створення об'єктів та

Слайд 12IoC
IoC Container та патерн IOC&DI
Патерн (принцип)
Inversion of Control (IoC) and

Dependency Injection (DI)
Часто один з подібної пари класів є тестовим
Засоби

тестування!
IoCIoC Container та патерн IOC&DIПатерн (принцип)	Inversion of Control (IoC) and Dependency Injection (DI)Часто один з подібної пари

Слайд 13IoC
Spring: IoC + декларативний стиль. Конфігураційний файл (контексту) beans_ctx.xml
Eclipse +Spring Plugin


(ПКМ | Open Graph)
Компонентна “(дротяна) проводка” (Component Wiring)
Spring

Core бере на себе відповідальність за створення об'єктів (бінів) та їх “зв'язування” на основі ін'єкції

Дротяна модель

IoCSpring: IoC + декларативний стиль. Конфігураційний файл (контексту) beans_ctx.xmlEclipse +Spring Plugin (ПКМ | Open Graph)Компонентна “(дротяна) проводка”

Слайд 14IoC
Eclipse (проект greeting). Open Graph

IoCEclipse (проект greeting).  Open Graph

Слайд 15IoC
Конфігураційний файл (контексту) beans_ctx.xml

http://www.springframework.org/schema/beans/
spring-beans.xsd">

від класу Hi до класу Hello
IoCКонфігураційний файл (контексту) beans_ctx.xml

Слайд 16IoC
Spring-проект. Перероблений основний клас Super.java
package com.kvf.demo;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class

Super {
public static void main(String[] args) {
ApplicationContext ctx

=
new ClassPathXmlApplicationContext("beans_ctx.xml");
Class1a c = (Class1a)ctx.getBean("class1a");
System.out.println("Greeting:");
c.foo();
}
}
IoCSpring-проект. Перероблений основний клас Super.javapackage com.kvf.demo;import org.springframework.context.ApplicationContext;import   org.springframework.context.support.ClassPathXmlApplicationContext;public class Super { public static void main(String[]

Слайд 17IoC
Виконання проекту (Run as -> Java Application )

IoCВиконання проекту  (Run as -> Java Application )

Слайд 18IoC
Виконання проекту при переході від класу Hi до класу Hello
Єдине

необхідне виправлення!
Ніяка перекомпіляція не потрібна

IoCВиконання проекту при переході від  класу Hi до класу HelloЄдине необхідне виправлення!Ніяка перекомпіляція не потрібна

Слайд 19IoC
Setter Injection or Constructor Injection
package com.kvf.demo;
public class Class2 {
private

IGreeting greeting;
public void setGreeting(IGreeting greeting) {
this.greeting

= greeting;
}
public Class2 (IGreeting greeting) {
this.greeting = greeting;
}
public void foo() {
greeting.printGreeting();
}
}

public class Super2 {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans_ctx2.xml");
Class2 c = (Class2)ctx.getBean("class2");
System.out.println("Greeting:");
c.foo();
}

Конструктор із параметром

Файл Super2.java (фрагмент)

Файл Class2.java

Можна вилучити

IoCSetter Injection or Constructor Injectionpackage com.kvf.demo;public class Class2 { private IGreeting greeting; public void setGreeting(IGreeting greeting) {

Слайд 20IoC
Constructor Injection. Конфігураційний файл (контексту) beans_ctx2.xml



Файл beans_ctx2.xml (фрагмент)

IoCConstructor Injection.  Конфігураційний файл (контексту) beans_ctx2.xml

Слайд 21IoC
Виконання проекту з Constructor Injection

IoCВиконання проекту з Constructor Injection

Слайд 22IoC
Spring-проект dekor (для патерна «Декоратор»)

IoCSpring-проект dekor  (для патерна «Декоратор»)

Слайд 23IoC
Пригадаємо… Decorator. Приклад
d2 : CDecB component= d1 : CDecA component= c

: CComponent
public class Client
{ public static void Main ( string[] args

) { ConcreteComponent c = new ConcreteComponent();
ConcreteDecoratorA d1 = new ConcreteDecoratorA();
ConcreteDecoratorB d2 = new ConcreteDecoratorB();
// Link decorators
d1.SetComponent( c );
d2.SetComponent( d1 );

d2.Operation();
}
}

Додаткова гнучкість пов'язана з можливістю задавати композицію об'єктів під час виконання програми

// Link decorators
d1.SetComponent( c );
d2.SetComponent( d1 );


Ін'єкції

Створення об'єктів

IoCПригадаємо… Decorator. Прикладd2 : CDecB  component= d1 : CDecA  		component= c : CComponentpublic class Client{

Слайд 24IoC
Версії Java-класів (зі Spring-проекту)
public interface IComponent {
void operation();
}
public

class Decorator implements IComponent{
private IComponent component;
public void setComponent(IComponent

component) {
this.component = component;
}
public void operation(){
component.operation();
}
}

public class ConcreteComponent implements IComponent{
public void operation(){
System.out.println( "ConcreteComponent!");
}
}

public class DecoratorA extends Decorator {
public void operation(){
super.operation();
System.out.println("DecoratorA");
}
}

Класи DecoratorB, DecoratorC мають аналогічний вигляд

IoCВерсії Java-класів  (зі Spring-проекту)public interface IComponent {  void operation();}public class Decorator implements IComponent{ private IComponent

Слайд 25IoC
Eclipse. Spring-проект dekor з трьома конкретними декораторами. Загальний вигляд

проекту
Закладка з головним Java-класом проекту

IoCEclipse.  Spring-проект dekor з трьома конкретними декораторами. Загальний вигляд проектуЗакладка з головним Java-класом проекту

Слайд 26IoC
Конфігураційний файл (контексту) beans_ctx.xml та відповідна дротяна модель Spring




class="ttp.kvf.DecoratorA">






Декларативний стиль!

IoCКонфігураційний файл (контексту) beans_ctx.xml  та відповідна дротяна модель Spring

Слайд 27IoC
Головний Java-клас проекту
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Project {
public static

void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext(

"beans_ctx.xml");
IComponent component;
component = (IComponent)ctx.getBean("rootComponent");
component.operation();
}
}
IoCГоловний Java-клас проектуimport org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Project { public static void main(String[] args) {  ApplicationContext ctx

Слайд 28IoC
Виконання проекту
public class Decorator implements IComponent{
private IComponent component;
public

void setComponent(IComponent component) {
this.component = component;
}
public

void operation(){
component.operation();
}
}

public class DecoratorA extends Decorator {
public void operation(){
super.operation();
System.out.println("DecoratorA");
}
}

Задіяна така єдина стратегія використання декораторів: спочатку декорування здійснює внутрішній (ін'єктований) об'єкт, а потім зовнішній.

IoCВиконання проектуpublic class Decorator implements IComponent{ private IComponent component; public void setComponent(IComponent component) {  this.component =

Слайд 29IoC
Композиції об'єктів та виконання проекту
Варіанти композиції об'єктів задаються виключно

конфігураційним файлом (як наслідок, при зміні композицій проект не потребує

перекомпіляції).

Важливо!


xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">







IoC Композиції об'єктів та виконання проектуВаріанти композиції об'єктів задаються виключно конфігураційним файлом (як наслідок, при зміні композицій

Слайд 30IoC
Приклад. Spring-проект для патерна «Стратегія»

IoCПриклад. Spring-проект для патерна «Стратегія»

Слайд 31IoC
Пригадаємо… Strategy (dofactory.com)
Визначає сімейство алгоритмів, в якому інкапсулюється кожен

з них і забезпечується їх взаємозаміна. Патерн "Стратегія" дозволяє змінювати

алгоритми сімейства незалежно від клієнтів, які використовують ці алгоритми.
IoCПригадаємо…  Strategy (dofactory.com)Визначає сімейство алгоритмів, в якому інкапсулюється кожен з них і забезпечується їх взаємозаміна. Патерн

Слайд 32IoC
Пригадаємо… Strategy (dofactory.com)
class ConcreteStrategyB : Strategy
{
public

override void AlgorithmInterface()
{
Console.WriteLine(

"CalledConcreteStrategyB.”+ ”AlgorithmInterface()");
}
}

class Context
{
private Strategy _strategy;
// Constructor
public Context(Strategy strategy)
{
this._strategy = strategy;
}
public void ContextInterface()
{
_strategy.AlgorithmInterface();
}
}

class MainApp
{
static void Main()
{
Context context;
context = new Context( new ConcreteStrategyA());
context.ContextInterface();
context = new Context( new ConcreteStrategyB());
context.ContextInterface();
}
}
/// The 'Strategy' abstract class
abstract class Strategy
{
public abstract void AlgorithmInterface();
}
class ConcreteStrategyA : Strategy
{
public override void AlgorithmInterface()
{
Console.WriteLine(
"CalledConcreteStrategyA.”+ ”AlgorithmInterface()");
}
}

IoCПригадаємо…  Strategy (dofactory.com)class ConcreteStrategyB : Strategy {  public override void AlgorithmInterface()   {

Слайд 33IoC
Патерн Strategy. Версії Java-класів
public interface IStrategy {
void AlgorithmInterface();
}
package com.kvf.ttp;
import com.kvf.ttp.IStrategy;
public

class ConcreteStrategyA implements IStrategy{
public void AlgorithmInterface() {
System.out.println("StrategyA.AlgorithmInterface");

}
}

public class Context {
private IStrategy _strategy;
public Context(IStrategy strategy){
this._strategy = strategy;
}
public void ContextInterface(){
_strategy.AlgorithmInterface();
}
}

Конструктор з параметром

IoCПатерн Strategy. Версії Java-класівpublic interface IStrategy { void AlgorithmInterface();}package com.kvf.ttp;import com.kvf.ttp.IStrategy;public class ConcreteStrategyA implements IStrategy{ public void

Слайд 34IoC




Файл beans_ctx.xml

(фрагмент)
Використання Spring IoC контейнера
Виконання проекту

IoC     Файл beans_ctx.xml (фрагмент)Використання Spring IoC контейнераВиконання проекту

Слайд 35IoC
Приклад використання IoC/DI на платформі .NET

IoCПриклад використання IoC/DI  на платформі .NET

Слайд 36IoC
Використання DI у проектах ASP.NET MVC3 (1/2)
public class HomeController :

Controller
{
private ITextService service;
public HomeController(ITextService s)
{
service =

s;
}
public ActionResult Index()
{
ViewBag.Message = service.GetText (name);
return View();
}
. . .

public interface ITextService
{
string GetText(string text);
}

public class FirstTextService : ITextService
{
public string GetText(string text)
{
return String.Format( "{0}, wellcome to ASP.NET MVC!", text);
}
}

Конструктор

IoCВикористання DI у проектах ASP.NET MVC3 (1/2)public class HomeController : Controller{ private ITextService service; public HomeController(ITextService s)

Слайд 37IoC
protected void Application_Start()
{ var kernel = new StandardKernel();

kernel.Bind ().To ();
DependencyResolver.SetResolver(

new MyDependencyResolver(kernel));
}

Використання DI у проектах ASP.NET MVC3 (2/2)

Фрагменти Global.asax.cs

public class MyDependencyResolver : IDependencyResolver
{
private readonly IKernel _kernel;
public MyDependencyResolver(IKernel kernel)
{ _kernel = kernel;
}
public object GetService(Type serviceType)
{ return _kernel.TryGet(serviceType, new IParameter[0]);
}
public IEnumerable GetServices(Type serviceType)
{
return _kernel.GetAll(serviceType, new IParameter[0]);
}
}

SecondTextService

При потребі скористатись іншим сервісом

IoC protected void Application_Start() { var kernel = new StandardKernel();  kernel.Bind ().To ();  DependencyResolver.SetResolver(

Слайд 38IoC
Використання IoC на платформі .NET
Деякі відомі IOC контейнери на

платформі .NET :
Windsor;
StructureMap;
Spring.NET;
ObjectBuilder.

IoCВикористання IoC на платформі .NET Деякі відомі IOC контейнери на платформі .NET :Windsor;StructureMap;Spring.NET;ObjectBuilder.

Слайд 39IoC
Spring IoC. Ще один приклад

IoCSpring IoC. Ще один приклад

Слайд 40IoC
applicationContext.xml (фрагменти) - (1/2)

http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">









Demo-проект із Spring-документації

IoCapplicationContext.xml (фрагменти) - (1/2)

Слайд 41IoC
applicationContext.xml (фрагменти) - (2/2)















IoCapplicationContext.xml (фрагменти) - (2/2)

Обратная связь

Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика