1. 程式人生 > 程式設計 >Spring註解@Scope原理及用法解析

Spring註解@Scope原理及用法解析

主要從以下幾方面來介紹一下@Scope註解

  • @Scope註解是什麼
  • @Scope註解怎麼使用
  • @Scope註解的使用場景

1,@Scope註解是什麼

@Scope註解是springIoc容器中的一個作用域,在 Spring IoC 容器中具有以下幾種作用域:基本作用域singleton(單例)、prototype(多例),Web 作用域(reqeust、session、globalsession),自定義作用域

a.singleton單例模式 -- 全域性有且僅有一個例項
b.prototype原型模式 -- 每次獲取Bean的時候會有一個新的例項
c.request -- request表示該針對每一次HTTP請求都會產生一個新的bean,同時該bean僅在當前HTTP request內有效

d.session -- session作用域表示該針對每一次HTTP請求都會產生一個新的bean,同時該bean僅在當前HTTP session內有效
e.globalsession -- global session作用域類似於標準的HTTP Session作用域,不過它僅僅在基於portlet的web應用中才有意義

2,@Scope註解怎麼使用

直接在bean物件方法上增加@Scope註解就可以如下:

/**
   * 定義一個bean物件
   * @return
   */
  @Scope
  @Bean(value="user0",name="user0",initMethod="initUser",destroyMethod="destroyUser")
  public User getUser(){
    System.out.println("建立user例項");
    return new User("張三",26);
  }

@Scope註解預設的singleton例項,singleton例項的意思不管你使用多少次在springIOC容器中只會存在一個例項,演示如下只打印了一次建立例項:

AnnotationConfigApplicationContext applicationContext2 = new AnnotationConfigApplicationContext(MainConfig.class);
User bean2 = applicationContext2.getBean(User.class);
System.out.println("例項1 === "+bean2);
User bean3 = applicationContext2.getBean(User.class);

System.out.println("例項2 === "+bean3);

建立user例項
例項1 === User [userName=張三,age=26]
例項2 === User [userName=張三,age=26]

接下來把例項型別改為prototype如下:

@Scope(value="prototype")

執行結果如下:

建立user例項
例項1 === User [userName=張三,age=26]
建立user例項
例項2 === User [userName=張三,age=26]

注:這邊只演示了我們常用的兩種作用域,其他的大家可以下去自己試試

3,@Scope註解的使用場景

幾乎90%以上的業務使用singleton單例項就可以,所以spring預設的型別也是singleton,singleton雖然保證了全域性是一個例項,對效能有所提高,但是如果例項中有非靜態變數時,會導致執行緒安全問題,共享資源的競爭

當設定為prototype時:每次連線請求,都會生成一個bean例項,也會導致一個問題,當請求數越多,效能會降低,因為建立的例項,導致GC頻繁,gc時長增加

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。