温州建网站哪家好,网站官网建设企业,海口网站建设公司哪个好,wordpress顶部栏如何修改java ee cdiJava EE6的最大承诺之一就是简化了依赖注入的使用。 他们做到了#xff0c;使用CDI 。 CDI代表Java EE的上下文和依赖注入#xff0c;它提供了一个基础集#xff0c;用于在企业应用程序中应用依赖注入。 在CDI之前#xff0c;EJB 3还引入了依赖注入#xff0c;… java ee cdi Java EE6的最大承诺之一就是简化了依赖注入的使用。 他们做到了使用CDI 。 CDI代表Java EE的上下文和依赖注入它提供了一个基础集用于在企业应用程序中应用依赖注入。 在CDI之前EJB 3还引入了依赖注入但这有点基础。 您可以将EJB全状态或无状态注入另一个EJB或Servlet如果您的容器支持。 当然并不是每个应用程序都需要EJB的这就是CDI如此受欢迎的原因。 首先我举了这个例子。 有一个Payment接口和2个实现。 现金付款和签证付款。 我希望仍然可以使用相同的界面选择我注入的女巫付款类型 public interface Payment {void pay(BigDecimal amount);
} 这是两个实现 public class CashPaymentImpl implements Payment {private static final Logger LOGGER Logger.getLogger(CashPaymentImpl.class.toString());Overridepublic void pay(BigDecimal amount) {LOGGER.log(Level.INFO, payed {0} cash, amount.toString());}
}public class VisaPaymentImpl implements Payment {private static final Logger LOGGER Logger.getLogger(VisaPaymentImpl.class.toString());Overridepublic void pay(BigDecimal amount) {LOGGER.log(Level.INFO, payed {0} with visa, amount.toString());}
} 要注入接口我们使用Inject批注。 注释基本上按照它说的去做。 它注入一个组件该组件在您的应用程序中可用。 Inject private Payment payment; 当然您看到的消息来自一英里远这是行不通的。 该容器具有我们的Payment接口的2个实现因此他不知道要注入哪个。 类型[Payment]类型的依赖关系在注入点[[field] Inject private be.styledideas.blog.qualifier.web.PaymentBackingAction.payment]处带有限定符[Default] 因此我们需要某种限定符来指出所需的实现。 CDI提供Named批注使您可以为实现命名。 Named(cash)
public class CashPaymentImpl implements Payment {private static final Logger LOGGER Logger.getLogger(CashPaymentImpl.class.toString());Overridepublic void pay(BigDecimal amount) {LOGGER.log(Level.INFO, payed {0} cash, amount.toString());}
}Named(visa)
public class VisaPaymentImpl implements Payment {private static final Logger LOGGER Logger.getLogger(VisaPaymentImpl.class.toString());Overridepublic void pay(BigDecimal amount) {LOGGER.log(Level.INFO, payed {0} with visa, amount.toString());}
} 现在当我们更改注入代码时我们可以指定所需的实现。 Inject private Named(visa) Payment payment; 这行得通但是灵活性受到限制。 当我们想重命名Named参数时我们必须在使用它的每个地方都对其进行更改。 也没有重构支持。 使用Qualifier批注使用定制注解有更好的选择。 让我们稍微更改一下代码。 首先我们创建新的注释类型。 java.lang.annotation.Documented
java.lang.annotation.Retention(RetentionPolicy.RUNTIME)
javax.inject.Qualifier
public interface CashPayment {
}java.lang.annotation.Documented
java.lang.annotation.Retention(RetentionPolicy.RUNTIME)
javax.inject.Qualifier
public interface VisaPayment {
} 添加到注释中的Qualifier注释使容器可以发现此注释。 现在我们可以简单地将这些注释添加到我们的实现中。 CashPayment
public class CashPaymentImpl implements Payment {private static final Logger LOGGER Logger.getLogger(CashPaymentImpl.class.toString());Overridepublic void pay(BigDecimal amount) {LOGGER.log(Level.INFO, payed {0} cash, amount.toString());}
}VisaPayment
public class VisaPaymentImpl implements Payment {private static final Logger LOGGER Logger.getLogger(VisaPaymentImpl.class.toString());Overridepublic void pay(BigDecimal amount) {LOGGER.log(Level.INFO, payed {0} with visa, amount.toString());}
} 现在我们唯一要做的就是将我们的注入代码更改为 Inject private VisaPayment Payment payment; 现在当我们对限定符进行更改时我们将获得不错的编译器和重构支持。 这也为API或特定于域的语言设计增加了灵活性。 参考 Java EE6 CDI来自我们JCG合作伙伴 Jelle Victoor的 命名组件和限定词来自Styled Ideas Blog 。 相关文章 Java EE6装饰器在注入时装饰类 Java EE6事件JMS的轻量级替代品 Java EE中的配置管理 基本的EJB参考注入和查找 Java模块化方法–模块模块模块 Java EE过去现在和云7 Java教程和Android教程列表 翻译自: https://www.javacodegeeks.com/2011/10/java-ee6-cdi-named-components-and.htmljava ee cdi