CDI进阶第二步 自定义注解拦截器
上一步讲到了拦截器,我们的配置是这样的,加注解@Interceptors({Interceptor1.class,...})。这样确实烦啊。
幸好J2EE提供了这样一种机制,自定义注解。
写起来就是这样的,比如自定义的注解为@Hello,就可以直接在类上加@Hello注解。在类上加注解是拦截所有方法,只在方法上加,就仅仅会拦截这一个方法。
自定义注解,需要了解的技术点很少
1 @InterceptorBinding注解,这个注解是加在你的自定义注解上的。
2 beans.xml配置文件,这个配置文件位于WEB项目的WEB-INF下面。
首先看看自定义注解的代码。
package com.rschy.cdiannotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.interceptor.InterceptorBinding;
@Inherited
@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
public @interface Hello {
}
可以看到在自定义注解中,并不能看到你的自定义注解绑定了哪个拦截器。
所以说还需要配置,在看看拦截器的代码
package com.rschy.cdiannotation;
import javax.interceptor.AroundInvoke;
import javax.interceptor.Interceptor;
import javax.interceptor.InvocationContext;
@Hello
@Interceptor
public class HelloInterceptor {
@AroundInvoke
public Object process(InvocationContext context) {
try {
return "Hello, " + context.proceed();
} catch (Exception e) {
return null;
}
}
}
可以看到这个拦截器上面加了注解,貌似是和我们自定义的注解绑定起来了。然并卵。It doesn’t work. 还需要在Beans.xml中进行配置。
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<interceptors>
<class>com.rschy.cdiannotation.HelloInterceptor</class>
</interceptors>
</beans>
到了这一步就真正可以自由使用自定义注解了。
package com.rschy.cdiannotation;
import javax.enterprise.context.RequestScoped;
@RequestScoped
@Hello
public class HelloBean {
public String greeting(){
return "world!";
}
}
最后我们在servlet中调用它。
package com.rschy.cdiannotation;
import java.io.IOException;
import javax.inject.Inject;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/hello.html")
public class HelloServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Inject
private HelloBean helloBean;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().append(helloBean.greeting());
}
}
运行一下,可以看到预期的结果了: