@PostConstruct與@PreDestroy講解及實例

關於在spring容器初始化 bean 和銷燬前所作的操做定義方式有三種:java

  1. 經過@PostConstruct 和 @PreDestroy 方法 實現初始化和銷燬bean以前進行的操做
  2. 經過 在xml中定義init-method 和  destory-method方法
  3. 經過bean實現InitializingBean和 DisposableBean接口

Java EE 5規範開始,Servlet中增長了兩個影響Servlet生命週期的註解(Annotion);@PostConstruct和@PreDestroy。這兩個註解被用來修飾一個非靜態的void()方法 。寫法有以下兩種方式:spring

@PostConstruct
Public void someMethod() {
  .....
}

或者緩存

public @PostConstruct void someMethod(){
  .....
}

如下爲@PostConstruct的API使用說明:post

PostConstruct 註釋用於在依賴關係注入完成以後須要執行的方法上,以執行任何初始化。此方法必須在將類放入服務以前調用。支持依賴關係注入的全部類都必須支持此註釋。即便類沒有請求注入任何資源,用 PostConstruct 註釋的方法也必須被調用。只有一個方法能夠用此註釋進行註釋。應用 PostConstruct 註釋的方法必須遵照如下全部標準:該方法不得有任何參數,除非是在 EJB 攔截器 (interceptor) 的狀況下,根據 EJB 規範的定義,在這種狀況下它將帶有一個 InvocationContext 對象 ;該方法的返回類型必須爲 void;該方法不得拋出已檢查異常;應用 PostConstruct 的方法能夠是 public、protected、package private 或 private;除了應用程序客戶端以外,該方法不能是 static;該方法能夠是 final;若是該方法拋出未檢查異常,那麼不得將類放入服務中,除非是可以處理異常並可從中恢復的 EJB。this

總結爲一下幾點:spa

  • 只有一個方法可使用此註釋進行註解;
  • 被註解方法不得有任何參數;
  • 被註解方法返回值爲void;
  • 被註解方法不得拋出已檢查異常;
  • 被註解方法需是非靜態方法;
  • 此方法只會被執行一次;

這裏寫圖片描述

實例.net

UserService方法(提供緩存數據):code

package com.secbro.service;

import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * @author 二師兄
 * @date 2016/8/10
 */
@Service
public class UserService {

    public List<String> getUser(){

        List<String> list = new ArrayList<>();
        list.add("張三");
        list.add("李四");
        return list;
    }
}

BusinessService方法,經過@PostConstruct調用UserService:xml

package com.secbro.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.List;

/**
 * @author 二師兄
 * @date 2016/8/10
 */
@Service
public class BusinessService {

    @Autowired
    private UserService userService;

    private List<String> list = null;

    /**
     * 構造方法執行以後,調用此方法
     */
    @PostConstruct
    public void init(){
        System.out.println("@PostConstruct方法被調用");
        // 實例化類以前緩存得到用戶信息
        List<String> list = userService.getUser();
        this.list = list;
        if(list != null && !list.isEmpty()){
            for(String user : list){
                System.out.println("用戶:" + user);
            }
        }
    }

    public BusinessService(){
        System.out.println("構造方法被調用");
    }

    public List<String> getList() {
        return list;
    }

    public void setList(List<String> list) {
        this.list = list;
    }
}

執行結果:對象

構造方法被調用
@PostConstruct方法被調用
用戶:張三
用戶:李四
相關文章
相關標籤/搜索