CDI技术第六步,使用自定义注解来选择实现类
我在上一篇博文中提到了如果要换实现类会非常麻烦,改注解并不是一件工作量低的活。
那么我们就用自定义注解来实现吧。
我们假设有这样一个应用,接口是提供汽车,实现类有两个:宝马与迷你。
然后我们通过这种方式,自由地切换:
@Inject
@BMW
private CarService service;
当加上宝马注解时就能获取到宝马,加上迷你注解时就是迷你了。
废话不多说,开始上代码。
1 编写注解
package com.rschy.cdiselect;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.inject.Qualifier;
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER })
public @interface BMW {
}
package com.rschy.cdiselect;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.inject.Qualifier;
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER })
public @interface Mini {
}
在这两个注解中使用到的核心技术是javax.inject.Qualifier注解,这个注解是加上你自定义的注解头上,表示这个注解可以作为一个选择器来使用!
然后开始写接口与实现类
package com.rschy.cdiselect;
public interface CarService {
String getCar();
}
下面是宝马实现类
package com.rschy.cdiselect.bean;
import javax.enterprise.context.RequestScoped;
import com.rschy.cdiselect.BMW;
import com.rschy.cdiselect.CarService;
@BMW
@RequestScoped
public class BmwCarService implements CarService{
@Override
public String getCar() {
return "BMW";
}
}
接下来是迷你实现类
package com.rschy.cdiselect.bean;
import com.rschy.cdiselect.CarService;
import com.rschy.cdiselect.Mini;
@Mini
public class MiniCarService implements CarService{
@Override
public String getCar() {
return "MINI";
}
}
然后我们在servlet中试一试。
package com.rschy.cdiselect.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 com.rschy.cdiselect.BMW;
import com.rschy.cdiselect.CarService;
@WebServlet("/car.html")
public class CarServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Inject
@BMW
private CarService service;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().append("You got a ").append(service.getCar()).append(".");
}
}
运行效果: