一、ioc容器
ioc (inversion of control)即控制反转,把某一个接口选择实现类的控制权转移给Spring容器来管理。调用类对该实现类的依赖关系由ioc容器注入(DI),传统的应用程序我们都是在类内部创建依赖对象,而Spring采用依赖注入的方式即 DI ,从而降低了类与类之间的耦合度。
一般我们把BeanFactory称为ioc容器,把ApplicationContext称为应用上下文,是Spring的核心。
二、当Spring容器启动时,首先会读取配置文件中的相关信息,并在Spring容器中生成一份bean配置信息注册表(BeanDefinition),然后根据配置信息注册表实例化bean装配bean之间的依赖关系,然后将bean实例放入bean缓存池中供应用程序使用。bean缓冲池由HashMap实现的,以bean的beanName为键。
三、BeanFactory
继承关系
BeanFactory bf=new XmlBeanFactory(new ClassPathResource("beans.xml"));
bf.getBean("");
ResourcePatternResolver rpr=new PathMatchingResourcePatternResolver(); Resource r=rpr.getResource("com/lq/ioc/beans.xml"); BeanFactory bf=new XmlBeanFactory(r);
ApplicationContext
继承关系
ApplicationContext ctx =new ClassPathXmlApplicationContext("com/lq/ioc/beans.xml"); ApplicationContext ctx =new FileSystemXmlApplicationContext("com/lq/ioc/beans.xml"); ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"conf/beans1.xml","conf/beans2.xml"});
ApplicationContext和BeanFactory的区别:
1、ApplicationContext 在容器启动时会把所有单实例的bean放入缓冲池中,可以通过配置lazy-init=true来延迟加载, BeanFactory则采用延迟加载的形式,在容器启动时并不会实例化bean,直到第一次加载的时候才去实例化bean.对于单实例的bean,ApplicationContext中每次取出来都是同一个,而BeanFactory则每次取出来的是不同的bean.
2、两者均支持BeanPostProcessor、BeanFactoryPostProcessor(后置处理器)的使用,但是BeanFactory要通过 addBeanPostProcessor(new MyBeanPost())来手动注册,ApplicationContext则不需要手动注册。
WebApplicationContext
只能在web环境中使用,从WebApplicationContext中可以获得ServletContext的引用,整个web应用上下文对象将作为属性放入ServletContext中,Spring提供一个工具类WebApplicationContextUtils中的getWebApplicationContext(ServletContext sc)可以获得WebApplicationContext实例。
继承关系
由于 Web 应用比一般的应用拥有更多的特性,因此WebApplicationContext 扩展了ApplicationContext。WebApplicationContext 定义了一个常量ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,在上下文启动 时,WebApplicationContext 实例即以此为键放置在ServletContext 的属性列表中,因此我们可以直接通过以下语句从Web 容器中获取
WebApplicationContext:
WebApplicationContext wac = (WebApplicationContext)servletContext.getAttribute(
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
在web.xml文件中的配置
1、使用监听的方式
<context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/student.xml, /WEB-INF/person.xml </param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener </listener-class> </listener>
<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/student.xml, /WEB-INF/person.xml </param-value> </context-param> <servlet> <servlet-name>springContextLoaderServlet</servlet-name> <servlet-class>org.springframework.web.context.ContextLoaderServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet>