CDI进阶第九步 模板注解

模板就是利用现有的注解去开发新的注解。

比如一个类上面加了太多注解,很烦,这时候可以合并为一个注解。

比如CDI自带的@Model注解,其实就是合并了@RequestScoped注解和@Named注解

那么我们也可以定义一个注解来合并@SessionScoped@Named

其实开发步骤很简单

在你的自定义注解上加上@Stereotype注解,然后在这个注解上加上你要合并的注解。

比如我把@SessionScoped@Named合并一下,自己开发一个注解,如以下代码:

package com.rschy.cdistere;
 
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
 
import javax.enterprise.context.SessionScoped;
import javax.enterprise.inject.Stereotype;
import javax.inject.Named;
 
@Named
@SessionScoped
@Documented
@Stereotype
@Target({ TYPE, METHOD, FIELD })
@Retention(RUNTIME)
public @interface SessionModel {
}

然后就用起这个自定义注解啦

package com.rschy.cdistere;
 
import java.io.Serializable;
 
@SessionModel
public class HelloBean implements Serializable{
private static final long serialVersionUID = 1L;
 
	public String say(){
		return "HELLO WORLD!";
	}
}
写个简单的 servlet 调用一下

package com.rschy.cdistere;
 
 
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 bean;
 
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.getWriter().append(bean.toString());
	}
 
}

在浏览器试了下,无论怎么刷新都是同样的结果。这说明就是session作用域的对象了。

 CDI进阶第九步 模板注解_第1张图片

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