Bean对象的作用域

Bean对象作用域虽然叫做作用域,但是和代码中的作用域有很大区别,用更易懂的话说,Bean的作用域是Spring容器在注入Bean对象时根据作用域配置来决定注入的Bean对象是共享的还是新创建的。

一、Bean对象有六种作用域。

  1. singleton(单例作用域)
    也是Bean对象的默认作用域。
    注入策略:

    在spring容器中,只有初始化一个这个Bean,注入时,所有地方都注入的这个Bean对象。

    使用范围:

    整个Spring项目中都能使用。

  2. prototype(多例作用域)
    注入策略:

    每次注入时,都创建一个Bean实例。

    使用范围:

    整个Spring项目都能使用。

  3. request(请求作用域)
    注入策略:

    每个http请求都重新创建Bean对象注入,一次http请求共享Bean

    使用范围:

    只在Spring web项目中可以使用

  4. session(会话作用域)
    注入策略:

    不同的Session创建不同Bean,相同的Session共享Bean。

    使用范围:

    只在Spring web项目中使用

  5. Application(全局作用域)
    注入策略:

    整个项目范围内,都是共享一个Bean对象。
    和singleton的区别是:singleton的Bean对象是spring容器私有的,虽然也是共享一个Bean对象,但是只局限于一个spring容器,如果一个项目有多个spring容器,各个spring容器之间还是独立的Bean对象。
    但是Application就是整个项目范围内,所有的Spring容器都共享这一个Bean。

  6. webSocket(网络长连接)
    注入策略:

    在一个Http WebSocket链接中,共享一个Bean实例

    使用范围:

    只在Spring webSocket项目中使用

二、Bean对象的作用域设置方法

在使用注解将配置Bean对象时,也添加$Scope(“作用域”)来设置每个Bean对象的作用域。
Bean对象的作用域是精确到单个的Bean的,如果不设置,就是默认singleton。
例子:

@Controller(value="User")
@Scope("prototype")
public class User {
    @PostConstruct
    public void test(){
        System.out.println("User的前置方法");
    }
    @Scope("prototype")
    @Bean(name={"users","users2"})
    public User getUser(){
        return new User();
    }
}

还可以使用全局变量来代替自己拼写作用域

@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)

你可能感兴趣的:(spring,boot)