Pro Spring 4: различия между версиями

Материал из Home Wiki
Перейти к навигации Перейти к поиску
(не показано 29 промежуточных версий этого же участника)
Строка 1: Строка 1:
== Жизненный цикл Spring Bean ==
[[Файл:SpringBeanLifeCycle.png|безрамки|800x800пкс]]
= Конфигурация XML =
= Конфигурация XML =
== context:component-scan ==
== context:component-scan ==
Строка 37: Строка 40:
Пример:
Пример:
  <nowiki><property name="map">
  <nowiki><property name="map">
  <map>
    <map>
    <entry key="v1">
      <entry key="v1">
      <value>Hello World!</value>
        <value>Hello World!</value>
    </entry>
      </entry>
    <entry key="refToBean">
      <entry key="refToBean">
      <ref local="localBeanId"/>
        <ref local="localBeanId"/>
    </entry>
      </entry>
  </map>
    </map>
</property></nowiki>
  </property></nowiki>


==== bean/property/set ====
==== bean/property/set ====


  <nowiki><property name="set">
  <nowiki><property name="set">
  <set>
    <set>
    <value>Hello World 1 </value>
      <value>Hello World 1 </value>
    <ref local="oracle" />
      <ref local="oracle" />
  </set>
    </set>
</property></nowiki>
  </property></nowiki>


==== bean/property/list ====
==== bean/property/list ====


  <nowiki><property name="list">
  <nowiki><property name="list">
  <list>
    <list>
    <value>Hello World!</value>
      <value>Hello World!</value>
    <ref local="localBeanId"/>
      <ref local="localBeanId"/>
  </list>
    </list>
</property></nowiki>
  </property></nowiki>


=== bean/property/props ===
==== bean/property/props ====
Дескриптор <props> позво­ляет передавать в качестве значений только String,
Дескриптор <props> позво­ляет передавать в качестве значений только String,
потому что класс Properties разрешает только значения свойств типа String.
потому что класс Properties разрешает только значения свойств типа String.
Строка 87: Строка 90:
Если есть 2 конструктора с одинаковыми именами параметров, то можно указать тип
Если есть 2 конструктора с одинаковыми именами параметров, то можно указать тип
  <constructor-arg type="int"><value>1</value><constructor-arg>
  <constructor-arg type="int"><value>1</value><constructor-arg>
=== bean/lookup-method ===
Пример Method Injection:
<nowiki> <bean id="abstractLookupBean" class="com.a.AЬstractLookupDemoBean">
    <lookup-method name="getMyHelper" bean="helper"/>
  </bean></nowiki>
=== bean/replaced-method ===
<nowiki> <bean id="replacementTarget" class="com.a.ReplacementTarget">
    <replaced-method name="formatMessage" replacer="methodReplacer">
      <arg-type>String</arg-type>
    </replaced-method>
  </bean></nowiki>
=== bean name-алиасы ===
Через name:
<nowiki><bean id="name1" name="name2 name3,name4;name5" class="java.lang.String"/></nowiki>
Через alias:
<nowiki><alias name = "namel" alias = "name6"/></nowiki>
Извлечь список псевдонимов бина можно с помощью вызова метода ApplicationContext.getAliases(String) с передачей ему любого из имен бина или его идентификатора. Этот метод возвращает в виде массива String спи­сок псевдонимов, содержащий все псевдонимы кроме указанного при вызове.
=== bean scope ===
По умолчанию Spring устанавливает атрибут scope в singleton (одиночный).
Область действия на уров­не prototype (прототип) заставляет Spring создавать новый экземпляр бина каждый раз, когда он запрашивается приложением.
Пример:
<nowiki><bean id="nonSingleton" class="java.lang.String" scope="prototype" c:_0="Sasha V."/></nowiki>
=== bean depends-on ===
В следующей конфигурации мы утверждаем, что бин по имени beanA зависит от бина
под названием beanB.
<nowiki> <bean id="beanA" class="BeanA" depends-on="beanB"/>
  <bean id="beanB" class="BeanB"/></nowiki>
Во время разработки приложений такого подхода лучше избегать; вместо это­го определяйте зависимости с помощью контрактов Setter Injection и Constructor Injection.
=== bean autowire ===
В атрибуте autowire для бина понадобится указать используемый режим автосвязывания.
Платформа Spring поддерживает следующие режимы автосвязывания: byName, ЬуТуре, constructor, default и no (автосвязывание отключено; устанавливает­ся по умолчанию).
=== bean lazy-init ===
Атрибут lazy-init устанавливается в true, что­бы информировать Spring о необходимости создания экземпляра бина только при первом его запросе, а не во время начальной загрузки.
=== bean parent ===
Наследование бинов:
<nowiki> <bean id="inheritParent" class="SimpleBean" p:name="Name1" p:age="32"/>
  <bean id="inheritChild" class="SimpleBean" parent="inheritParent" р:аgе="ЗЗ"/></nowiki>
=== bean abstract ===
В случае если определение родительского бина не должно быть доступным для поиска из ApplicationContext,
к дескриптору bean, объявляющему родительский бин, можно добавить атрибут abstract="true".
== util ==
Пространство имен util, пре­доставляемое Spring, для объявления бинов, хранящих свойства коллекций.
=== util:map ===
<nowiki> <util:map id="map" map-class = "java.util.HashMap">
    <entry key = "someValue">
      <value>Hello World!</value>
    </entry>
    <entry key="someBean">
      <ref bean="beanId"/>
    </entry>
  </util:map></nowiki>
=== util:properties ===
<nowiki> <util:properties id="props">
    <prop key="firstName">Sasha</prop>
    <prop key = "secondName">V.</prop>
  </util:properties></nowiki>
=== util:set ===
<nowiki> <util: set id="set">
    <value>Hello World!</value>
    <ref bean = "oracle"/>
  </util: set></nowiki>
=== util:list ===
<nowiki> <util:list id="list">
    <value>Hello World!</value>
    <ref bean="oracle"/>
  </util:list></nowiki>


= Кофигурация аннотациями =
= Кофигурация аннотациями =
Строка 101: Строка 183:
== @Inject ==
== @Inject ==
В спринг аналогична автоматическому связыванию (JSR-299).
В спринг аналогична автоматическому связыванию (JSR-299).
== @Service ==
Пример - @Service("messageRenderer") указывает, что этот бин предоставляет службы,
которые могут требоваться другим бинам; в качестве параметра аннотации передается имя бина.
== @Component ==
@Component("injectSimpleConfig")
@Service является специализацией @Component, отражающей тот факт, что аннотированный класс предоставляет бизнес-службу другим уровням внутри приложения.


== @Resource ==
== @Resource ==
Пример - @Resource (name = "messageProvider") указывается для поддержки автоматического связывания. (JSR-250)
Пример - @Resource (name = "messageProvider") указывается для поддержки автоматического связывания. (JSR-250)
== @Value ==
== @Value ==
Предназначена для определения зна­чения, подлежащего внедрению.
Предназначена для определения зна­чения, подлежащего внедрению.
Строка 123: Строка 197:


Жесткое кодирование значения не является удачной идеей, т.к. его изме­нение влечет за собой перекомпиляцию программы.
Жесткое кодирование значения не является удачной идеей, т.к. его изме­нение влечет за собой перекомпиляцию программы.
== @Service ==
Пример - @Service("messageRenderer") указывает, что этот бин предоставляет службы,
которые могут требоваться другим бинам; в качестве параметра аннотации передается имя бина.
== @Component ==
@Component("injectSimpleConfig")
@Service является специализацией @Component, отражающей тот факт, что аннотированный класс предоставляет бизнес-службу другим уровням внутри приложения.
= Классы Spring =
== StopWatch ==
org.springframework.util.StopWatch - этот класс очень полезный в ситуациях, когда необходимо проводить простые оценки производительности и тестировать разрабатываемые приложения.
StopWatch stopWatch = new StopWatch();
stopWatch.start("demo");
for (int х = О; х < 100000; х++) {
  MyHelper helper = bean.getMyHelper();
  helper.doSomethingHelpful();
}
stopWatch.stop();
System. out. println ( "100000 gets took " + stopWatch. getTotalTimeMillis () + " ms");

Версия 11:55, 11 февраля 2017

Жизненный цикл Spring Bean

SpringBeanLifeCycle.png

Конфигурация XML

context:component-scan

Дескриптор <context:component-scan> сообщает Spring о необходимости сканирования кода на предмет внедряемых бинов, аннотированных с помощью @Component, @Controller, @Repository и @Service, а также поддерживающих аннотации @Autowired и @Inject в указанном пакете (и всех eгo внутренних па­ кетах). В дескрипторе <context:component-scan> можно определить множест­во пакетов, используя в качестве разделителя запятую, точку запятой или пробел. Кроме того, для более детализированного управления этот дескриптор поддержи­вает включение и исключение сканирования компонентов. Также можно указать пакет для сканирования через установку атрибута base-package. Еще можно указать исключения через context:exclude-filter.

bean

bean/property

name - Имя свойства бина value - значение (простой тип)

До версии 2.5:

ref - ссылка на другой бин по id

Применение атрибута local означает, что дескриптор ref всегда просматривает только иден­тификатор бина и никогда не принимает во внимание его псевдонимы:

<ref local="test"/>

Более того, определение бина должно существовать в том же самом ХМL-файле конфигурации.

Пример ссылки на бин (ссылка текущий, дочерний, родительский контекст)

<ref bean="newBean"/>

Пример ссылки на бин родительского контекста

<ref parent="newBean"/>

С версии 2.5: конфигурировать можно не через property, а в самом bean так:

p:<тут имя свойства>-ref="id другого бина"

или так

p:<тут имя свойства>="простое значение"

Через SpEL:

p:name = "#{injectSimpleConfig.name}"

bean/property/map

Пример:

<property name="map">
     <map>
       <entry key="v1">
         <value>Hello World!</value>
       </entry>
       <entry key="refToBean">
         <ref local="localBeanId"/>
       </entry>
     </map>
   </property>

bean/property/set

<property name="set">
     <set>
       <value>Hello World 1 </value>
       <ref local="oracle" />
     </set>
   </property>

bean/property/list

<property name="list">
     <list>
       <value>Hello World!</value>
       <ref local="localBeanId"/>
     </list>
   </property>

bean/property/props

Дескриптор <props> позво­ляет передавать в качестве значений только String, потому что класс Properties разрешает только значения свойств типа String. Пример:

<property name="props">
  <props>
    <prop key="firstName">Sasha</prop>
  <prop key="secondName">V.</prop>
  </props>
</property>

bean/constructor-arg

До версии 3.1: constructor-arg определяет Constructor Injection. Всегда лучше применять атрибут index, чтобы избежать путаницы между параметрами.

С версии 3.1: можно применять в bean выражение вида c:<свойство>=<значение> или _<digit> - как указание индекса аргумента конструктора

<bean id="message" class="java.lang.String" с:_O="message"/>

Если есть 2 конструктора с одинаковыми именами параметров, то можно указать тип

<constructor-arg type="int"><value>1</value><constructor-arg>

bean/lookup-method

Пример Method Injection:

 <bean id="abstractLookupBean" class="com.a.AЬstractLookupDemoBean">
     <lookup-method name="getMyHelper" bean="helper"/>
   </bean>

bean/replaced-method

 <bean id="replacementTarget" class="com.a.ReplacementTarget">
     <replaced-method name="formatMessage" replacer="methodReplacer">
       <arg-type>String</arg-type>
     </replaced-method>
   </bean>

bean name-алиасы

Через name:

<bean id="name1" name="name2 name3,name4;name5" class="java.lang.String"/>

Через alias:

<alias name = "namel" alias = "name6"/>

Извлечь список псевдонимов бина можно с помощью вызова метода ApplicationContext.getAliases(String) с передачей ему любого из имен бина или его идентификатора. Этот метод возвращает в виде массива String спи­сок псевдонимов, содержащий все псевдонимы кроме указанного при вызове.

bean scope

По умолчанию Spring устанавливает атрибут scope в singleton (одиночный). Область действия на уров­не prototype (прототип) заставляет Spring создавать новый экземпляр бина каждый раз, когда он запрашивается приложением. Пример:

<bean id="nonSingleton" class="java.lang.String" scope="prototype" c:_0="Sasha V."/>

bean depends-on

В следующей конфигурации мы утверждаем, что бин по имени beanA зависит от бина под названием beanB.

 <bean id="beanA" class="BeanA" depends-on="beanB"/>
   <bean id="beanB" class="BeanB"/>

Во время разработки приложений такого подхода лучше избегать; вместо это­го определяйте зависимости с помощью контрактов Setter Injection и Constructor Injection.

bean autowire

В атрибуте autowire для бина понадобится указать используемый режим автосвязывания. Платформа Spring поддерживает следующие режимы автосвязывания: byName, ЬуТуре, constructor, default и no (автосвязывание отключено; устанавливает­ся по умолчанию).

bean lazy-init

Атрибут lazy-init устанавливается в true, что­бы информировать Spring о необходимости создания экземпляра бина только при первом его запросе, а не во время начальной загрузки.

bean parent

Наследование бинов:

 <bean id="inheritParent" class="SimpleBean" p:name="Name1" p:age="32"/>
   <bean id="inheritChild" class="SimpleBean" parent="inheritParent" р:аgе="ЗЗ"/>

bean abstract

В случае если определение родительского бина не должно быть доступным для поиска из ApplicationContext, к дескриптору bean, объявляющему родительский бин, можно добавить атрибут abstract="true".

util

Пространство имен util, пре­доставляемое Spring, для объявления бинов, хранящих свойства коллекций.

util:map

 <util:map id="map" map-class = "java.util.HashMap">
     <entry key = "someValue">
       <value>Hello World!</value>
     </entry>
     <entry key="someBean">
       <ref bean="beanId"/>
     </entry>
   </util:map>

util:properties

 <util:properties id="props">
     <prop key="firstName">Sasha</prop>
     <prop key = "secondName">V.</prop>
   </util:properties>

util:set

 <util: set id="set">
     <value>Hello World!</value>
     <ref bean = "oracle"/>
   </util: set>

util:list

 <util:list id="list">
     <value>Hello World!</value>
     <ref bean="oracle"/>
   </util:list>

Кофигурация аннотациями

@Autowired

Если указано на setter, то происходит автоматическое связывание.

Если указано на construcor, то происходит автоматическая передача параметра, пример:

@Autowired
public NewConstructor (@Value ( "message") String message) {
    this.message = message;
}

Аннотация @Autowired может быть применена только к одному из мето­дов конструкторов.

@Inject

В спринг аналогична автоматическому связыванию (JSR-299).

@Resource

Пример - @Resource (name = "messageProvider") указывается для поддержки автоматического связывания. (JSR-250)

@Value

Предназначена для определения зна­чения, подлежащего внедрению. Свойства:

@Value("32")
private int age;

Через SpEL:

@Value("#{injectSimpleConfig.name}")


Жесткое кодирование значения не является удачной идеей, т.к. его изме­нение влечет за собой перекомпиляцию программы.

@Service

Пример - @Service("messageRenderer") указывает, что этот бин предоставляет службы, которые могут требоваться другим бинам; в качестве параметра аннотации передается имя бина.

@Component

@Component("injectSimpleConfig") @Service является специализацией @Component, отражающей тот факт, что аннотированный класс предоставляет бизнес-службу другим уровням внутри приложения.

Классы Spring

StopWatch

org.springframework.util.StopWatch - этот класс очень полезный в ситуациях, когда необходимо проводить простые оценки производительности и тестировать разрабатываемые приложения.

StopWatch stopWatch = new StopWatch();
stopWatch.start("demo");
for (int х = О; х < 100000; х++) {
  MyHelper helper = bean.getMyHelper();
  helper.doSomethingHelpful();
}
stopWatch.stop();
System. out. println ( "100000 gets took " + stopWatch. getTotalTimeMillis () + " ms");