BeanFactory
BeanFactory我们称为Ioc容器,是类的通用工厂,它可以创建管理各种类的对象。它使管理不同类型的Java对象成为可能。
- 初始化
BeanFactory在初始化容器的时候,并未实例化Bean,直到第一次访问某个Bean 的时候才初始化目标Bean。
//获取配置资源
ResourcePatternResolver resolver=new PathMatchingResourcePatternResolver();
Resource resource=resolver.getResource("classPath://com.sunjie.tradition/bean.xml")
//创建Beanfactory
DefaultListableBeanFactory beanFactory=new DefaultListableBeanFactory();
//启动Ioc容器
XmlBeanDefinitionReader reader=new XmlBeanDefinitionReader(beanFactory);
reader.loadBeanDefinitions(resource);
//获取Bean
Person person=beanFactory.getBean("person",Person.class);
ApplicationContext
ApplicationContext由BeanFactory派生而来,提供更多的功能。
- 初始化
ApplicationContext在初始化容器的时候就实例化好了所有单实例的Bean。
//读取配置文件初始化Ioc容器
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("com.sunjie.tradition/bean.xml");
//加载多个
//ApplicationContext applicationContext=new ClassPathXmlApplicationContext(new String[]{"bean1.xml","bean2.xml"});
//获取Bean
Person person=applicationContext.getBean("person",Person.class);
WebApplicationContext
WebApplicationContext集成自applicationContext,专门为Web应用准备。
为了方便Spring上下文和Web容器可以相互访问,在ServletContext中设置属性,保存Spring上下文,提供了如下方法访问。
//从servletContext中获取WebApplicationContext
WebApplicationContext webApplicationContext=WebApplicationContextUtils.getWebApplicationContext(servletContext);
//上面代码内部实现
//WebApplicationContext webApplicationContext=servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
//WebApplicationContext中获取servletContext
ServletContext servletContext = webApplicationContext.getServletContext();
- 初始化
WebApplicationContext的初始化必须有Web容器。
使用ContextLoaderListener方式初始化
<!-- 指定配置文件-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:conf/spring.xml
</param-value>
</context-param>
<!-- ContextLoaderListener监听器将根据上面配置使用
AnnotationConfigWebApplicationContext根据contextConfigLocation
指定的配置类启动Spring容器-->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
由于WebApplicationContext需要日志功能,所以需要配置Log4J。
- 方式1:把Log4J配置文件放在WEB-INF/classes下,就能自动加载。
- 方式2:如果配置文件在其他位置,则必须指定位置
<!-- 日志配置路径 必须放在spring容器启动的前面-->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</context-param>