模板就是利用现有的注解去开发新的注解。
比如一个类上面加了太多注解,很烦,这时候可以合并为一个注解。
比如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作用域的对象了。