Spring有两个核心接口:BeanFactory 和 ApplicationContext,其中ApplicationContext是BeanFactory 的子接口。它们代表Spring容器,Spring容器是生成Bean实例的工厂,并管理容器中的Bean,Bean是Spring管理的基本单位,在基于spring的javaEE应用中,所有的组件都被当成bean来处理
很多时候, ApplicationContext 都是以声明式方式操作容器,无须手动创建。例如:可利用像ContextLoader 的支持类,在 Web 应用启动时自动创建 ApplicationContext。当然,也可以采用编程方式创建 ApplicationContext。
Spring中ApplicationContext的三种不同实现:
1)FileSystemXmlApplicationContext:这种方式是通过程序在初始化的时候,导入Bean配置文件,然后得到Bean实例。
ApplicationContext ctx = newFileSystemXmlApplicationContext("spring-config.xml"); //当前路径加载单个配置文件
String[] locations = {"bean1.xml", "bean2.xml", "bean3.xml"};
ApplicationContext ctx = new FileSystemXmlApplicationContext(locations ); //同时加载多个配置文件
ApplicationContext ctx = new FileSystemXmlApplicationContext("D:/project/bean.xml");//根据具体路径加载文件
对于FileSystemXmlApplicationContext:
默认表示的是两种:
1.没有盘符的是项目工作路径,即项目的根目录;
2.有盘符表示的是文件绝对路径.
注意:如果要使用classpath路径,需要前缀classpath:
2)ClassPathXmlApplicationContext
ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");//加载单个配置文件
String[] locations = {"bean1.xml", "bean2.xml", "bean3.xml"};
ApplicationContext ctx = newClassPathXmlApplication(locations);//同时加载多个配置文件。
或者用通配符同时加载多个配置文件:
ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:/*.xml");
注:其中FileSystemXmlApplicationContext和ClassPathXmlApplicationContext与BeanFactory的xml文件定位方式一样是基于路径的。
ClassPathXmlApplicationContext和FileSystemXmlApplicationContext的区别如下:
1.classpath:前缀是不需要的,默认就是指项目的classpath路径下面;
2.如果要使用绝对路径,需要加上file:前缀表示这是绝对路径;
3)XmlWebApplicationContext:在B/S系统中,通常在web.xml初始化bean的配置文件,然后由WebAppliCationContextUtil得到ApplicationContext
ServletContext servletContext =request.getSession().getServletContext();
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);
例子如下:
public static void main(String[] args) {
ApplicationContext factory = null;
// 用classpath路径,用ClassPathXmlApplicationContext类时,有没有classpath:前缀都是一样的。
factory = new ClassPathXmlApplicationContext("classpath:appcontext.xml");
factory = new ClassPathXmlApplicationContext("appcontext.xml");
// ClassPathXmlApplicationContext使用了file前缀是可以使用绝对路径的。
factory = new ClassPathXmlApplicationContext(
"file:F:/workspace/example/src/appcontext.xml");
// 用文件系统的路径,默认指项目的根路径
factory = new FileSystemXmlApplicationContext("src/appcontext.xml");
factory = new FileSystemXmlApplicationContext(
"webRoot/WEB-INF/appcontext.xml");
// 使用了classpath:前缀,这样,FileSystemXmlApplicationContext也能够读取classpath下的相对路径
factory = new FileSystemXmlApplicationContext(
"classpath:appcontext.xml");
// 加不加file前缀都是一样的。
factory = new FileSystemXmlApplicationContext("file:F:/workspace/example/src/appcontext.xml");
factory = new FileSystemXmlApplicationContext(
"F:/workspace/example/src/appcontext.xml");
HelloClient hw = (HelloClient) factory.getBean("helloworldbean");
}
三个实现类的区别:
FileSystemXmlApplicationContext:通过程序在初始化的时候,导入Bean配置文件,然后得到Bean实例。
XmlWebApplicationContext:在B/S系统中,通常在web.xml初始化bean的配置文件,然后由WebAppliCationContextUtil得到ApplicationContext例如:
ApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc);
ApplicationContext ctx =???? WebApplicationContextUtils.getWebApplicationContext(ServletContext sc);
其中 servletContext sc 可以具体 换成 servlet.getServletContext()或者 this.getServletContext() 或者 request.getSession().getServletContext();
另外,由于spring是注入的对象放在ServletContext中的,所以可以直接在ServletContext取出WebApplicationContext 对象: