Java CDI延迟注入不起作用
我在下一个场景中遇到CDI问题: 初始化器被注入ServletContextListener中。但在其他一些“步骤”之后,会调用方法启动: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
@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);
}
}