TA的每日心情 | 开心 2021-12-13 21:45 |
---|
签到天数: 15 天 [LV.4]偶尔看看III
|
CDI技术第五步,使用选择器
我们开发过程中往往会遇到这样一个场景。就是对于一个接口,我们写了多个实现类,但是毫无疑问,我们只能使用一个实现类。
那么这个怎么实现呢?
这就需要两个个注解了。
@Default注解与@Any注解
比如我写一个接口。
package cdiscope.bean;
public interface InfoService {
String info();
}
我再写三个实现类,英法两种语言的实现。
下面是英文的实现:
package cdiscope.bean;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Any;
@Any
@RequestScoped
public class EnglishInfoService implements InfoService {
@Override
public String info() {
return "Hello";
}
}
这里使用@Any注解,表示是一个备用的,优先级比较低的实现类。需要注意的是如果不加@Any注解,它默认是认为带了@Default注解的。
package cdiscope.bean;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Default;
@RequestScoped
@Default
public class FranchInfoService implements InfoService {
@Override
public String info() {
return "Bonjour";
}
}
这里加了@Default注解,表示是正在使用的方案。
最后我们写个Servlet,来试试水。
package cdiscope.web;
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;
import cdiscope.bean.InfoService;
@WebServlet("/info.HTML")
public class InfoServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Inject private InfoService service;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().append(service.info()).append(", Han Meimei!");
}
}
在浏览器看一看
可以看到,成功地使用了法语的实现类。
但是这样过于麻烦了啊。假如我有多个实现类呢?
对于这个问题可以用自定义注解来做,那么请看下一章。
|
|