CDI技术第五步,选择注入的实现类

来源:互联网 发布:mac 创建快捷方式 编辑:程序博客网 时间:2024/05/16 08:35

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!");

}

 

}

在浏览器看一看

 

可以看到,成功地使用了法语的实现类。

但是这样过于麻烦了啊。假如我有多个实现类呢?

对于这个问题可以用自定义注解来做,那么请看下一章。

 

1 0