В весенних пакетных средах, в чем разница между 'lazy-init = true' и 'scope = step'? - PullRequest
2 голосов
/ 06 января 2012

Когда я определил бин «MethodInvokingFactory» с помощью «scope = step», я получил ошибку, что тип бина не может быть определен.Это работало нормально, когда я заменил «scope = step» на «lazy-init = true».Насколько мне известно, оба используются для позднего связывания бобов, за исключением этого одного различия.Есть ли другие различия между этими двумя способами?Кроме того, правильно ли мое использование?

Пожалуйста, дайте мне знать ваши мысли об этом.

Ответы [ 3 ]

3 голосов
/ 06 января 2012

Чтобы ответить на ваш вопрос с точки зрения низкого уровня:

lazy-init="true" означает, что bean-компонент не будет создан при создании контекста, но будет создан при обращении к нему, например, другим бобом. Я думаю, что это ясно, также из комментария @AravindA.

Боб Scoped работает по-разному. Когда контекст создается, этот bean-объект оборачивается в дополнительный прокси-объект (по умолчанию созданный CGLIB), который передается в bean-компонент, который ссылается на него (этот proxy по умолчанию одноэлементный, например общий). Таким образом, каждый раз, когда метод вызывается на прокси во время выполнения, Spring пересекает вызов, запрашивает у фабрики вернуть экземпляр компонента и вызывает метод для этого компонента. Фабрика, в свою очередь, может искать «настоящий» экземпляр компонента, например в запросе HTTP (область «запрос») или сеанс HTTP (область «сеанс») и / или при необходимости создайте новый экземпляр. Позднее создание экземпляров позволяет инициализировать bean-объект с областями видимости значениями «времени выполнения» (области действия), например, значения из HTTP-запроса / сеанса, которые явно не определены при создании контекста. В частности, bean-объекты «step» связаны с локальным потоком (помните, что шаги выполняются параллельно для разделения). Таким образом, bean-объекты scoped разыменовываются, когда вы вызываете для них метод. Наконец, можно легко нарушить эту элегантную «идеологию» Spring, вызвав любой метод в bean-объекте области сразу после того, как для него задан другой bean-компонент (например, в установщике):)

1 голос
/ 06 января 2012

область действия шага предназначена специально для позднего связывания атрибутов задания / шага , а не для позднего связывания bean-компонентов, что означает, что контекст / фабрика bean-компонента Spring улучшит пошаговые bean-объекты и ищет атрибуты для установки, например

value="#{jobParameters[input.file.name]}
1 голос
/ 06 января 2012
      One thing to understand about lazy-initialization is that even though a bean 
      definition may be marked up as being lazy-initialized, if the lazy-initialized     
      bean is the dependency of a singleton bean that is not lazy-initialized, when the
      ApplicationContext is eagerly pre-instantiating the singleton, it will have to 
      satisfy all of the singletons dependencies, one of which will be the 
      lazy-initialized bean!

      Using a scope of Step is required in order to use late binding since the bean 
      cannot actually be instantiated until the Step starts, which allows the   
      attributes to be found. Because it is not part of the Spring container by   
      default, the scope must be added explicitly, either by using the batch namespace 
      or by including a bean definition explicitly for the StepScope (but not both):

      <bean class="org.springframework.batch.core.scope.StepScope" />

Читайте здесь и здесь для получения дополнительной информации

Область действия = "шаг" не имеет ничего общего с отложенной инициализацией. Используется для позднего связывания параметров внутри « Step ».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...