探究spring:1.applicationContext初始化
参考书籍:spring4.x企业应用开发实践
开发环境:idea2019.1.3 spring5.1.7 mysql8.0.13
理论:第4章里讲到beanFactory,初步认知就是,beanFactory通过先内输入配置文件,向外输出bean类,以此达到控制反转的目的,不再需要自己创建bean类,bean类由spring容器来创建。
实现:先通过resourcePatternResolver来装载bean的配置文件,之后创建一个defaultListableBeanFactory,在beanfactory中加载resource。
理论:在beanFactory的基础上,创建了一个applicationContext来继承beanFactory,并添加了更多的功能,applicationContext可以直接通过路径加载配置文件,或者通过基于类注解的方式。
基于路径:
ApplicationContext ctx =
new ClassPathXmlApplicationContext("beansFactory/beans3.xml");
//new FileSystemXmlApplicationContext("G:/WebProject/springWorkSpace/chapter1/src/main/resources/beansFactory/beans3.xml");
基于类注解的方式:
先创建一个bean
@Configuration
public class userBean {
@Bean(name = "testUser")
public testUser builderuserBean(){
testUser testuser = new testUser();
testuser.setPassword("111111");
testuser.setUsername("Lisi3");
return testuser;
}
}
第二步,把这个类调用到
AnnotationConfigApplicationContext
具体是
@Test
public void getBeanByInvoke() {
ApplicationContext ctx = new AnnotationConfigApplicationContext(userBean.class);
testUser testuser = ctx.getBean("testUser",testUser.class);
}
个人理解是把类加载到applicationcontext中,通过里面的@Bean注释来表名这个是个bean,然后解析调用。
理论:再进一步,在applicationContext的基础上构建一个更加高级的webapplicationContext,它在原来的基础上面向web应用添加了很多功能。先介绍一下webapp的原理:
部署启动tomcat后,tomcat会通过xml配置文件来识别webapps下的各个web应用,先创建一个servletContext,然后读取xml,然后创建一个xml的实例,xml里面包括了servletContext的配置信息和serlvet的配置信息,通过servletConfig来装配xml里的信息,然后创建servlet,可以说servlet里面包含了很多的配置文件,同时每个web应用对应一个单独的servletContext,web应用下的servlet可以通过这个servletContext来交换信息。
webapplicationContext也就是通过这个servletContext来和webapp产生联系,在servletContext启动之后,webapplicationContext把一个键值对放入到servletContext中,键名为ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,键值为webaoolicationContext的对象,通过这样把两个联系起来。
实践:在web应用的配置文件web.xml中添加方法来调用webapplicationContext的实例,第一种方法,使用ContextLoaderListener,添加
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:smart-context.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
第一行是表名webapplicationContext的配置文件的位置,第二个listener是启动webapplicationContext来寻找配置文件的信息
第二种,在不支持监听器的低版本web容器中,通过
<servlet> <servlet-name>springContextLoaderServlet</servlet-name> <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet>
但是在我实际使用中,发现我的org.springframework.web.context下没有这个类,猜测是我的版本的问题。
第三种,通过类解释的java文件作为配置文件,
未尝试(不知道如何写java类作为配置文件)
推荐阅读
-
基于Spring注解的上下文初始化过程源码解析(一)
-
spring源码分析系列5:ApplicationContext的初始化与Bean生命周期
-
spring源码分析6: ApplicationContext的初始化与BeanDefinition的搜集入库
-
Spring MVC源码(一) ----- 启动过程与组件初始化
-
Spring源码分析之IoC容器初始化
-
SpringBoot 源码解析 (三)----- Spring Boot 精髓:启动时初始化数据
-
Vue源码探究之状态初始化
-
深入探究ASP.NET Core Startup初始化问题
-
spring-boot-2.0.3之quartz集成,数据源问题,源码探究
-
Spring MyBatis初始化解析及sql执行流程