Весна не использует шаблон прототипа, он использует отражение. Плюс, чтобы использовать 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 вы получите новый экземпляр с теми же свойствами. Это больше, чем просто вызов конструктора, потому что вы получите бит со всеми зависимыми проводниками и другими свойствами, поэтому в некотором смысле это прототип. Или, по крайней мере, это очень хорошо подходит для этой концепции.
Я начну с того, что это должно было предложено как два отдельных вопроса. Для вашего первого - я не вырыл в [исходный код] (https://github.com/spring-projects/spring-framework), но я был бы очень удивлен, если он действительно использует шаблон прототипа. Для вашего второго quesiton: http://en.wikipedia.org/wiki/Prototype_pattern#Java_Example – Floegipoky