先说下开始的问题,spring和servlet都是容器,一开始用原始servlet监听器,发现需要的服务类注入不进来,然后我转过头来使用spring监听器,于是也不行,于是网上搜了下,用PostConstruct注解可以帮助我们,这个注解的意思是:@PostConstruct注解的方法将会在依赖注入完成后被自动调用。
这个解决了,于是问题来了,数据加载了怎么加载得到servlet容器,于是万能的百度,又搜到了,其实可以直接
@Autowired
private ServletContext servletContext;
哇,感觉完美于是就解决了
package com.zhizhuo.web.listener;
import javax.annotation.PostConstruct;
import javax.servlet.ServletContext;
import com.zhizhuo.model.Params;
import com.zhizhuo.service.StaffService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.ContextLoader;
@Component
public class InitComponent {
@Autowired
private StaffService staffService;
@Autowired
private Params params;
@Autowired
private ServletContext servletContext;
public InitComponent() {
System.out.println("================================我被构造了===============================================");
}
@PostConstruct
public void init() {
System.out.println("================================我被执行了===============================================");
System.out.println(servletContext.getContextPath());
servletContext.setAttribute("path", servletContext.getContextPath());
//加载系统参数
params.loadParams();
servletContext.setAttribute("params", Params.params);
System.out.println(Params.params);
}
}
其实获得servlet容器还有一种方法
就是从spring的类ContextLoader获得本地绑定的servlet容器,
ContextLoader.getCurrentWebApplicationContext().getServletContext()
查看源码发现
currentContextPerThread是什么,导航发现是个并发容器
currentContextPerThread = new ConcurrentHashMap(1);
那么问题了来了,什么时候注入进去的,然后我想起了我们再web.xml里面配置的监听器,查看源码可以看出,有个这么个方法,并且把容器传入进去了
发现他把servlet put到并发容器里面了
好了,第一次简单分析源码就到这里了,只是有点好奇,然后探索了一下,嘻嘻