CDI技术第六步:自定义选择器注解

CDI技术第六步,使用自定义注解来选择实现类

我在上一篇博文中提到了如果要换实现类会非常麻烦,改注解并不是一件工作量低的活。

那么我们就用自定义注解来实现吧。

我们假设有这样一个应用,接口是提供汽车,实现类有两个:宝马与迷你。

然后我们通过这种方式,自由地切换:

@Inject

@BMW

private CarService service;

当加上宝马注解时就能获取到宝马,加上迷你注解时就是迷你了。

废话不多说,开始上代码。

编写注解

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 respthrows ServletException, IOException {

resp.getWriter().append("You got a ").append(service.getCar()).append(".");

}

 

 

}

运行效果:

CDI技术第六步:自定义选择器注解_第1张图片 

你可能感兴趣的:(工作,技术,CDI,J2EE,应用)