首页 > 试题广场 >

下面对spring对bean的生命周期的描述,描述错误的是?

[单选题]
下面对spring对bean的生命周期的描述,描述错误的是?
  • 如果Bean类有实现org.springframework.beans.factory.BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身
  • 在spring中,singleton属性默认是false,每次指定别名取得的Bean时都会产生一个新的实例
  • 可以在Bean定义文件中使用"init-method"属性,执行到这个阶段时,就会执行initBean()方法
  • 如果Bean类有实现org.springframework.beans.factory.DisposableBean接口,则执行他的destroy()方法

scope配置

目前,scope的取值有5种取值:

在Spring 2.0之前,有singleton和prototype两种;

在Spring 2.0之后,为支持web应用的ApplicationContext,增强另外三种:request,session和global session类型,它们只实用于web程序,通常是和XmlWebApplicationContext共同使用。

singleton (单一实例)

此取值时表明容器中创建时只存在一个实例,所有引用此bean都是单一实例。如同每个国家都有一个***,国家的所有人共用此***

prototype

spring容器在进行输出prototype的bean对象时,会每次都重新生成一个新的对象给请求方,虽然这种类型的对象的实例化以及属性设置等工作都是由容器负责的,但是只要准备完毕,并且对象实例返回给请求方之后,容器就不在拥有当前对象的引用,请求方需要自己负责当前对象后继生命周期的管理工作,包括该对象的销毁。也就是说,容器每次返回请求方该对象的一个新的实例之后,就由这个对象“自生自灭”,最典型的体现就是spring与struts2进行整合时,要把action的scope改为prototype。

如同分苹果,将苹果的bean的scope属性声明为prototype,在每个人领取苹果的时候,我们都是发一个新的苹果给他,发完之后,别人爱怎么吃就怎么吃,爱什么时候吃什么时候吃,但是注意吃完要把苹果核扔到垃圾箱!对于那些不能共享使用的对象类型,应该将其定义的scope设为prototype。

在Spring 2.0之后,为支持web应用的ApplicationContext,增强另外三种:request,session和global session类型,它们只实用于web程序,通常是和XmlWebApplicationContext共同使用。

1)xml方式

进行bean的配置时,指定scope。


2)注解方式

前提为配置spring为注解配置。


编辑于 2019-08-13 08:02:04 回复(0)
更多回答

Bean的创建时会提到Spring的单例模式,就是说默认情况下Spring中定义的Bean是以单例模式创建的。如果以前了解设计模式中的单例模式的话很容易对这种说法产生先入为主的印象。事实上,Spring中的单例模式还有许多需要注意的地方。

在GoF中的单例模式是指一个ClassLoader中只存在类一个实例。

而在Spring中的单例实际上更确切的说应该是:
1.每个Spring Container中定义的Bean只存在一个实例
2.每个Bean定义只存在一个实例。

发表于 2015-06-26 16:05:29 回复(0)
在Spring中,Bean的scope默认是singleton的,也就是“单例”。
发表于 2015-08-20 09:19:56 回复(0)

创建:<bean name=”” class=”” 额外属性>

初始化:配置init-method/实现接口InitializingBean

调用:context.getBean(),进行方法的调用

销毁:配置destroy-method/实现DisposableBean接口。

发表于 2014-11-21 20:19:36 回复(0)
spring对bean的生命周期的描述:
如果Bean类有实现org.springframework.beans.factory.BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身。
可以在Bean定义文件中使用"init-method"属性,执行到这个阶段时,就会执行initBean()方法。
如果Bean类有实现org.springframework.beans.factory.DisposableBean接口,则执行他的destroy()方法。

创建:<bean name=”” class=”” 额外属性>

初始化:配置init-method/实现接口InitializingBean

调用:context.getBean(),进行方法的调用

销毁:配置destroy-method/实现DisposableBean接口。


发表于 2016-12-06 18:57:41 回复(0)
A. 通过实现 BeanFactoryAware 接口可以根据Bean的名字来获取Bean。
public class BeanFactoryHelper implements BeanFactoryAware {
    
    private static BeanFactory beanFactory;

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = beanFactory;
    }
    
    public static Object getBean(String beanName){      if(beanFactory == null){
            throw new NullPointerException("BeanFactory is null!");
        }
            return beanFactory.getBean(beanName); 
     } 
} 

B. spring 创建bean有单例模式(singleton)和原始模型模式(prototype)这两种模式。
singleton:多次调用bean实际上使用的是同一个singleton对象,而且保存了对象的状态信息。
prototype:每次调用bean的方法,prototype都会提供一个新的对象(重新new),并不保存原有的实例。
发表于 2018-03-03 18:09:54 回复(0)

<bean ...></bean>中有一个属性,叫scope,就是设定生命范围的。

Scope的作用:

可以用scope属性来限定bean的生命范围(即是在什么范围内拿到的bean是相同的)

scope属性经常使用的值有一下几种:

singleton:在整个应用的里面,拿取bean,都是同一个bean的引用(类似于单例模式);singleton也是默人的scope;

prototype:(原型模式)每次拿一个对象,都是对"原型"对象的一次拷贝;每拿一次就是通过拷贝原型来创建一个新的对象;

注意:如果bean的scope是prototype,spring不会自动的调用destory-method;

request :
 在一次HTTP请求中,一个bean定义对应一个实例;即每次HTTP请求将会创建一个新的bean实例, 它们依据某个bean定义创建而成。该作用域仅在基于web的Spring ApplicationContext情形下有效。

session: 
 在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
 
global session :
 在一个全局的HTTP Session中,一个bean定义对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在基于web的Spring ApplicationContext情形下有效。

发表于 2019-01-11 22:24:40 回复(0)
关于A选项:

传统的bean眼中的Spring是透明的。一个bean,实现BeanNameAware接口中的setBeanName方法可以将该bean在Spring中的id或name传入;实现BeanFactoryAware接口中的setFactory方法可以将配置这个bean的BeanFactory的引用传入。
编辑于 2018-08-23 09:54:40 回复(0)

Scope描述的是Spring容器如何新建Bean实例的。Spring的Scope有以下几种,通过@Scope注解来实现。

(1)Singleton:一个Spring容器中只有一个Bean的实例,此为Spring的默认配置,全容器共享一个实例。

(2)Prototype:每次调用新建一个Bean实例。

(3)Request:Web项目中,给每一个 http request 新建一个Bean实例。

(4)Session:Web项目中,给每一个 http session 新建一个Bean实例。

(5)GlobalSession:这个只在portal应用中有用,给每一个 global http session 新建一个Bean实例。

发表于 2018-02-27 22:39:18 回复(2)
Bean的默认范围是单例,如果需要多例可以在配置文件中更改scope,或添加@scope注解,值设置为prototepy
发表于 2019-11-25 14:15:33 回复(0)

默认单例

发表于 2019-08-18 09:05:54 回复(0)
D选项
在容器关闭时,如果Bean类有实现org.springframework.beans.factory.DisposableBean接口,则执行他的destroy()方法
发表于 2019-06-18 10:26:30 回复(0)
B
发表于 2019-05-01 18:27:20 回复(0)
B
发表于 2019-05-01 09:20:21 回复(0)
spring 默认单例,阿里面试都问过
发表于 2018-09-26 23:07:40 回复(0)
在Spring中,Bean的scope默认是singleton的,也就是“单例”。一个Spring容器中只有一个Bean的实例,此为Spring的默认配置,全容器共享一个实例。
发表于 2018-05-30 14:46:54 回复(0)
Spring中定义的Bean是以单例模式创建的
发表于 2018-03-17 15:38:14 回复(0)
我以为选正确的,
发表于 2018-02-01 22:04:17 回复(0)
默认单例模式
发表于 2016-11-16 15:49:48 回复(0)