2014-10-28 4 views
4

Весна обеспечивает бобовую область как «прототип». Когда всякий раз, когда в приложении требуется компонент, контейнер Spring создает новый/новый экземпляр компонента. Это также шаблон прототипа дизайна? Создает ли объект только один раз и в последующем запросе вызывает метод clone() на созданном объекте для создания нового объекта?Весенний прототип следующего шаблона проектирования прототипа

Также, если кто-то может предоставить пример прототипа в JDK, Spring, Hibernate или любой системе J2EE.

+0

Я начну с того, что это должно было предложено как два отдельных вопроса. Для вашего первого - я не вырыл в [исходный код] (https://github.com/spring-projects/spring-framework), но я был бы очень удивлен, если он действительно использует шаблон прототипа. Для вашего второго quesiton: http://en.wikipedia.org/wiki/Prototype_pattern#Java_Example – Floegipoky

ответ

0

Весна не использует шаблон прототипа, он использует отражение. Плюс, чтобы использовать clone(), он должен был как-то подклассифицировать компонент, так как clone() защищен, поэтому он не использует clone().

Вот фрагмент кода из

org.springframework.beans.factory.support.SimpleInstantiationStrategy 

, где вы можете увидеть использование метода отражения java.lang.reflect.Constructor и java.lang.Class:

public Object instantiate(RootBeanDefinition beanDefinition, String beanName, BeanFactory owner) { 

    if (beanDefinition.getMethodOverrides().isEmpty()) { 
     Constructor<?> constructorToUse; 
     synchronized (beanDefinition.constructorArgumentLock) { 
      constructorToUse = (Constructor<?>) beanDefinition.resolvedConstructorOrFactoryMethod; 
        ... 
         constructorToUse = clazz.getDeclaredConstructor((Class[]) null); 
        ... 
       } 
       ... 

    } 
    ... 
} 

Так термин prototype используется, чтобы предположить, что при каждом вызове getBean вы получите новый экземпляр с теми же свойствами. Это больше, чем просто вызов конструктора, потому что вы получите бит со всеми зависимыми проводниками и другими свойствами, поэтому в некотором смысле это прототип. Или, по крайней мере, это очень хорошо подходит для этой концепции.

0

я не копал в исходный код Spring, но я думаю, что фасоль с prototype рамки весной не создаются с помощью clone() метод, поскольку он не является обязательным для реализации интерфейса Cloneable для этих бобов.

Более того, предположим, что они создают их, используя clone(). Тогда было бы опасно, если кто-то ожидает глубокую копию вместо мелкой копии.

Вы всегда можете проверить и найти ответ.

1

Весна не использует клонирование для создания экземпляров с прототипом.

Ниже приведен фрагмент кода взят из AbstractBeanFactory.doGetBean() Функция:

// Create bean instance. 
if (mbd.isSingleton()) { 
    sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() { 
     @Override 
     public Object getObject() throws BeansException { 
      try { 
       return createBean(beanName, mbd, args); 
      } 
      catch (BeansException ex) { 
       // Explicitly remove instance from singleton cache: It might have been put there 
       // eagerly by the creation process, to allow for circular reference resolution. 
       // Also remove any beans that received a temporary reference to the bean. 
       destroySingleton(beanName); 
       throw ex; 
      } 
     } 
    }); 
    bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd); 
} 

else if (mbd.isPrototype()) { 
    // It's a prototype -> create a new instance. 
    Object prototypeInstance = null; 
    try { 
     beforePrototypeCreation(beanName); 
     prototypeInstance = createBean(beanName, mbd, args); 
    } 
    finally { 
     afterPrototypeCreation(beanName); 
    } 
    bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd); 
} 

createBean вызов метода сводится к тому, код ниже:

BeanUtils.instantiateClass(constructorToUse); 
0

No. Spring областях действия, такие как прототипа или singletone не следует строго шаблонам проектирования. Именование областей было использовано для интуитивного представления контейнера поведения.

Таким образом, у вас может быть шаблон «singleton» внутри контейнера и создать другой объект за пределами контейнера. Аналогично шаблону «прототип» не нужно реализовывать функциональность «клонировать».

Вы можете захотеть взглянуть на эту ссылку, а также:
Singleton design pattern vs Singleton beans in Spring container

Более сложные объяснения здесь:
https://springframework.guru/gang-of-four-design-patterns/prototype-pattern/

Смежные вопросы