spring启动将字典加载到servlet容器

先说下开始的问题,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()

查看源码发现

spring启动将字典加载到servlet容器_第1张图片
currentContextPerThread是什么,导航发现是个并发容器
currentContextPerThread = new ConcurrentHashMap(1);
那么问题了来了,什么时候注入进去的,然后我想起了我们再web.xml里面配置的监听器,查看源码可以看出,有个这么个方法,并且把容器传入进去了
在这里插入图片描述
发现他把servlet put到并发容器里面了
spring启动将字典加载到servlet容器_第2张图片
好了,第一次简单分析源码就到这里了,只是有点好奇,然后探索了一下,嘻嘻

你可能感兴趣的:(spring,servlet)