欢迎来到代码驿站!

当前位置:首页 >

Spring 加载 Application Context五种方式小结

时间:2023-03-01 15:10:32|栏目:|点击:

容器是Spring框架的核心。Spring 容器使用DI管理构成应用的组件。Spring容器使用DI管理构成应用的组件。这些对象更简单、易于理解,更易于重用并且更易于进行单元测试。

Spring 容器

Spring 容器并不是只有一个。Spring 自带了多个容器实现,可以归为两种不同的类型。

Bean工厂(由org.springframework,beansfactory.BeanFactory 接口定义)是最简单的容器,提供DI的支持。

应用上下文(由org.springframework.context.ApplicationContext 接口定义)基于BeanFactory构建,并提供应用框架级别的服务。(例如 从属性文件解析文本信息以及发布应用事件给感兴趣的事件监听者。)

Spring多种类型应用上下文

Spring自带了多种类型的应用上下文。下面罗列的几个大家一定用过。

  • AnnotationConfigApplicationContext:从一个或多个 基于Java的配置类中加载Spring应用上下文。
  • AnnotationConfigWebApplicationContext:从一个或 多个基于Java的配置类中加载Spring Web应用上下
  • ClassPathXmlApplicationContext:从类路径下的一个或 多个XML配置文件中加载上下文定义,把应用上下文的定义文件作为类资源。
  • FileSystemXmlapplicationcontext:从文件系统下的一 个或多个XML配置文件中加载上下文定义。
  • XmlWebApplicationContext:从Web应用下的一个或多个 XML配置文件中加载上下文定义。

FileSystemXmlapplicationcontext 的例子

// FileSystemXmlApplicationContext() 存放的是具体文件路径
ApplicationContext context = new FileSystemXmlApplicationContext("D:/work_spring/application.xml");
String[] locations = {"bean1.xml", "bean2.xml", "bean3.xml"};          
ApplicationContext ctx = new FileSystemXmlApplicationContext(locations );

ClassPathXmlApplicationContext 的例子

ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
String[] locations = {"bean1.xml", "bean2.xml", "bean3.xml"};
ApplicationContext ctx = new ClassPathXmlApplicationContext(locations);

使用    

  • FileSystemXmlApplicationContext和使 用ClassPathXmlApplicationContext的区别在于:
  • FileSystemXmlApplicationContext 在指定的文件系统路径下查找application.xml 的文件;
  • ClassPathXmlApplicationContext 是在所有的类路径(包含JAR文件)项目的resource目录下查找 application.xml文件。

AnnotationConfigApplicationContext

使用AnnotationConfigApplicationContext可以实现基于Java的配置类加载Spring的应用上下文。避免使用application.xml进行配置。相比XML配置,更加便捷。请参考下面的例子。

1、Entitlement 实体类

public class Entitlement { 
	private String name;	
	private int time;
        // 省略set get方法  
}

2、配置类

@Configuration
public class AppConfig {
 
	@Bean(name = "entitlement")
	public Entitlement entitlement() {
		Entitlement ent = new Entitlement();
		ent.setName("Entitlement");
		ent.setTime(1);
		return ent;
	}
 
	@Bean(name = "entitlement2")
	public Entitlement entitlement2() {
		Entitlement ent = new Entitlement();
		ent.setName("Entitlement2");
		ent.setTime(2);
		return ent;
	}
}

3、测试类

public static void main(String[] arg) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
        ctx.register(AppConfig.class);
        ctx.refresh();
 
        Entitlement ent = (Entitlement)ctx.getBean("entitlement");
        System.out.println(ent.getName());
        System.out.println(ent.getTime());
 
        Entitlement ent2 = (Entitlement)ctx.getBean("entitlement2");
        System.out.println(ent2.getName());
        System.out.println(ent2.getTime());
 
        ctx.close();
    }

4、测试结果

Entitlement
1
Entitlement2
2

AnnotationConfigWebApplicationContext

在Spring MVC中使用基于Java的配置,我们需要告诉 DispatcherServlet和ContextLoaderListener使 用AnnotationConfigWebApplicationContext,这是一 个WebApplicationContext的实现类,它会加载Java配置类,而 不是使用XML。要实现这种配置,我们可以设置contextClass上下文参 数以及DispatcherServlet的初始化参数。如下的程序清单展现 了一个新的web.xml,在这个文件中,它所搭建的Spring MVC使用基 于Java的Spring配置:

设置web.xml使用基于Java的配置

XmlWebApplicationContext

ContextLoader初始化Spring Web上下文的determineContextClass方法中,我们知道Spring首先通过Servlet上下文从web.xml文件中获取用户自定义配置的contextClass参数值,如果没有获取到,则默认使用Spring的XmlWebApplicationContext作为Spring Web应用的IoC容器,XmlWebApplicationContext是WebApplicationContext的实现类ConfigurableWebApplicationContext的子类。

Spring创建出现的错误,ApplicationContext错误

在进行创建spring容器的时候出现了这样的错误提示:

Type mismatch: cannot convert from ClassPathXmlApplicationContext to ApplicationContext 

(如下图所示)

出现这样出错误的原因在于我们在创建导入包的时候出现的错误:

import org.apache.catalina.core.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

出现这种错误的很大原因在于我们导入了:import org.apache.catalina.core.ApplicationContext; 这个错误的包

解决方案

将其修改为:

import org.springframework.context.ApplicationContext; 

错误解决!

上一篇:Java 带参数与带返回值的方法的定义和调用

栏    目:

下一篇:android Retrofit2+okHttp3使用总结

本文标题:Spring 加载 Application Context五种方式小结

本文地址:http://www.codeinn.net/misctech/226637.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有