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