CDI进阶第二步 自定义注解拦截器

CDI进阶第二步 自定义注解拦截器

上一步讲到了拦截器,我们的配置是这样的,加注解@Interceptors({Interceptor1.class,...})。这样确实烦啊。

幸好J2EE提供了这样一种机制,自定义注解。

写起来就是这样的,比如自定义的注解为@Hello,就可以直接在类上加@Hello注解。在类上加注解是拦截所有方法,只在方法上加,就仅仅会拦截这一个方法。

自定义注解,需要了解的技术点很少

@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 respthrows ServletException, IOException {

resp.getWriter().append(helloBean.greeting());

}

 

}

运行一下,可以看到预期的结果了:

 

CDI进阶第二步 自定义注解拦截器_第1张图片

你可能感兴趣的:(bean,技术,CDI,对象,J2EE)