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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值