🗊Методики «Inversion of Control» и «Dependency Injection». Применение в Spring. Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru) 27 июня 2008

Категория: Образование
Нажмите для полного просмотра!
Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.  Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru)  27 июня 2008, слайд №1Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.  Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru)  27 июня 2008, слайд №2Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.  Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru)  27 июня 2008, слайд №3Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.  Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru)  27 июня 2008, слайд №4Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.  Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru)  27 июня 2008, слайд №5Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.  Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru)  27 июня 2008, слайд №6Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.  Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru)  27 июня 2008, слайд №7Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.  Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru)  27 июня 2008, слайд №8Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.  Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru)  27 июня 2008, слайд №9Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.  Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru)  27 июня 2008, слайд №10Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.  Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru)  27 июня 2008, слайд №11Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.  Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru)  27 июня 2008, слайд №12Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.  Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru)  27 июня 2008, слайд №13Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.  Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru)  27 июня 2008, слайд №14Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.  Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru)  27 июня 2008, слайд №15Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.  Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru)  27 июня 2008, слайд №16Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.  Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru)  27 июня 2008, слайд №17Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.  Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru)  27 июня 2008, слайд №18Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.  Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru)  27 июня 2008, слайд №19Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.  Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru)  27 июня 2008, слайд №20Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.  Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru)  27 июня 2008, слайд №21Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.  Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru)  27 июня 2008, слайд №22Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.  Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru)  27 июня 2008, слайд №23Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.  Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru)  27 июня 2008, слайд №24Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.  Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru)  27 июня 2008, слайд №25Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.  Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru)  27 июня 2008, слайд №26Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.  Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru)  27 июня 2008, слайд №27Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.  Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru)  27 июня 2008, слайд №28Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.  Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru)  27 июня 2008, слайд №29Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.  Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru)  27 июня 2008, слайд №30

Содержание

Вы можете ознакомиться и скачать Методики «Inversion of Control» и «Dependency Injection». Применение в Spring. Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru) 27 июня 2008. Презентация содержит 30 слайдов. Презентации для любого класса можно скачать бесплатно. Если материал и наш сайт презентаций Вам понравились – поделитесь им с друзьями с помощью социальных кнопок и добавьте в закладки в своем браузере.

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


Слайд 1





Методики «Inversion of Control» и «Dependency Injection». Применение в Spring.
Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru)
27 июня 2008
Описание слайда:
Методики «Inversion of Control» и «Dependency Injection». Применение в Spring. Малышкин Фёдор (fedor.malyshkin@magnetosoft.ru) 27 июня 2008

Слайд 2





Основы. IoC.
Концепция, лежащая в основе инверсии управления, часто выражается "голливудским принципом": "Не звоните мне, я вам сам позвоню". IoC переносит ответственность за выполнение действий с кода приложения на фреймворк. 
В отношении конфигурирования это означает, что если в традиционных контейнерных архитектурах наподобие EJB, компонент может вызвать контейнер и спросить: "где объект Х, нужный мне для работы?", то в IoC сам контейнер выясняет, что компоненту нужен объект Х, и предоставляет его компоненту во время исполнения.
Описание слайда:
Основы. IoC. Концепция, лежащая в основе инверсии управления, часто выражается "голливудским принципом": "Не звоните мне, я вам сам позвоню". IoC переносит ответственность за выполнение действий с кода приложения на фреймворк. В отношении конфигурирования это означает, что если в традиционных контейнерных архитектурах наподобие EJB, компонент может вызвать контейнер и спросить: "где объект Х, нужный мне для работы?", то в IoC сам контейнер выясняет, что компоненту нужен объект Х, и предоставляет его компоненту во время исполнения.

Слайд 3





Основы. DI
В самом названии закладывается смысл – зависимости не создаются вашим кодом: они внедряются контейнером.
Контейнер, среди прочего, может подставлять свои реализации, удовлетворяющие описанным интерфейсам. Это могут быть альтернативные реализации, прокси реальных объектов или иначе сконфигурированные старые реализации.
Со стороны потребителя необходимо лишь приготовить пространство для зависимости (property).
Описание слайда:
Основы. DI В самом названии закладывается смысл – зависимости не создаются вашим кодом: они внедряются контейнером. Контейнер, среди прочего, может подставлять свои реализации, удовлетворяющие описанным интерфейсам. Это могут быть альтернативные реализации, прокси реальных объектов или иначе сконфигурированные старые реализации. Со стороны потребителя необходимо лишь приготовить пространство для зависимости (property).

Слайд 4





Зависимости.
Описание слайда:
Зависимости.

Слайд 5





Пример 1. Login Manager.
public class LoginManager 
{
  private UserList myUserList = new UserList();
  .....
  public boolean authenticateUser(String theUserName, String thePassword)
  {
    User aUser = myUserList.getUserByName(theUserName);
    return thePassword.equals(aUser.getPassword());
  }
  ....
}
Описание слайда:
Пример 1. Login Manager. public class LoginManager { private UserList myUserList = new UserList(); ..... public boolean authenticateUser(String theUserName, String thePassword) { User aUser = myUserList.getUserByName(theUserName); return thePassword.equals(aUser.getPassword()); } .... }

Слайд 6





Пример 1. Недостатки.
Если захочется каким-то образом изменить способ хранения пользователей, например, использовать базу данных или LDAP, придется переписать LoginManager, чтобы он создавал соответствующий класс для работы со списком пользователей. 
Если предположить, что класс UserList зависим от платформы, например, использует JNI или пользуется каким-либо API, специфичным для какой-то платформы, то LoginManager будет также платформенно-зависимым. 
Таким образом, из-за зависимости компонентов страдает переносимость и возможность их повторного использования.
Описание слайда:
Пример 1. Недостатки. Если захочется каким-то образом изменить способ хранения пользователей, например, использовать базу данных или LDAP, придется переписать LoginManager, чтобы он создавал соответствующий класс для работы со списком пользователей. Если предположить, что класс UserList зависим от платформы, например, использует JNI или пользуется каким-либо API, специфичным для какой-то платформы, то LoginManager будет также платформенно-зависимым. Таким образом, из-за зависимости компонентов страдает переносимость и возможность их повторного использования.

Слайд 7





Пример 1. Улучшения.
public interface UserStorage {
  User getUserByName(String theUserName);
}
public class UserList implements UserStorage { .... } 
public class LoginManager 
{
  private UserStorage myUserList = new UserList();
  .....
  public boolean authenticateUser(String theUserName, String thePassword)
  {
    User aUser = myUserList.getUserByName(theUserName);
    return thePassword.equals(aUser.getPassword());
  }
  ....
}
Описание слайда:
Пример 1. Улучшения. public interface UserStorage { User getUserByName(String theUserName); } public class UserList implements UserStorage { .... } public class LoginManager { private UserStorage myUserList = new UserList(); ..... public boolean authenticateUser(String theUserName, String thePassword) { User aUser = myUserList.getUserByName(theUserName); return thePassword.equals(aUser.getPassword()); } .... }

Слайд 8





Пример 1. UML. Начальная диаграмма классов.
Описание слайда:
Пример 1. UML. Начальная диаграмма классов.

Слайд 9





Пример 1. UML. Диаграмма классов с вынесением зависимости.
Описание слайда:
Пример 1. UML. Диаграмма классов с вынесением зависимости.

Слайд 10





Пример 1. Итоги.
Итак, мы имеем прекрасные переносимые компоненты LoginManager, UserList, JdbcUserStorage, LdapUserStorage. Не стоит думать, что мы избавились от необходимости соединять их вместе.
Описание слайда:
Пример 1. Итоги. Итак, мы имеем прекрасные переносимые компоненты LoginManager, UserList, JdbcUserStorage, LdapUserStorage. Не стоит думать, что мы избавились от необходимости соединять их вместе.

Слайд 11





Сборка.
Для использования созданных нами компонентов необходим некий класс RuntimeAssembler, который будет делать грязную работу по соединению компонентов в единую систему.
Описание слайда:
Сборка. Для использования созданных нами компонентов необходим некий класс RuntimeAssembler, который будет делать грязную работу по соединению компонентов в единую систему.

Слайд 12





Пример 2. Сборщик (Composer, Assembler).
public final class SimpleSystemAssembler 
{
  public void main(String[] args)
  {
    LoginManager aManager = new LoginManager();
    aManager.setUserStorage(new UserList());
    aManager.authenticateUser("user", "test");
  }
}
public final class ComplexSystemAssembler 
{
  public void main(String[] args)
  {
    LoginManager aManager = new LoginManager();
    aManager.setUserStorage(
      new JdbcUserStorage("jdbc:mysql:...", "mysql", "mysql"));
    aManager.authenticateUser("user", "test");
  }
}
Описание слайда:
Пример 2. Сборщик (Composer, Assembler). public final class SimpleSystemAssembler { public void main(String[] args) { LoginManager aManager = new LoginManager(); aManager.setUserStorage(new UserList()); aManager.authenticateUser("user", "test"); } } public final class ComplexSystemAssembler { public void main(String[] args) { LoginManager aManager = new LoginManager(); aManager.setUserStorage( new JdbcUserStorage("jdbc:mysql:...", "mysql", "mysql")); aManager.authenticateUser("user", "test"); } }

Слайд 13





Пример 2. UML.
Описание слайда:
Пример 2. UML.

Слайд 14





Сборка. Итоги.
RuntimeAssembler-классы не предназначены для повторного использования или наследования от них. В больших системах эти классы максимально запутаны. 
IoC-контейнеры как раз и предназначены для упрощения соединения компонентов. Все они позволяют использовать API и создавать RuntimeAssember-классы, при этом XML-конфигурация системы и RuntimeAssembler не понадобятся.
Описание слайда:
Сборка. Итоги. RuntimeAssembler-классы не предназначены для повторного использования или наследования от них. В больших системах эти классы максимально запутаны. IoC-контейнеры как раз и предназначены для упрощения соединения компонентов. Все они позволяют использовать API и создавать RuntimeAssember-классы, при этом XML-конфигурация системы и RuntimeAssembler не понадобятся.

Слайд 15





Service Locator
Альтернативой паттерну вынесения зависимости (Dependency Injection) является паттерн Service Locator. Он широко используется в J2EE. Так, ServiceLocator может инкапсулировать все JNDI-вызовы J2EE-системы или создание (получение) UserStorage-реализации в нашем примере. Основным отличием Dependency Injection и Service Locator является то, что в Service Locator для получения реализации UserStorage используется вызов объекта ServiceLocator, в то время как в Dependency Injection ассемблер создает связь автоматически.
Описание слайда:
Service Locator Альтернативой паттерну вынесения зависимости (Dependency Injection) является паттерн Service Locator. Он широко используется в J2EE. Так, ServiceLocator может инкапсулировать все JNDI-вызовы J2EE-системы или создание (получение) UserStorage-реализации в нашем примере. Основным отличием Dependency Injection и Service Locator является то, что в Service Locator для получения реализации UserStorage используется вызов объекта ServiceLocator, в то время как в Dependency Injection ассемблер создает связь автоматически.

Слайд 16





Пример 3. Service Locator
// Service Locator
public LoginManager()
{
  myUserList = ServiceLocator.getUserStorage();
}
Описание слайда:
Пример 3. Service Locator // Service Locator public LoginManager() { myUserList = ServiceLocator.getUserStorage(); }

Слайд 17





Пример 3. UML.
Описание слайда:
Пример 3. UML.

Слайд 18





Пример 3. Итоги
Очевидно, что в паттерне ServiceLocator есть зависимость между LoginManager и ServiceLocator, в то время как LoginManager не зависит от RuntimeAssembler в Dependency Injection. Каждый может выбирать один из этих IoC-паттернов, в зависимости от своих нужд и задач. 
Далее будет рассмотрен IoC-контейнер, реализованный в Spring Framework.
Описание слайда:
Пример 3. Итоги Очевидно, что в паттерне ServiceLocator есть зависимость между LoginManager и ServiceLocator, в то время как LoginManager не зависит от RuntimeAssembler в Dependency Injection. Каждый может выбирать один из этих IoC-паттернов, в зависимости от своих нужд и задач. Далее будет рассмотрен IoC-контейнер, реализованный в Spring Framework.

Слайд 19





Spring
SpringFramework Spring Framework представляет собой набор готовых решений для использования всех основных Enterpise Java технологий — JDBC, ORM, JTA, Servlets/JSP, JMX и многих других. Абстрактные классы, фабрики и бины разработаны таким образом, чтобы программисту оставалось написать только свою логику
Описание слайда:
Spring SpringFramework Spring Framework представляет собой набор готовых решений для использования всех основных Enterpise Java технологий — JDBC, ORM, JTA, Servlets/JSP, JMX и многих других. Абстрактные классы, фабрики и бины разработаны таким образом, чтобы программисту оставалось написать только свою логику

Слайд 20





Spring. Элементы.
Описание слайда:
Spring. Элементы.

Слайд 21





Пример 4. Spring Container.
XML файл контейнера может быть таким:
<beans>
	<bean id="helloWorld" class="samples.HelloWorldImpl">
		<property name="message">
			<value>Sergei</value>
		</property>
	</bean>
</beans>
Описание слайда:
Пример 4. Spring Container. XML файл контейнера может быть таким: <beans> <bean id="helloWorld" class="samples.HelloWorldImpl"> <property name="message"> <value>Sergei</value> </property> </bean> </beans>

Слайд 22





Пример 4. Spring Container.
public class HelloWorldImpl {
	private String myMessage;
	public void setMessage(String theMessage) {
		myMessage = theMessage;
	}
	public void sayMessage() {
		System.out.println("Hello world!Hello " + myMessage + "!");
	}
}
public class Application {
	public static void main(String[] args) {
		BeanFactory aBeanFactory = new XmlBeanFactory("sample-beans.xml");
		HelloWorld aHelloWorld = (HelloWorld) aBeanFactory.getBean("helloWorld");
		// выводит "Hello world!Hello Sergei!" в System.out
		aHelloWorld.sayMessage();
	}
}
Описание слайда:
Пример 4. Spring Container. public class HelloWorldImpl { private String myMessage; public void setMessage(String theMessage) { myMessage = theMessage; } public void sayMessage() { System.out.println("Hello world!Hello " + myMessage + "!"); } } public class Application { public static void main(String[] args) { BeanFactory aBeanFactory = new XmlBeanFactory("sample-beans.xml"); HelloWorld aHelloWorld = (HelloWorld) aBeanFactory.getBean("helloWorld"); // выводит "Hello world!Hello Sergei!" в System.out aHelloWorld.sayMessage(); } }

Слайд 23





Создание объектов
В приведенном примере за конструирование объекта helloWorld отвечает контейнер – атрибут class элемента bean соответствует вызову конструктора без параметров. 
Spring поддерживает широкий спектр механизмов создания объектов – вызов конструктора с параметрами или без, использование фабрик классов или фабричных методов.
Описание слайда:
Создание объектов В приведенном примере за конструирование объекта helloWorld отвечает контейнер – атрибут class элемента bean соответствует вызову конструктора без параметров. Spring поддерживает широкий спектр механизмов создания объектов – вызов конструктора с параметрами или без, использование фабрик классов или фабричных методов.

Слайд 24





Конструктор без параметра 
<bean id="helloWorld" class="sample.helloWorldImpl">
 ....
</bean>
Описание слайда:
Конструктор без параметра <bean id="helloWorld" class="sample.helloWorldImpl"> .... </bean>

Слайд 25





Конструктор с параметрами
<beans>
	<bean id="exampleBean" class="examples.ExampleBean">
		<constructor-arg>
			<ref bean="anotherExampleBean"/>
		</constructor-arg>
		<constructor-arg>
			<ref bean="yetAnotherBean"/>
		</constructor-arg>
		<constructor-arg type="int">
			<value>1</value>
		</constructor-arg>
	</bean>
	<bean id="anotherExampleBean" class="examples.AnotherBean"/>
	<bean id="yetAnotherBean" class="examples.YetAnotherBean"/>
</beans>
Описание слайда:
Конструктор с параметрами <beans> <bean id="exampleBean" class="examples.ExampleBean"> <constructor-arg> <ref bean="anotherExampleBean"/> </constructor-arg> <constructor-arg> <ref bean="yetAnotherBean"/> </constructor-arg> <constructor-arg type="int"> <value>1</value> </constructor-arg> </bean> <bean id="anotherExampleBean" class="examples.AnotherBean"/> <bean id="yetAnotherBean" class="examples.YetAnotherBean"/> </beans>

Слайд 26





Фабричный метод
<?xml version="1.0" encoding="UTF-8"?>
<beans>
	<bean id="exampleBean" class="examples.ExampleBean" factory-method="createInstance">
		<constructor-arg>
			<ref bean="anotherExampleBean"/>
		</constructor-arg>
		<constructor-arg>
			<ref bean="yetAnotherBean"/>
		</constructor-arg>
		<constructor-arg>
			<value>1</value>
		</constructor-arg>
	</bean>
	<bean id="anotherExampleBean" class="examples.AnotherBean"/>
	<bean id="yetAnotherBean" class="examples.YetAnotherBean"/>
</beans>
Описание слайда:
Фабричный метод <?xml version="1.0" encoding="UTF-8"?> <beans> <bean id="exampleBean" class="examples.ExampleBean" factory-method="createInstance"> <constructor-arg> <ref bean="anotherExampleBean"/> </constructor-arg> <constructor-arg> <ref bean="yetAnotherBean"/> </constructor-arg> <constructor-arg> <value>1</value> </constructor-arg> </bean> <bean id="anotherExampleBean" class="examples.AnotherBean"/> <bean id="yetAnotherBean" class="examples.YetAnotherBean"/> </beans>

Слайд 27





Фабрика классов
<beans>
	<bean id="exampleBean" factory-bean="factory" factory-method="createInstance">
		<constructor-arg>
			<ref bean="anotherExampleBean"/>
		</constructor-arg>
		<constructor-arg>
			<ref bean="yetAnotherBean"/>
		</constructor-arg>
		<constructor-arg>
			<value>1</value>
		</constructor-arg>
	</bean>
	<bean id="anotherExampleBean" class="examples.AnotherBean"/>
	<bean id="yetAnotherBean" class="examples.YetAnotherBean"/>
	<bean id="factory" class="examples.UserFactory"/>
</beans>
Описание слайда:
Фабрика классов <beans> <bean id="exampleBean" factory-bean="factory" factory-method="createInstance"> <constructor-arg> <ref bean="anotherExampleBean"/> </constructor-arg> <constructor-arg> <ref bean="yetAnotherBean"/> </constructor-arg> <constructor-arg> <value>1</value> </constructor-arg> </bean> <bean id="anotherExampleBean" class="examples.AnotherBean"/> <bean id="yetAnotherBean" class="examples.YetAnotherBean"/> <bean id="factory" class="examples.UserFactory"/> </beans>

Слайд 28





Установка зависимостей и свойств
Возникает вопрос: "Какие типы данных могут быть установлены при помощи элемента property?", - ответ: "Любые". 
Spring использует технологию JavaBeans для установки свойств объектов, эта технология частично используется в JSP для установки свойств типа String и примитивных типов, но в Spring она используется гораздо шире – интерфейс PropertyEditor позволяет устанавливать значения свойств любых типов. 
Поддерживаются стандартные коллекции из java.util: List, Set, Map, Properties, а также ссылки на объекты в контейнере по имени и значение null.
Описание слайда:
Установка зависимостей и свойств Возникает вопрос: "Какие типы данных могут быть установлены при помощи элемента property?", - ответ: "Любые". Spring использует технологию JavaBeans для установки свойств объектов, эта технология частично используется в JSP для установки свойств типа String и примитивных типов, но в Spring она используется гораздо шире – интерфейс PropertyEditor позволяет устанавливать значения свойств любых типов. Поддерживаются стандартные коллекции из java.util: List, Set, Map, Properties, а также ссылки на объекты в контейнере по имени и значение null.

Слайд 29





Установка зависимостей и свойств
java.util.Properties – задается элементом props, отдельные свойства добавляются при помощи вложенного элемента prop, где атрибут key задает имя свойства, а текст внутри – значение. 
java.util.Map – задается элементом map, отдельные элементы добавляются при помощи вложенного элемента entry, где атрибут key задает имя свойства, а значение – это значение внутреннего элемента. Внутренний элемент entry может представлять любой объект, в том числе и Map. 
java.util.List, java.util.Set – представляются элементами list и set соответственно. Каждый внутренний элемент представляет собой значение элемента списка (множества). 
ссылка на объект из контейнера – представляется элементом ref, причем ссылка на объект, определенный в том же файле, использует атрибут local, а в любом из конфигурационных файлов – bean. 
Значение null соответствует литералу null.
Описание слайда:
Установка зависимостей и свойств java.util.Properties – задается элементом props, отдельные свойства добавляются при помощи вложенного элемента prop, где атрибут key задает имя свойства, а текст внутри – значение. java.util.Map – задается элементом map, отдельные элементы добавляются при помощи вложенного элемента entry, где атрибут key задает имя свойства, а значение – это значение внутреннего элемента. Внутренний элемент entry может представлять любой объект, в том числе и Map. java.util.List, java.util.Set – представляются элементами list и set соответственно. Каждый внутренний элемент представляет собой значение элемента списка (множества). ссылка на объект из контейнера – представляется элементом ref, причем ссылка на объект, определенный в том же файле, использует атрибут local, а в любом из конфигурационных файлов – bean. Значение null соответствует литералу null.

Слайд 30





Итоги
Избавление от зависимости от конкретной реализации обладает следующими преимуществами:

Повышается тестируемость кода. Вместо конкретной реализации всегда можно подсунуть Mock.
При написании распределенного приложения достаточно реализовать специфичную для клиента версию контракта (интерфейса).
В том случае, когда «клиент» напрямую зависит от «другого» класса, существует большая опасность завязаться на особенности конкретной реализации «другого» класса. Таким образом, изменения в реализации «другого» могут отразится и на «клиенте», и вызвать в нем так же ряд изменений.
Описание слайда:
Итоги Избавление от зависимости от конкретной реализации обладает следующими преимуществами: Повышается тестируемость кода. Вместо конкретной реализации всегда можно подсунуть Mock. При написании распределенного приложения достаточно реализовать специфичную для клиента версию контракта (интерфейса). В том случае, когда «клиент» напрямую зависит от «другого» класса, существует большая опасность завязаться на особенности конкретной реализации «другого» класса. Таким образом, изменения в реализации «другого» могут отразится и на «клиенте», и вызвать в нем так же ряд изменений.



Похожие презентации
Mypresentation.ru
Загрузить презентацию