CDI技术第十步 给Bean取名字
Spring可以给Bean取名字,EJB也可以。那么我们的CDI可以吗?
答案肯定是可以的!
核心注解是@Named
加在类上,可以指定名字,也可以不指定。如果不指定,默认名字就是类名首字母小写。
我们可以写个例子,一个接口,两个实现类。
package com.rschy.cdiname;
public interface GreetingService {
CharSequence greeting();
}
英语实现类
package com.rschy.cdiname;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
@RequestScoped
@Named
public class EnglishGreeting implements GreetingService {
@Override
public CharSequence greeting() {
return "Hello, world!";
}
}
法语实现类
package com.rschy.cdiname;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
@RequestScoped
@Named
public class FrenchGreeting implements GreetingService {
@Override
public CharSequence greeting() {
return "Bonjour, tout le monde!";
}
}
然后是我们的servlet。
package com.rschy.cdiname;
import java.io.IOException;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/greeting.html")
public class GreetingServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Inject()
@Named("frenchGreeting")
private GreetingService service;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().append(service.greeting());
}
}
这里使用了@Named注解来指定使用法语的实现。
运行结果:
@Named注解可以给Bean取任何名字,当然有些特殊字符还是不允许的。有兴趣的开发人员可以自己去试一试。