Tag: cdi

Javadependency injection:XML或注释

注释变得stream行。 Spring-3支持它们。 CDI很大程度上依赖于他们(我不能使用CDI和注释,对不对?) 我的问题是为什么 ? 我听到几个问题: “它有助于摆脱XML”。 但是,什么是坏的XML? 依赖性本质上是声明性的,而XML对于声明是非常好的(对于命令式编程来说非常糟糕)。 有了好的IDE(比如想法),编辑和validationXML非常容易,不是吗? “在许多情况下,每个接口只有一个实现”。 那不是真的! 几乎我的系统中的所有接口都有模拟testing的实现。 任何其他问题? 而现在我的XML的增加: 你可以在任何地方注入任何东西(不仅是有注释的代码) 我应该怎么做,如果我有一个接口的几个实现? 使用限定符? 但是这迫使我的class级知道需要什么样的注射。 这不利于devise。 基于XML的DI使我的代码变得清晰:每个类都不知道注入,所以我可以对它进行configuration并以任何方式进行unit testing。 你怎么看?

CDI:beans.xml,我把你放在哪里?

我正在使用Weld作为CDI实现。 当我在src/test/java/META-INF/beans.xml有空的beans.xml时,我的集成testing试图组装对象图实例化Weld容器。 这是简单的testing: public class WeldIntegrationTest { @Test public void testInjector() { new Weld().initialize(); // shouldn't throw exception } } 现在当我运行mvn clean install ,我总是得到: Missing beans.xml file in META-INF! 我的根文件夹是包含WEB-INF文件夹的“src”和“web”,但我也尝试使用默认的maven结构,并将“web”重命名为“webapp”,并将其移至src / main。 我尝试了所有我能想到的合理位置: – src/main/java/META-INF/beans.xml – src/test/java/META-INF/beans.xml – web/WEB-INF/beans.xml – src/main/webapp/WEB-INF/beans.xml – src/main/webapp/META-INF/beans.xml – src/main/webapp/META-INF/(empty) and src/main/webapp/WEB-INF/beans.xml 目前为止没有任何工作:/

注入和资源和自动assembly注释

@Inject和@Resource和@Autowired注释之间有什么区别? 我们应该什么时候使用它们?

为什么在Java EE中使用CDI?

我知道有很多文章解释了如何在Java EE中使用CDI,但是我很难弄清楚这实际上带来了什么好处。 例如,假设我有一个当前使用Foo实例的类。 我可能会这样做 Foo myFoo = new Foo(); 要么 // Better, FooFactory might return a mock object for testing Foo myFoo = FooFactory.getFoo(); 我一直用CDI阅读,我可以这样做: @Inject Foo myFoo; 但为什么这比以前的工厂为基础的方法更好? 我假设有一些其他的用例,我不知道,但我一直无法确定这一点。 如果我已经理解了下面的回答,那么这个概念就是DI框架作为一个集中configuration的主对象工厂。 这是一个合理的解释? 更新 自从我开始学习Spring之后,现在变得更有意义了。 下面的段落取自实践中的Spring,以AccountService类为例,该类又使用了AccountDao一个实例。 我为长篇大论表示抱歉,但是我认为它真正成为注入资源为什么会提供标准初始化的核心。 您可以使用new关键字构造AccountService,但是创build服务层对象很less如此简单。 他们通常依赖于DAO,邮件发送者,SOAP代理以及其他东西。 您可以在AccountService构造函数中(或通过静态初始化)以编程方式实例化这些依赖关系中的每一个,但这会导致在被交换出来时出现严重的依赖关系和级联更改。 此外,您可以创build外部依赖关系,并通过setter方法或构造函数参数将它们设置在AccountService上。 这样做可以消除内部依赖关系(只要它们是通过接口在AccountService中声明的),但是到处都有重复的初始化代码。 以下是你如何创build一个DAO,并以Spring方式连接到你的AccountService: <bean id="accountDao" class="com.springinpractice.ch01.dao.jdbc.JdbcAccountDao"/> <bean id="accountService" class="com.springinpractice.ch01.service.AccountService"> <property name="accountDao" ref="accountDao"/> </bean> 像上面那样configuration好了bean之后,你的程序现在可以从Spring ApplicationContext中请求一个AccountService的实例,而Spring DI框架将会在实例化所有需要实例化的东西之后。

Google Guice与JSR-299 CDI / Weld

Weld,JSR-299上下文和dependency injection参考实现,认为自己是Spring和Guice的inheritance者。 CDI受到许多现有Java框架的影响,包括Seam,Guice和Spring。 然而,CDI具有自己独特的特征:比Seam更安全,比Spring更具有状态和更less的以XML为中心,比Guice更具networking和企业应用能力。 但是,如果没有上述框架的启发和JSR-299专家组(EG)的大量合作和辛勤工作,这些都不会有任何启发。 http://docs.jboss.org/weld/reference/latest/en-US/html/1.html 与Guice相比,什么让Weld更适合企业应用? 与Guice相比,有没有什么优缺点? 与Weld拦截器相比,您如何看待Guice AOP? 性能呢? 我的select 最后,我决定使用Guice,因为我喜欢干净的编程模型,默认情况下,除了@Inject之外几乎没有注释。 使用Guice的外部库比使用CDI容易得多。 Guice的AOP也很简单。

CDI是Spring的一个很好的替代品吗?

我们正计划从头开始编写一个Web应用程序,因此决定使用符合Java EE 6标准的最新版Glassfish,因此我们正在分析CDI是否可以用来代替Spring。 我们可以说CDI可以替代Spring吗?

Java错误:WELD-000072声明钝化范围的托pipebean必须具有钝化function

我写了一个简单的程序在Java Web窗体,但我收到以下错误: WELD-000072声明钝化范围的托pipebean必须具有钝化function。 Bean:受限Bean [带有限定符的类BeanPakage.DemoBeans] [@Any @Default @Named] 谁能告诉我这个错误来自哪里? 我的代码是: package BeanPakage; import javax.enterprise.context.SessionScoped; import javax.inject.Named; @Named("DemoBeans") @SessionScoped public class DemoBeans { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }

CDI中@ApplicationScoped和@Singleton作用域有什么区别?

在CDI中有@ApplicationScoped和( javax.inject ) @Singleton伪范围。 他们有什么区别? 除了@ApplicationScoped被代理,而@Singleton不是。 我可以将我的@Singleton bean更改为@ApplicationScoped吗? @ApplicationScoped bean可以有两个(或更多)实例吗?

CDI和EJB如何比较? 相互作用?

我很难理解这两者之间的相互作用以及它们之间的界限在哪里。 他们重叠? 他们之间是否有冗余? 我知道有两个相关的注释,但我一直没能find一个完整的清单,简要说明。 不知道这是否有助于清除它们之间的差异或重叠。 真的只是困惑。 我认为我相当了解EJB,我想我很难理解CDI究竟带来了什么,以及它如何取代或增强EJB已经提供的东西。

@注入通过URL将parameter passing给CDI @Named bean

如果我不能在@Named中使用@ManagedProperty注释,因为@ManagedProperty在CDI(?)中不起作用,那么如何将URL中的params传递给facelets客户端呢? 在我的代码中,我想通过“后退”和“前进”button将javax.mail.getMessageNumber()传递给details.xhtml。 我知道@Inject应该被使用,但是什么被注入和如何,请吗? 从glassfish日志中,id始终是0,这很奇怪。 即使点击“前进”,无论点击多less次,ID也不会超过1。 当然,这只是问题的症状。 期望的输出当然是前进到下一个消息。 也许把这个消息,或者至less是int,join会话中? 客户端如此: <?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <ui:composition xmlns:ui="http://java.sun.com/jsf/facelets" template="./template.xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:f="http://java.sun.com/jsf/core"> <ui:define name="top"> <h:form> <h:form> <h:outputLink id="link1" value="detail.xhtml"> <f:param name="id" value="#{detail.back()}" /> <h:outputText value="back" /> </h:outputLink> </h:form> </h:form> <h:form> <h:outputLink id="link1" value="detail.xhtml"> <f:param name="id" value="#{detail.forward()}" /> <h:outputText value="forward" /> […]