生命週期回呼攔截器


您可以直接在Bean上定義生命週期回呼方法,請參考:

若您要在生命週期回呼中進一些與商務行為無關的服務,如日誌等,則可以在攔截器類別上定義,您可以在Session Bean與Message-Driven Bean上攔截的生命週期事件有PostConstruct、PreDestroy,所以可以在攔截器上使用@PostConstruct、@PreDestroy標註回呼方法,例如為 攔截器類別 的範例加上@PostConstruct標註:
  • LogInterceptor.java
package onlyfun.caterpillar;

import java.util.logging.*;
import javax.annotation.PostConstruct;
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;

public class LogInterceptor {
@PostConstruct
public void initialize(InvocationContext context) {
Logger.getLogger(HelloBeanImpl.class.getName())
.log(Level.INFO, "我生出來了....XD");
context.proceed();
}

@AroundInvoke
public Object logHello(InvocationContext context) throws Exception {
String methodName = context.getMethod().getName();
String message = (String) context.getParameters()[0];

StringBuilder builder = new StringBuilder();
builder.append("Method:");
builder.append(methodName);
builder.append("\nMessage: ");
builder.append(message);

try {
return context.proceed();
} finally {
Logger.getLogger(HelloBeanImpl.class.getName())
.log(Level.INFO, builder.toString());
}
}
}

與在Bean上直接定義生命週期回呼不同的是,攔截器生命週期回呼方法上必須有InvocationContext型態的參數,由於Bean上也可能定義 自己的生命週期回呼方法,所以在攔截器上的生命週期回呼中,呼叫InvocationContext的proceed()是必要的,這讓下一個攔截器上的生命週期回呼與Bean生命週期回呼可以執行。

如果是要套用在Stateful Session Bean上的攔截器,則還可以使用@PrePassivate、@PostActivate來標註。

若必要,您可以使用多個標註來標示同一個方法,例如:
...
@PostConstruct
@PreDestroy
public void callbackMethod(InvocationContext context) {
    ....
}