我试图在JavaSE中建立一个非常简单的weld实现。
我有扩展类:
public class MyExtension implements Extension {
void beforeBeanDiscovery(@Observes BeforeBeanDiscovery bbd) {
System.out.println("Starting scan...");
}
<T> void processAnnotatedType(@Observes ProcessAnnotatedType<T> annotatedType, BeanManager beanManager) {
System.out.println("Scanning type: " + annotatedType.getAnnotatedType().getJavaClass().getName());
}
void afterBeanDiscovery(@Observes AfterBeanDiscovery abd) {
System.out.println("Finished the scanning process");
}
public void main(@Observes ContainerInitialized event) {
System.out.println("Starting application");
new Test();
}
}
然后,我有一个简单的类,我想注入:
public class SimpleClass {
public void doSomething() {
System.out.println("Consider it done");
}
}
最后,我想把它注入课堂:
public class Test {
@Inject
private SimpleClass simple;
@PostConstruct
public void initialize() {
simple.doSomething();
}
@PreDestroy
public void stop() {
System.out.println("Stopping");
}
}
结果是:
80 [main] INFO org.jboss.weld.Version - WELD-000900 1.1.10 (Final)
272 [main] INFO org.jboss.weld.Bootstrap - WELD-000101 Transactional services not available. Injection of @Inject UserTransaction not available. Transactional observers will be invoked synchronously.
Starting scan...
Scanning type: test.Test
Scanning type: test.SimpleClass
Scanning type: test.MyExtension
640 [main] WARN org.jboss.weld.interceptor.util.InterceptionTypeRegistry - Class 'javax.ejb.PostActivate' not found, interception based on it is not enabled
640 [main] WARN org.jboss.weld.interceptor.util.InterceptionTypeRegistry - Class 'javax.ejb.PrePassivate' not found, interception based on it is not enabled
Finished the scanning process
Starting application
我希望在构造Test()时注入简单类,并调用postconstruct方法,该方法应输出预期文本。
我到底做错了什么?
使用@ApplicationScoped创建一个utils类。这个类可以生成各种类型的对象。在你的情况下,这就像这样:
@Produces
static SimpleClass generateSimpleClass(){
return new SimpleClass();
}
否则,如果simpleclass for you将成为应用程序中唯一的类,请将其类设置为@ApplicationScoped。问题是,如果既没有注释也没有生产者,weld就不知道该类属于容器
你做错的是调用new Test()
。这构造了一个新的Test实例,但位于CDI的后面。为了让CDI注入您的测试实例,CDI必须自己创建它。
请参阅文档,了解如何在Java SE环境中增强焊接。
您的代码有两个问题:
问题1:
CDI不管理用new
创建的bean。在大多数情况下,您需要@Inject a bean才能由容器管理它的生命周期
问题二:
在大多数情况下,不能将bean实例注入容器事件的观察者。这是因为事件是在容器初始化时触发的,也就是在它真正开始管理对象生命周期之前。
可以将容器初始值设定项观察器直接挂接到测试类中。比如:
public class SimpleClass {
public void doSomething() {
System.out.println("Consider it done");
}
@PostConstruct
public void initialize() {
System.out.println("Starting");
}
@PreDestroy
public void stop() {
System.out.println("Stopping");
}
}
public class Test {
@Inject
private SimpleClass simple;
public void main(@Observes ContainerInitialized event) {
System.out.println("Starting application");
simple.doSomething();
}
}
有一个简单的Mongo DB生产者连接到Mongo数据库 我的src/main/resources/meta-inf中的一个资源文件 WeldContext和WeldJUnit4Runner来自这里-http://memorynotfound.com/java-se-unit-testing-cdi-junit-jboss-weld-se/
我试图创建一个使用具有生产者方法的类的简单示例,目的是生产者方法注入依赖项,而不是Weld试图创建bean。这就是为什么我已经了我还希望坚持限定符 所以我有以下几点 发动机JAVA 默认引擎。JAVA 汽车JAVA 一个pp.java 引擎制造商。JAVA 我有beans.xml 但是当我收到以下信息时,似乎没有被注入。
我试图提供一个机会注入任意枚举给定的注入点和字符串值(这是在生产方法中获得) 任意是指如果我有枚举我的和枚举你的,我想用相同的生产者方法注入它们两个或任何其他一个。 所以我尝试了几种方法:1。 2.我将返回类型更改为对象。 在这两种情况下,我都会收到由:org引起的下一个异常。jboss。焊接例外情况。DeploymentException:WELD-001408:在注入点[BackedAnnot
我正在junit测试中使用Weld SE。它似乎没有注入CDIBean的内部场。我使用的是maven artifcat 没有例外,该字段只是空的。我尝试了构造函数注入,而不是字段注入: 在这种情况下,我会收到一条异常消息:org。jboss。焊接例外。不满意的解决方案例外:WELD-001334:带限定符的Z型服务的不满意依赖项
我有,和Eclipse Maven项目。 包含: 接口。 IMyConfig的实现。 实现,具有属性。 "空"文件。 一个的实现,标记为。 一个类(和方法),初始化Weld SE并检索一个bean。 一个,其中在部分中列出。 现在,我运行类,并且成功地检索了bean(作为实例)。但是这样的实例在其属性中被注入了实例,而不是替代版本() 我正在使用Eclipse Luna M2Eclipse。 我做
像这样上课: 有没有可能告诉Weld不要注射到c中?我可以否决使用事件的类: 但是B物体也不会被注射。我在搜索类似这样的东西:“如果类名是A,字段类型是C,那么省略注入。” 更具体地说,我希望HK2引擎注入“C”字段,问题是HK2和焊接都使用@注入注释。 我尝试了西利亚罗斯的解决方案。我找到了想要添加自定义注入实现的类型,比如: 在我添加了覆盖注入(…)在美国 比如: 在Manager eBVia