一、知识储备
在这之前需要了解CDI的组件注入思想,比如@Inject和@Qualifier注解。
二、Alternative概念讲解
Alternative中文释义“可替代的,备选的”。在CDI中的作用如下:
使用Alternative注解向容器声明该组件是一个备用组件,默认暂时不启用,即所谓的“备胎”之意。
2.1 使用场景:
比如某一个接口有不同的实现,不同的场景下会使用不同的实现,也就意味着需要注入不同的组件,为了避免代码的大幅度修改,可以使用Alternative注解在beans.xml配置文件中添加启用声明即可。
三、Aternative使用配置
3.1 Alternative注解声明”备胎”组件
package cn.edu.sdut.softlab;
import javax.enterprise.inject.Alternative;
@Alternative //此处声明该组件为"备胎"
public class FancyGreeting implements Greeting {
public String greet(String name) {
return "Nice to meet you, " + name;
}
}
3.2 beans.xml声明启用该”备胎”组件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
<alternatives>
<class>cn.edu.sdut.softlab.FancyGreeting</class>
</alternatives>
</beans>
四、代码设计
接口:
package cn.edu.sdut.softlab;
public interface Greeting {
public String greet(String name);
}
实现类:
package cn.edu.sdut.softlab;
import javax.enterprise.inject.Alternative;
@Alternative //此处声明该组件为"备胎"
public class FancyGreeting implements Greeting {
public String greet(String name) {
return "Nice to meet you, " + name;
}
}
启用声明(在beans.xml文件中):
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
<alternatives>
<--告诉容器启用该组件-->
<class>cn.edu.sdut.softlab.FancyGreeting</class>
</alternatives>
</beans>
Controller类:
package cn.edu.sdut.softlab;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Alternative;
import javax.inject.Inject;
import javax.inject.Named;
@Named
@RequestScoped
public class GreetingController {
private String username;
@Inject
@Alternative
Greeting greeting;// 声明注入该组件
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@PostConstruct
public void init() {
System.out.println("post construct......");
}
@PreDestroy
public void destroy() {
System.out.println("pre destroy......");
}
public String sayHello() {
return fancyGreeting.greet(username);
}
}
前台页面:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui" >
<h:head>
<title>welcome to weld qualifiers demo</title>
</h:head>
<h:body>
<p style="font-size:16px"><h:outputText value="#{greetingController.sayHello()}"/></p>
<p><h:outputText value="#{greetingController.username}" id="echoName"/></p>
<h:form>
<p:inputText value="#{greetingController.username}"/>
<p:commandButton value="submit" ajax="false" update="echoName"/>
</h:form>
</h:body>
</html>
五、部署运行
使用命令
mvn clean package wildfly:deploy