《Spring實戰》-第三章:Bean的高級裝配(4)-Bean的作用域

1、什麼是Bean的作用域?

默認情況下,Spring容器裝配的Bean都是單例的,也就是說,不管什麼情況下,在同一應用中通過Spring容器獲取的都是同一個對象,也就導致了這個對象攜帶了很多可變的屬性,有時候會很不方便。

比如:我們通過ApplicationContext先後獲取BaseBean進行設值和取值,可以看到他們是同一個對象

@Component
public class BaseBean {
    private String name="BaseBean";
}

public class ScopeTest {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ComponentConfig.class);

        //從Spring容器獲取BaseBean並進行屬性設置
        BaseBean baseBean = applicationContext.getBean(BaseBean.class);
        baseBean.setName("My Name");

        //從Spring容器獲取BaseBean並進行屬性比對
        BaseBean baseBean1 = applicationContext.getBean(BaseBean.class);
        System.out.println(baseBean.equals(baseBean1));
        System.out.println(baseBean1.getName());
    }
}

測試結果:
true
My Name

Spring中Bean的作用域分爲四種:

  • 單例( Singleton ):在整個應用中,只創建 bean 的一個實例
  • 請求( Rquest ):在 Web 應用中,爲每個請求創建一個 bean 實例
  • 會話( Session ):在 Web 應用中,爲每個會話創建一個 bean 實例
  • 原型( Prototype ):每次注入或者通過 Spring 應用上下文獲取的時候,都會創建一個新的 bean 實例。

2、如何限制Bean的作用域?

Ⅰ、在自動化配置中,我們通過@Scope結合@Component註解限制被註解Bean的作用域

如下我們將BaseBean的作用域設置爲原型作用域,即每次獲取都會重新創建一個新的BaseBean

@Component
@Scope("prototype")
public class BaseBean {
    private String name="BaseBean";
}

//執行ScopeTest測試結果如下:
false //baseBean和baseBean1不是同一個BaseBean
BaseBean

其實,Spring將Bean的作用域常量封裝在ConfigurableBeanFactory和WebApplicationContext兩個類中,其代表常量如下:

  • ConfigurableBeanFactory.SCOPE_SINGLETON ="singleton";
  • ConfigurableBeanFactory.SCOPE_PROTOTYPE ="prototype";
  • WebApplicationContext.SCOPE_SESSION = "session";
  • WebApplicationContext.SCOPE_REQUEST = "request";

Ⅱ、在JavaConfig顯式配置中,我們通過@Scope註解結合@Bean註解限制被註解Bean的作用域

@Bean
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public BaseBean baseBean{
    return new BaseBean();
}

Ⅲ、在XML顯式配置中,我們通過限制bean節點的scope屬性限制裝配bean的作用域

<bean id="baseBean" class="com.my.spring.bean.BaseBean" scope="prototype">
     <constructor-arg name="name" value="baseBeanOne"></constructor-arg>
</bean>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章