当前位置: 首页 > 面试题库 >

@Inject仅对CDI容器创建的POJO有效吗?

洪飞龙
2023-03-14
问题内容

我只想确认我完全了解CDI起作用的前提条件。如果我有A类:

public class A {
    @Inject private B b;
}

现在,当我使用以下方法实例化此类时:

A a = new A();

在这种情况下,Ab将为空。

但是如果我在另一个类中定义一个成员:

@Inject A a;

然后使用a,ab将被正确填充?

仅当需要注射的类也是由CDI容器创建的时,CDI才起作用吗?或者,如果使用普通实例化和新实例创建POJO时注入结果为空,那我会丢失什么(是的,我已经安装了beans.xml)?


问题答案:

尽管其他人正确地指出,在大多数情况下,DI容器不会将未实例化的依赖项注入bean中,但这并非完全正确。

Spring有一个很棒的功能,当您使用创建时,它将自动装配bean new A()。您只需要使用AspectJ并在@Configurable注释中标记bean即可。

@Configurable
public class A {
    @Inject private B b;
}

它实际上是一种很棒的功能,因为您可以执行Active Record样式的POJO,同时仍然要尊重您的DI(实际上是Spring Roo的方式)。

您还应该知道,使用Spring可以在通过AutowireCapableBeanFactory实例化bean之后以编程方式自动装配bean
。这通常是自动装配JUnit测试用例类的方式,因为JUnit创建了测试用例类。

是的,Spring不是CDI, 但从理论上讲,您可以@Configurable为CDI 编写自己的代码,或者可以采用CDI的方式完成上述操作。

话虽这么说,以上是一种复杂的功能(并且是一种hack),正如@JanGroth所提到的那样,容器的生命周期bean管理对于其CDI,Spring,Guice等而言至关重要。



 类似资料:
  • 问题内容: 我在学习基本的Java课程,但遇到一个问题:仅在将有效参数传递给构造函数后,才如何创建对象? 验证完成后,我应该做一个替代类并从那里调用构造函数吗? 还是应该/应该在类中使用静态方法进行验证? 在这种情况下,最佳做法是什么? 问题答案: 标准做法是验证构造函数中的参数。例如: 旁注:要验证参数不为null(这很常见),可以使用: 更新 答复您对社会保险号的特定评论。一种方法是向类添加方

  • 我想用Java创建一个PDF(我更喜欢在这里使用PDFBox,但这不是一个严格的要求)。部分内容必须 在屏幕上可见 但打印时不可见 (把它想象成标题,它已经预先打印在纸上,但是PDF的数字版本应该在屏幕上显示这个标题,而不是打印它) 我看到了这篇文章,它展示了一个很好的内容示例,即仅打印但在屏幕上不可见:创建一个仅在使用PDFBox打印时显示的水印(pdf可选内容) 现在我需要完全相反的:在屏幕上

  • 像这样上课: 有没有可能告诉Weld不要注射到c中?我可以否决使用事件的类: 但是B物体也不会被注射。我在搜索类似这样的东西:“如果类名是A,字段类型是C,那么省略注入。” 更具体地说,我希望HK2引擎注入“C”字段,问题是HK2和焊接都使用@注入注释。 我尝试了西利亚罗斯的解决方案。我找到了想要添加自定义注入实现的类型,比如: 在我添加了覆盖注入(…)在美国 比如: 在Manager eBVia

  • OpenStack对象存储是一个分布式的对象存储平台,支持API调用。该功能可以直接结合进其他应用中,也可以用来存储各种文件,包括虚拟机镜像、备份、归档、甚至是媒体文件。在OpenStack控制台,用户暂时只能管理容器和镜像。 在OpenStack对象存储中,容器是存放对象文件的空间,就像Windows或者Linux的文件夹是存放文件的空间一样。只是容器和容器不能像文件夹一样嵌套。OpenStac

  • 问题内容: 我创建了一个简单的POJO: 经过一番搜索,我发现了这一点: 但是有了这个我得到了错误: 我找到了另一个解决方案: 但是这种方法不存在。 那么如何将POJO转换为JSON? 问题答案: 只需使用java Gson API : 然后您可以从json 创建一个,如下所示: 看看 GSON用户指南 ,这 SIMPLE GSON实例 的详细信息。