参考Spring实现和SpringAction
最初我们可以在一个main方法中利用
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(“applicationContext.xml”);
启动一个Spring容器
里面我们一般配备了很多的bean的name和路径,Spring去扫描解析并加载生成这些bean
慢慢的我们发现xml太费事了,我们使用Java Config来写配置,这也是SpringBoot的基础
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.scan(“com.xxx”);
context.refresh();
最后衍生出了SpingBoot,我们常用一下代码启动一个Spring容器。
ConfigurableApplicationContext context = SpringApplication.run(Main.class, args);
除了最后一个SpringBoot的,其实我们很少见上面的两种写法,因为我们常常和Servlet规范一起使用
需要再web.xml中配置
contextConfigLocation
/WEB-INF/classes/applicationContext-*.xml
org.springframework.web.context.ContextLoaderListener
https://www.cnblogs.com/duanxz/p/5074584.html
用监听器的方式去监听servlet容器的启动,进而启动spring
如果使用SpringMVC的话,还需要配置
simpleSpringMVC/servlet-name>
org.springframework.web.servlet.DispatchServlet
1
simpleSpringMVC
*.htm
这段加载了Spring 的配置文件,初始化上下文。ContextLoaderListener是一个实现了ServletContextListener接口的监听器,在项目启动时触发 contextInitialized 方法(该方法主要完成ApplicationContext对象的创建),在关闭项目时会触发 contextDestroyed 方法(该方法会执行ApplicationContext的清理操作)
启动项目时触发contextInitialized 方法,该方法就做一件事,通过父类contextLoader的initWebApplicationContext 方法创建Spring上下文对象(ApplicationContext对象);
initWebApplicationContext 方法做了三件事:
创建WebApplicationContext;
加载对应的Spring文件创建的Bean实例;
讲WebApplicationContext放入ServletContext(既javaweb的全局变量中)。
createWebApplicationContext 创建上下文对象,支持用户自定义的上下文对象,但必须继承自ConfigurableWebApplicationContext,而Spring MVC默认使用 ConfigurableWebApplicationContext 作为 ApplicationContext(它是一个接口的继承)。真正的实现类是XmlWebApplicationContext
configureAndRefreshWebApplicationContext 方法用于封装Application数据并且初始化所有相关的Bean对象。它会从web.xml中读取名为 contextConfigLocation 的配置,这就是 Spring xml 数据源的设置,然后放到ApplicationContext中,最后调用传说中的 refresh 方法执行所有java对象的创建。实际实现类是XMLWebApplicationContext
完成ApplicationContext创建之后就是将其放入ServletContext中,注意它存储的key值常量。
以及父子容器:
https://blog.youkuaiyun.com/dhaiuda/article/details/80026354
各个扩展点和钩子函数,bean加载流程