Spring原型遵循原型设计模式

vin*_*han 6 spring design-patterns prototype-pattern

Spring将bean范围提供为"Prototype".意味着只要应用程序中需要bean,Spring容器就会创建一个新的/新的bean实例.是否遵循原型设计模式?它是否只创建一次对象并在后续请求中调用创建的对象上的clone()方法来创建新对象?

此外,如果有人可以在JDK,Spring,Hibernate或任何J2EE框架中提供原型示例.

Mat*_*scu 2

Spring不使用原型模式,它使用反射。另外,为了使用clone(),它必须以某种方式子类化一个bean,因为clone()是受保护的,所以它也不使用clone()。

这是来自的代码片段

org.springframework.beans.factory.support.SimpleInstantiationStrategy
Run Code Online (Sandbox Code Playgroud)

这里可以看到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);
                    ...
                }
                ...

    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

因此,术语“原型”用于表明每次调用 getBean 时,您都会获得一个具有相同属性的新实例。然而,这不仅仅是对构造函数的简单调用,因为您将获得一个带有所有依赖项并设置了其他属性的 bean,因此从某种意义上来说,它是一个原型。或者至少它非常符合这个概念。