1. 程式人生 > >Spring註解驅動 @Scope和@Lazy 使用說明

Spring註解驅動 @Scope和@Lazy 使用說明

最早期開發spring整合專案,太多的配置檔案開發起來效率低,目前企業採用全註解方式進行開發,本章講解@Configution 和 @Bean的配置使用,達到spring傳統的配置檔案方式

步驟一:新建立一個maven工程

步驟二:新增依賴

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.12.RELEASE</version>
</dependency>

步驟三:建立一個實體類

package com.gcxzflgl.bean;

public class User {
        private String username;
        private int age;
        public User() {
        }
        public User(String username, int age) {
            this.username = username;
            this.age = age;
        }
        public String getUsername() {
            return username;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        @Override
        public String toString() {
            return "User{" +
                    "username='" + username + '\'' +
                    ", age=" + age +
                    '}';
        }

}

步驟四:

建立一個配置類,加上@Scope作用域註解,預設是單例

package com.gcxzflgl.annotation;

import com.gcxzflgl.bean.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

@Configuration
public class MyConfiguration2 {
    @Scope
    @Bean("user")
    public User user (){
        return new User("gcx",22);
    }
}

步驟五:執行主類:

@Scope支援的型別

 singleton:單例模式,在整個Spring IoC容器中,使用singleton定義的Bean將只有一個例項

prototype:原型模式,每次通過容器的getBean方法獲取prototype定義的Bean時,都將產生一個新的Bean例項

request:對於每次HTTP請求,使用request定義的Bean都將產生一個新例項,即每次HTTP請求將會產生不同的Bean例項。只有在Web應用中使用Spring時,該作用域才有效

session:對於每次HTTP Session,使用session定義的Bean豆漿產生一個新例項。同樣只有在Web應用中使用Spring時,該作用域才有效

globalsession:每個全域性的HTTP Session,使用session定義的Bean都將產生一個新例項。典型情況下,僅在使用portlet context的時候有效。同樣只有在Web應用中使用Spring時,該作用域才有效

  其中比較常用的是singleton和prototype兩種作用域。對於singleton作用域的Bean,每次請求該Bean都將獲得相同的例項。容器負責跟蹤Bean例項的狀態,負責維護Bean例項的生命週期行為;如果一個Bean被設定成prototype作用域,程式每次請求該id的Bean,Spring都會新建一個Bean例項,然後返回給程式。在這種情況下,Spring容器僅僅使用new 關鍵字建立Bean例項,一旦建立成功,容器不在跟蹤例項,也不會維護Bean例項的狀態。

  如果不指定Bean的作用域,Spring預設使用singleton作用域。Java在建立Java例項時,需要進行記憶體申請;銷燬例項時,需要完成垃圾回收,這些工作都會導致系統開銷的增加。因此,prototype作用域Bean的建立、銷燬代價比較大。而singleton作用域的Bean例項一旦建立成功,可以重複使用。因此,除非必要,否則儘量避免將Bean被設定成prototype作用域。 

在預設的@Scope在容器初始化時建立物件放到容器中

package com.gcxzflgl.annotation;

import com.gcxzflgl.bean.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

@Configuration
public class MyConfiguration2 {

    @Scope
    @Bean("user")
    public User user (){
        System.out.println("ioc容器載入");
        return new User("gcx",22);
    }
}

執行主類,可看到在容器初始化時已經載入物件到容器中

如果@Scope是prototype,ioc容器不會立即將物件載入到容器中,必須在呼叫這個bean時才會載入到容器

@Lazy懶載入用於單例項,在MyConfiguration2中將@Scope去掉,加上@Lazy註解

執行主類後,只有在呼叫時才會被載入到,並不會在預設的單例項啟動後立即載入