Экземпляры bean-объектов Spring Scoped Prototype равны - PullRequest
2 голосов
/ 20 февраля 2020

Я создал два bean-компонента, @Signleton beanA, который имеет @Prototybe beanB в качестве зависимости. Чтобы убедиться, что каждый раз, когда beanA вызывается, beanB инициализируется снова, я пометил beanB с помощью

Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE, proxyMode = ScopedProxyMode.TARGET_CLASS)

. Чтобы убедиться, что все работает нормально, я сделал тест, который проверяет, что если beanB получен два раза, Это два разных экземпляра:

@Test()
void testBean() throws IllegalAccessException {

    Field beanBField = ReflectionUtils.findField(BeanA.class, "beanB");
    ReflectionUtils.makeAccessible(beanBField);

    BeanA beanA1 = applicationContext.getBean(BeanA.class);
    System.out.println(beanA1); // my.package.BeanA@4b41e4dd
    BeanB beanB1 = (PMToJupiterMapper) beanBField.get(beanA1);
    System.out.println(beanB1); // my.package.BeanB@42463763

    BeanA beanA2 = applicationContext.getBean(BeanA.class);
    System.out.println(beanA2); // my.package.BeanA@4b41e4dd
    BeanB beanB2 = (PMToJupiterMapper) beanBField.get(beanA2);
    System.out.println(beanB2); // my.package.BeanB@59f63e24

    assertEquals(beanA1, beanA2); // Is OK as expected
    System.out.println(beanB1.equals(beanB2)); // WHY IS TRUE?
    System.out.println(beanB1 == beanB2);// WHY IS TRUE?
}

экземпляры beanA такие же, как и ожидалось, и имеют одинаковое значение ha sh. Но почему в этом случае, несмотря на то, что хэши beanB различны, равно и == между двумя экземплярами bean-компонента все еще возвращают true?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2020

При использовании прототипа области видимости новый экземпляр создается каждый раз, когда вы вызываете компонент. Как вы можете видеть в строках:

System.out.println(beanB2); // my.package.BeanB@59f63e24
System.out.println(beanB1); // my.package.BeanB@42463763

Эти два бина - два разных экземпляра. Теперь два вопроса:

  • почему beanB1.equals (beanB2) - это правда? это потому, что методы equals сравнивают содержимое объектов.
  • why (beanB1 == beanB2); правда? Я думаю, что это должно быть ложно, пожалуйста, проверьте еще раз.
0 голосов
/ 20 февраля 2020

я думаю, что они должны быть равны пружинным бобам - синглетонам

вот определение

Синглтонная область: контейнер Spring Io C создает ровно один экземпляр объекта, определенного этим бином определение. Этот единственный экземпляр хранится в кэше таких одноэлементных компонентов, и все последующие запросы и ссылки для этого именованного компонента возвращают кэшированный объект.

Область действия прототипа контейнера Spring Io C создает новый экземпляр компонента объект каждый раз, когда делается запрос для этого указанного c компонента. Как правило, используйте область прототипа для всех bean-компонентов с полным состоянием и одноэлементную область для bean-компонентов без состояния.

...