标签: cdi

Java依赖注入:XML或注释

注释变得流行.Spring-3支持它们.CDI严重依赖它们(我不能在没有注释的情况下使用CDI,对吧?)

我的问题是为什么

我听到几个问题:

  1. "它有助于摆脱XML".但是xml有什么不好的?依赖性本质上是声明性的,XML对于声明非常有用(对于命令式编程来说非常糟糕).有了很好的IDE(就像想法一样),编辑和验证xml非常容易,不是吗?

  2. "在许多情况下,每个接口只有一个实现".那不是真的!我系统中的几乎所有接口都具有用于测试的模拟实现.

还有其他问题吗?

现在我的XML优势:

  1. 你可以在任何地方注入任何东西(不仅是带有注释的代码)

  2. 如果我有一个接口的多个实现,我该怎么办?使用限定符?但它迫使我的班级知道它需要什么样的注射.它不适合设计.

基于XML的DI使我的代码清晰:每个类都不知道注入,所以我可以配置它并以任何方式对它进行单元测试.

你怎么看?

java spring dependency-injection guice cdi

35
推荐指数
3
解决办法
9780
查看次数

33
推荐指数
3
解决办法
2万
查看次数

CDI注入FacesConverter

从一些搜索来看,这似乎已经存在了一段时间的问题.我写了一个看起来如下的FacesConverter.对象Category是JPA实体,CategoryControl是获取它的DAO.

@FacesConverter(value = "categoryConverter")
public class CategoryConverter implements Converter {

@Inject private CategoryControl cc;

public CategoryConverter() { }

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
    if (cc != null) return cc.getByName(value);
    System.out.println("CategoryConverter().getAsObject(): no injection!");
    return null;
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
    if (!(value instanceof Category)) return null;
    return ((Category) value).getName();
}

}
Run Code Online (Sandbox Code Playgroud)

你可能已经猜到了,我从来没有注射过.我从这个页面得到了这个解决方法,看起来像这样:

Workaround for this problem: create this method in your localeController: 

public Converter …
Run Code Online (Sandbox Code Playgroud)

myfaces cdi jsf-2

30
推荐指数
2
解决办法
2万
查看次数

如何在Tomcat上安装和使用CDI?

我正在创建我的第一个项目Java EE 7,但我遇到了麻烦.感谢任何帮助.

  • Tomcat 7.0.34
  • JSF 2.2
  • Primefaces 3.5
  • JavaEE的-API-7.0.jar

应用程序启动时,Tomcat日志显示以下消息:

"validateJarFile (C:\...\build\web\WEB-INF\lib\javaee-api-7.0.jar)-jar not loaded. See Servlet 2.3 Spec, section 9.7.2. Offending class: javax/servlet/Servlet .class"
Run Code Online (Sandbox Code Playgroud)

当我点击调用托管bean的按钮时,我收到错误:

Advertência: /index.xhtml @18,66 value="#{indexMB.user}": Target Unreachable, identifier 'indexMB' resolved to null
javax.el.PropertyNotFoundException: /index.xhtml @18,66 value="#{indexMB.user}": Target Unreachable, identifier 'indexMB' resolved to null
Run Code Online (Sandbox Code Playgroud)

IndexMB

@Named("indexMB")
@RequestScoped
public class IndexMB {

private String password;
private String user;

public String loginTest(){
    return (this.user.equals("admin") ? "adminPage" : "inOutPage");
}

// getters and setters
}
Run Code Online (Sandbox Code Playgroud)

的index.xhtml

<html ...>

<f:loadBundle …
Run Code Online (Sandbox Code Playgroud)

jsf tomcat cdi jsf-2.2

30
推荐指数
1
解决办法
3万
查看次数

什么是Weld,JSR-299?

我发现了许多显示Weld代码示例的教程,但没有介绍性的概述.

您能否请一篇介绍性文章,或回答以下问题:

  • Weld做什么/给你什么?
  • 它与Java EE 6有什么关系?
  • 如何在Java EE 6项目中使用它?
  • 如果在Java EE 6项目中使用它,它取代了什么,如果有的话?

java-ee cdi java-ee-6 jboss-weld

29
推荐指数
1
解决办法
1万
查看次数

在CDI 1.1中注释的bean发现模式的含义

我正在将应用程序迁移到Java EE 7并且想要CDI 1.1.但我没有得到的意思bean-discovery-mode="annotated".该 CDI 1.1规范是不是非常有帮助.至少我没有找到任何有用的段落.我错过了吗?

这个例子完美地运行bean-discovery-mode="all"并注入一个实例LoggingClass:

public class LoggingClass {
    public Logger logger = Logger.getLogger("ALOGGER");

}

@Test
public class MMLoggerProducerIT extends Arquillian {

    @Inject private LoggingClass lc;

}
Run Code Online (Sandbox Code Playgroud)

但是,如果我从改变bean-discovery-mode="all"bean-discovery-mode="annotated"容器不能够注入的情况下进入该领域lc.

如何正确注释LoggingClass才能bean-discovery-mode="annotated"正确使用?

dependency-injection cdi java-ee-7

28
推荐指数
2
解决办法
2万
查看次数

Spring会支持CDI吗?

对于Java开发人员来说,Spring是一个很好的DI和AOP框架.

现在,有一个标准规格的DI和AOP是CDI.

如果不支持相关标准,任何好产品都不能再保持良好状态.(例如,Hibernate支持JPA规范)

我的问题是,Spring将在未来版本中支持标准规范(CDI)吗?

aop spring dependency-injection java-ee cdi

27
推荐指数
1
解决办法
7147
查看次数

@ApplicationScoped CDI bean和@PersistenceContext - 这样安全吗?

用CDI做这样的事情是否安全?

@Named
@ApplicationScoped
public class DAO {

   @PersistenceContext
   private EntityManager entityManager;

}
Run Code Online (Sandbox Code Playgroud)

我知道它EntityManager本身不是线程安全的,因此不应该在共享的全局上下文中使用@ApplicationScoped.但是,由于注入的对象@PersistenceContext实际上是底层的线程感知包装EntityManager,这是否可以使这个好?

我已经看过关于这个主题的其他帖子,但未能找到这个具体案例的权威答案.例如:

Java CDI @PersistenceContext和线程安全

例如,看起来使用它是安全的@Stateless- 但我不确定这是因为工作方式@Stateless,还是因为@PersistenceContext它本身固有的东西.

编辑 我的困惑的来源是@PersistenceContext注入的EntityManager包装器似乎知道当前的线程,以便弄清楚是否已经有一个正在进行的事务.所以也许我将线程感知与线程安全混淆,它们是两个不同的东西.

jpa java-ee cdi java-ee-6

27
推荐指数
1
解决办法
8702
查看次数

在静态和非静态上下文中创建SLF4J记录器的开销是多少?

我总是使用以下模式构建(SLF4J)记录器:

private static final Logger log = LoggerFactory.getLogger(MyClass.class);
Run Code Online (Sandbox Code Playgroud)

到目前为止这已经奏效了,但我想知道static某些情况下的上下文以及需要一直传递具体的类文字,而不是仅仅使用非静态记录器

private final Logger log = LoggerFactory.getLogger(getClass());
Run Code Online (Sandbox Code Playgroud)

这之前基本上已经问过(并回答)了LOG4J

记录器应该是私有静态还是非静态

和这里

记录器应该是最终的和静态的吗?

我意识到final基本上是强制性的,所以我想知道在非静态环境中使用SLF4J的开销实际上有多高.

问:

使用是否有任何重大的实际开销

private final Logger log = LoggerFactory.getLogger(getClass());
Run Code Online (Sandbox Code Playgroud)

过度

private static final Logger log = LoggerFactory.getLogger(MyClass.class);
Run Code Online (Sandbox Code Playgroud)

普通(网络)应用程序?(这里不需要"讨论"高端,重载的webapps)


注意,我最终计划使用更好的方法使用CDI获得SLF4J记录器

@Inject private final Logger log;
Run Code Online (Sandbox Code Playgroud)

http://www.seamframework.org/Weld/PortableExtensionsPackage#H-TtLoggerttInjection所述,但我需要先了解记录器缓存.

子问题:甚至可以使用?:

@Inject private static final Logger log;
Run Code Online (Sandbox Code Playgroud)

(刚开始用CDI开头)

java logging static slf4j cdi

26
推荐指数
1
解决办法
1万
查看次数

可以在JSR 330中使@Inject成为可选项(如@Autowire(required = false)吗?

Spring的@Autowire可以被配置成,如果没有匹配的自动装配候选人被发现春天不会引发错误:@Autowire(required=false)

是否有等效的JSR-330注释? @Inject如果没有匹配的候选人,总是会失败.有没有办法可以使用,@Inject但如果找不到匹配的类型,框架就会失败?我无法在那个程度上找到任何文件.

java spring dependency-injection cdi

26
推荐指数
5
解决办法
1万
查看次数