Spring 加载 Application Context五种方式小结

目录
  • Spring创建出现的错误,ApplicationContext错误
    • 解决方案

容器是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; 

错误解决!

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • SpringBoot获取ApplicationContext的3种方式

    ApplicationContext是什么? 简单来说就是Spring中的容器,可以用来获取容器中的各种bean组件,注册监听事件,加载资源文件等功能. Application Context获取的几种方式 1 直接使用Autowired注入 @Component public class Book1 { @Autowired private ApplicationContext applicationContext; public void show (){ System.out.printl

  • 获取Spring的上下文环境ApplicationContext的最简单方式

    目录 获取Spring上下文环境ApplicationContext 分析: 正确的做法是: 注意: Spring上下文(ApplicationContext)理解 什么是Spring应用上下文呢??? 通过.class文件获取bean的方法: 获取Spring上下文环境ApplicationContext Web项目中发现有人如此获得Spring的上下环境: public class SpringUtil { public static ApplicationContext context =

  • 详解Spring ApplicationContext加载过程

    1.找准入口,使用ClassPathXmlApplicationContext的构造方法加载配置文件,用于加载classPath下的配置文件 //第一行,执行完成之后就完成了spring配置文件的加载,刷新spring上下文 ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext( "classpath:spring-mvc.xml"); //获取实例Bean Person person=con

  • Spring 加载 Application Context五种方式小结

    目录 Spring创建出现的错误,ApplicationContext错误 解决方案 容器是Spring框架的核心.Spring 容器使用DI管理构成应用的组件.Spring容器使用DI管理构成应用的组件.这些对象更简单.易于理解,更易于重用并且更易于进行单元测试. Spring 容器 Spring 容器并不是只有一个.Spring 自带了多个容器实现,可以归为两种不同的类型. Bean工厂(由org.springframework,beansfactory.BeanFactory 接口定义)是

  • 详解使用Vue.Js结合Jquery Ajax加载数据的两种方式

    整理文档,搜刮出一个使用Vue.Js结合Jquery Ajax加载数据的两种方式的代码,稍微整理精简一下做下分享. 废话不多说,直接上代码 html代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>demo</title> <script src="js/jquery.js"

  • Vue加载组件、动态加载组件的几种方式

    什么是组件: 组件是Vue.js最强大的功能之一.组件可以扩展HTML元素,封装可重用的代码.在较高层面上,组件是自定义的元素,Vue.js的编译器为它添加特殊功能.在有些情况下,组件也可以是原生HTML元素的形式,以is特性扩展. 下面一段简单的代码给大家介绍Vue加载组件的几种方式,具体代码如下所示: //正常加载 import index from '../pages/index.vue' import view from '../pages/view.vue' //懒加载 const i

  • Tensorflow 2.4加载处理图片的三种方式详解

    目录 前言 数据准备 使用内置函数读取并处理磁盘数据 自定义方式读取和处理磁盘数据 从网络上下载数据 前言 本文通过使用 cpu 版本的 tensorflow 2.4 ,介绍三种方式进行加载和预处理图片数据. 这里我们要确保 tensorflow 在 2.4 版本以上 ,python 在 3.8 版本以上,因为版本太低有些内置函数无法使用,然后要提前安装好 pillow 和 tensorflow_datasets ,方便进行后续的数据加载和处理工作. 由于本文不对模型进行质量保证,只介绍数据的加

  • Spring中集成Groovy的四种方式(小结)

    groovy是一种动态脚本语言,适用于一些可变.和规则配置性的需求,目前Spring提供ScriptSource接口,支持两种类型,一种是 ResourceScriptSource,另一种是 StaticScriptSource,但是有的场景我们需要把groovy代码放进DB中,所以我们需要扩展这个. ResourceScriptSource:在 resources 下面写groovy类 StaticScriptSource:把groovy类代码放进XML里 DatabaseScriptSour

  • JS实现斐波那契数列的五种方式(小结)

    下面是五种实现斐波那契数列的方法 循环 function fibonacci(n){ var res1 = 1; var res2 = 1; var sum = res2; for(var i = 1;i < n;i ++){ sum = res1 + res2; res1 = res2; res2 = sum; } return sum; } 普通递归 function fibonacci (n) { if ( n <= 1 ) {return 1}; return fibonacci(n

  • Spring Security添加验证码的两种方式小结

    目录 一.自定义认证逻辑 二.自定义过滤器 总结 一.自定义认证逻辑 生成验证码工具 <dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha</artifactId> <version>2.3.2</version> </dependency> 添加Kaptcha配置 @Configuration public class K

  • js前端实现图片懒加载(lazyload)的两种方式

    在实际的项目开发中,我们通常会遇见这样的场景:一个页面有很多图片,而首屏出现的图片大概就一两张,那么我们还要一次性把所有图片都加载出来吗?显然这是愚蠢的,不仅影响页面渲染速度,还浪费带宽.这也就是们通常所说的首屏加载,技术上现实其中要用的技术就是图片懒加载--到可视区域再加载. 思路: 将页面里所有img属性src属性用data-xx代替,当页面滚动直至此图片出现在可视区域时,用js取到该图片的data-xx的值赋给src. 关于各种宽高: 页可见区域宽: document.body.clien

  • 让浏览器非阻塞加载javascript的几种方法小结

    浏览器为了确保正确执行脚本和呈现布局在浏览器加载和执行完成它之前会完全阻塞页面后续内容的呈现和其他资源的加载. 在页面的加载过程中如果可以做到内容的逐步呈现,对于良好的用户体验来说是非常重要的.通常我们也会在wondow对象的onload事件处理函数中做一些事情,但由于脚本阻塞加载和呈现的特性这一方面增加了页面载入时间推迟了onload事件的触发,另一方面也延迟了用户所期待的反馈.这就需要我们使用一些方法来让浏览器以非阻塞的方式加载外部脚本. 一  使用XMLHttpRequest对象异步方式

  • Zuul 实现网关转发的五种方式小结

    上图为一个微服务框架的简单示例,当有一个HTTP请求发送到服务器的时候,其实是先经过了Nginx的,再经过了网关,这里的网关就担任了拦截过滤的作用,既然拦截和过滤了,肯定就涉及到了请求的转发 转发我大致例了以下五种转发方式: 方式一:path+serviceId 方式 在spring_cloud的配置文件application.yml 文件中加入以下配置: server: port: 8888 #服务端口 spring: application: name: app-zuul-gateway #

随机推荐