CDI系列学习--Alternative注解的使用和讲解

一、知识储备

在这之前需要了解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

六、代码库

详细代码请移步:
https://github.com/GaoZiqiang/CDI-Alternative

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值