当前位置: 首页 > 知识库问答 >
问题:

焊接不是注射

廉宇
2023-03-14

我试图在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方法,该方法应输出预期文本。

我到底做错了什么?

共有3个答案

邹俊拔
2023-03-14

使用@ApplicationScoped创建一个utils类。这个类可以生成各种类型的对象。在你的情况下,这就像这样:

@Produces
static SimpleClass generateSimpleClass(){
return new SimpleClass();
}

否则,如果simpleclass for you将成为应用程序中唯一的类,请将其类设置为@ApplicationScoped。问题是,如果既没有注释也没有生产者,weld就不知道该类属于容器

权兴为
2023-03-14

你做错的是调用new Test()。这构造了一个新的Test实例,但位于CDI的后面。为了让CDI注入您的测试实例,CDI必须自己创建它。

请参阅文档,了解如何在Java SE环境中增强焊接。

晋功
2023-03-14

您的代码有两个问题:

问题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