Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java CDI延迟注入不起作用_Java_Dependency Injection_Cdi - Fatal编程技术网

Java CDI延迟注入不起作用

Java CDI延迟注入不起作用,java,dependency-injection,cdi,Java,Dependency Injection,Cdi,我在下一个场景中遇到CDI问题: 初始化器被注入ServletContextListener中。但在其他一些“步骤”之后,会调用方法启动: @WebListener public class ContextListener implements ServletContextListener { @Inject private Initializator initializator; public void contextInitialized(ServletContextE

我在下一个场景中遇到CDI问题:

初始化器被注入ServletContextListener中。但在其他一些“步骤”之后,会调用方法启动:

@WebListener
public class ContextListener implements ServletContextListener {

   @Inject
   private Initializator initializator;

   public void contextInitialized(ServletContextEvent event) {
         ServletContext servletContext = (ServletContext) event.getSource();
         String contextPath = ((ServletContext) event.getSource()).getContextPath();
         String serverName = servletContext.getInitParameter("SERVER_NAME");
         initializator.startup(serverName);
         System.out.println("ServletContext " + contextPath + " stated.");
   }

   public void contextDestroyed(ServletContextEvent event) {
         String contextPath = ((ServletContext) event.getSource()).getContextPath();
         System.out.println("ServletContext " + contextPath + " stopped.");
   }

}
已成功将存储库注入初始化器:

public class Initializator {

   @Inject
   private ChannelRepository repo;

   public String serverName;

   public void startup(String aServerName) {
         this.serverName = aServerName;
         initAll();
   }

   private void initAll() {
         List<Channel> channels = repo.getChannels();
         for (Channel channel : channels) {
                channel.start();
         }
   }

}
如何避免手动创建通道实例

之所以会出现此问题,是因为Initializator中的启动方法是在实例构造之后调用的


如何管理这种类型的“延迟”注入

避免手动创建具有

new Channel()
这相当容易

首先,我们需要在类Channel中使用默认构造函数,并为channels属性使用setters

那么您必须将其添加到您的渠道回购中

@Inject
Instances<Channel> channelInstances;

一个小提示: 如果可以,不要让通道扩展线程,而是执行以下操作

final Channel channel = channelInstances.get();
channel.setPort(8080);
channel.setName("dummy");

channels.add(new Thread() {
  @Override
  public void run() {
    channel.doTheChannelStuff();
    channelInstances.destroy(channel);
  }
}
你为什么要这样做:


在某些情况下,以您尝试使用的方式进行操作时,会导致内存泄漏。(工作中遇到类似问题)这与依赖范围(默认)依赖项和“手动”创建新实例有关。

您的问题非常模糊。您通常不会对数据对象使用DI。你能澄清一下你想做什么吗?
@Inject
Instances<Channel> channelInstances;
channels.add(new Channel("dummy", 8080));
Channel channel = channelInstances.get();
channel.setPort(8080);
channel.setName("dummy");
channels.add(channel);
final Channel channel = channelInstances.get();
channel.setPort(8080);
channel.setName("dummy");

channels.add(new Thread() {
  @Override
  public void run() {
    channel.doTheChannelStuff();
    channelInstances.destroy(channel);
  }
}