引言

  我们知道IOC容器时Spring的核心,可是如果我们要依赖IOC容器对我们的Bean进行管理,那么我们就需要告诉IOC容易他需要管理哪些Bean而且这些Bean有什么要求,这些工作就是通过通过配置文件告诉Spring 的IOC容器。在我们的完成这些配置文件以后,如果IOC容易要实现对这些Bean的管理,除了资源的定位还有一个很重要的一步就是完成IOC加载初始化,也就是配置文件的载入过程。完成IOC容器加载初始化的方式只要有三种,第一种就是通过File文件加载,第二种是通过Classpath(相对路径)加载,还有一种就是通过web引入的方式。我们分别做简单的 介绍。

  

  文件加载:

  在介绍通过文件方式加载之前我们首先写一些简单的测试案例

  A:项目布局

    

  B:测试主要用到的类和接口:

  接口Hello.java

  

package service;

public interface Hello {

    public void sayHello();
public void sayGoodbye(); }

 接口实现:HelloImpl.java

  

package service.impl;

import service.Hello;

public class HelloImpl implements Hello {
@Override
public void sayHello() {
System.out.println("This is from the spring,I want to say Hello!!");
} @Override
public void sayGoodbye() {
System.out.println("This is from the spring ,I want to say Goodbye!!");
}
}

  C:spring相关配置文件(spring的默认配置文件位于WEB-INF文件夹中的applicationContext.xml)

  

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
">
<bean id="hello" class="service.impl.HelloImpl"/>
<bean id="springUtil" class="service.SpringUtil"/>
</beans>

 D:通过FileSystemXmlApplicationContext加载

  

  /*FileSystemXmlApplicationContext加载方式*/
FileSystemXmlApplicationContext fileSystemXmlApplicationContext = new FileSystemXmlApplicationContext("classpath:applicationContext.xml");
Hello hello2 = (Hello) context.getBean("hello");
hello2.sayHello();
hello2.sayGoodbye();

 E:通过FileSystemResource方式加载

  

        /*FileSystemResource加载方式*/
BeanFactory factory2 = new XmlBeanFactory(new FileSystemResource("E:\\WorkSpace\\IntellijIDEAworkspace\\springFunctions\\ManvenSpringTest\\src\\main\\resources\\applicationContext.xml"));
Hello hello4= factory2.getBean("hello",Hello.class);
hello4.sayHello();
hello4.sayGoodbye();

  F:(FileSystemXmlApplicationContext)其他说明

  1.默认为项目工作路径 即项目的根目录

      ApplicationContext appCt2 = new FileSystemXmlApplicationContext("src/main/resources/XXXXXX.xml");

  2.前缀classpath:表示的是项目的classpath下相对路径

  ApplicationContext appCt2 = new FileSystemXmlApplicationContext("classpath:XXXXxml");

  3.使用前缀file 表示的是文件的绝对路径

   ApplicationContext appCt2 = new FileSystemXmlApplicationContext("file:D:/XXXX.xml"); 
     ApplicationContext appCt2 = new FileSystemXmlApplicationContext("D:/XXXX.xml");

  4.可以同时加载多个文件

  String[] xmlCfg = new String[] { "src/main/resources/XXXXX.xml","classpath:YYYY.xml"}; 
    ApplicationContext appCt2 = new FileSystemXmlApplicationContext(xmlCfg);

  5.使用通配符加载所有符合要求的文件

   ApplicationContext appCt2 = new FileSystemXmlApplicationContext("classpath:*.xml");

ClassPath方式加载

  A:所使用的文件如果上面一致

  B:通过ClassPathXmlApplicationContext加载

  

  /*ClassPathXmlApplicationContext加载方式*/
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
Hello hello = (Hello) context.getBean("hello");
hello.sayHello();
hello.sayGoodbye();

  C:通过ClassPathResource方式加载

  

   /*ClassPathResource加载方式*/
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
Hello hello3= factory.getBean("hello",Hello.class);
hello3.sayHello();
hello3.sayGoodbye();

  D:其他说明

  1.没有前缀:默认为项目的classpath下相对路径

    ApplicationContext appCt = new ClassPathXmlApplicationContext("XXXX.xml");

  2.前缀classpath:表示的是项目的classpath下相对路径

   ApplicationContext appCt = new ClassPathXmlApplicationContext("classpath:YYYY.xml");

  3.使用前缀file 表示的是文件的绝对路径

ApplicationContext appCt = new ClassPathXmlApplicationContext("file:D:/XXXX.xml");

  4.可以同时加载多个文件

  String[] xmlCfg = new String[] { "classpath:XXX.xml","YYYY.xml"}; 
    ApplicationContext appCt = new ClassPathXmlApplicationContext(xmlCfg);

  5.使用通配符加载所有符合要求的文件

ApplicationContext appCt = new ClassPathXmlApplicationContext("*.xml");

WEb方式加载

  A:这个需要通过配置ContextLoaderListener

  

   <!--  指定Spring Bean的配置文件所在目录。默认配置在WEB-INF目录下 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

  B:这样就可以将IOC容器加载到环境中了。

执行结果

  代码:TestDemo1.java

  

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.FileSystemResource; import service.Hello; public class TestDemo1 { public static void main(String []args){
System.out.println("ClassPathXmlApplicationContext");
/*ClassPathXmlApplicationContext加载方式*/
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
Hello hello = (Hello) context.getBean("hello");
hello.sayHello();
hello.sayGoodbye();
System.out.println("ClassPathResource");
/*ClassPathResource加载方式*/
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
Hello hello3= factory.getBean("hello",Hello.class);
hello3.sayHello();
hello3.sayGoodbye();
System.out.println("FileSystemXmlApplicationContext");
/*FileSystemXmlApplicationContext加载方式*/
FileSystemXmlApplicationContext fileSystemXmlApplicationContext = new FileSystemXmlApplicationContext("classpath:applicationContext.xml");
Hello hello2 = (Hello) fileSystemXmlApplicationContext.getBean("hello");
hello2.sayHello();
hello2.sayGoodbye();
System.out.println("FileSystemResource");
/*FileSystemResource加载方式*/
BeanFactory factory2 = new XmlBeanFactory(
new FileSystemResource("E:\\WorkSpace\\IntellijIDEAworkspace\\springFunctions\\ManvenSpringTest\\src\\main\\resources\\applicationContext.xml"));
Hello hello4= factory2.getBean("hello",Hello.class);
hello4.sayHello();
hello4.sayGoodbye(); }
}

  

  运行结果:

  

其他:

  上面的测试用例都是采用最原来的凡是来实现的,这样对于做项目来说就是不专业的也是效率低下的。Spring自己提供了单元测试的相关支持,通过这个我们可以极大地优化我们的测试用例,下篇文章做个总结和说明。

Spring之IOC容器加载初始化的方式的更多相关文章

  1. Spring源码:Spring IoC容器加载过程(1)

    Spring源码版本:4.3.23.RELEASE 一.加载过程概览 Spring容器加载过程可以在org.springframework.context.support.AbstractApplic ...

  2. 深入Spring之IOC之加载BeanDefinition

    本文主要分析 spring 中 BeanDefinition 的加载,对于其解析我们在后面的文章中专门分析. BeanDefinition 是属于 Spring Bean 模块的,它是对 spring ...

  3. Spring扩展:Spring的IoC容器(注入对象的方式和编码方式)

    二.Spring的IoC容器 IoC:Inversion of Control(控制反转) DI:Dependency Injection(依赖注入) 三.依赖注入的方式 (1)构造注入 (2)set ...

  4. Spring源码:Spring IoC容器加载过程(2)

    Spring源码版本:4.3.23.RELEASE 一.加载XML配置 通过XML配置创建Spring,创建入口是使用org.springframework.context.support.Class ...

  5. 【死磕 Spring】----- IOC 之 加载 Bean

    原文出自:http://cmsblogs.com 先看一段熟悉的代码: ClassPathResource resource = new ClassPathResource("bean.xm ...

  6. 【死磕 Spring】—— IoC 之加载 BeanDefinition

    本文主要基于 Spring 5.0.6.RELEASE 摘要: 原创出处 http://cmsblogs.com/?p=2658 「小明哥」,谢谢! 作为「小明哥」的忠实读者,「老艿艿」略作修改,记录 ...

  7. spring装配注解(IOC容器加载控制)ComponentScan及ComponentScans使用

    ComponentScan,只写入value,可扫描路径下装配的@Contrller.@Service.@Repository @ComponentScan(value = "com.tes ...

  8. 梳理源码:spring ioc容器加载的流程图

  9. spring的bean容器加载

    1.在单独使用的时候可以通过ClassPathXmlApplicationContext(“配置文件.xml”);来启动容器. 2.在MVC下是通过启动servlet容器,初始化DispatcherS ...

随机推荐

  1. 【2014】【】辛星【php】【秋】【1】php构建开发环境

    **************************什么是开发环境*********************** 1.我们学习PHP,是使用它来做web用的,通俗理解,就是做站点. 2.站点的执行须要 ...

  2. 通过管道进行线程间通信:字节流。字符流的用法及API类似

    管道流(PipedStream)可以用于不同线程间直接传送数据.一个线程发送数据到输出管道,另一个线程从输入管道中读取数据.通过使用管道,实现不同线程间的通信,而无须借助于类似临时文件之类的东西. p ...

  3. MySQL SQL分析(SQL profile)

    分析SQL优化运营开销SQL的重要手段.在MySQL数据库.可配置profiling参数启用SQL分析.此参数可以在全局和session水平集.级别则作用于整个MySQL实例,而session级别紧影 ...

  4. Redis源代码分析(十)--- testhelp.h小测试框架和redis-check-aof.c 日志检测

    周期分析struct结构体redis代码.最后,越多越发现很多的代码其实大同小异.于struct有袋1,2不分析文件,关于set集合的一些东西,就放在下次分析好了,在选择下个分析的对象时,我考虑了一下 ...

  5. DEV GridView嵌套

    近来的DEV搞更多.试图寻找专业点的程序做,对这样一个小小的研究. 本篇是多么真实,现在的记录,可以通过点击这条线的子表的内容相关联的行中打开的列表.的影响,如下面的: 以下是实现过程: 1.设计器里 ...

  6. Arcgis sde 10.1您不能创建在安装后的空间库,提示User has privileges required to create database objects.

    Geodatabase在10.1版本号也有较大的改进和更新,在用户体验和性能上都有变化,在实际的工作中可能会碰到各种奇怪的问题(事实上都是有原因的,须要我们对其工作机制有所了解才干避免其发生):近期须 ...

  7. activiti入门2流程引擎API和服务基础设施

    RepositoryService : 管理和控制公布包和流程定义(包括了一个流程每一个环节的结构和行为)的操作 除此之外,服务能够 查询引擎中的公布包和流程定义. 暂停或激活公布包.相应所有和特定流 ...

  8. Leetcode:unique_binary_search_trees

    一.     称号 给定的数目n.问:有多少种不同BST(二叉搜索树) 比如: 因为N =3,共同拥有5种独特的BST. 1          3      3       2      1 \   ...

  9. NEU 1440 The minimum square sum (平方剩余和欧拉准则)

    若p=2或p=4*k+1 则p能够表成两平方数的和的形式 (欧拉和费马已证明,而且有求的方法) 所以答案是p 若p=4*k+3 设a^2=n(mod p) (n!=0)  能够证明不存在b,b^2=p ...

  10. java_eclipse_maven_svn_主题彩色插件_全屏插件

    作为一名不算新手的猿猿,还来纠结IDE环境搭建实属不该,不过着实纠结了不少时间. target: eclipse + maven +svn + 设置默认编码+全屏 绕的路就不说了,直奔主题,由于mav ...