Spring之IOC容器加载初始化的方式
引言
我们知道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容器加载初始化的方式的更多相关文章
- Spring源码:Spring IoC容器加载过程(1)
Spring源码版本:4.3.23.RELEASE 一.加载过程概览 Spring容器加载过程可以在org.springframework.context.support.AbstractApplic ...
- 深入Spring之IOC之加载BeanDefinition
本文主要分析 spring 中 BeanDefinition 的加载,对于其解析我们在后面的文章中专门分析. BeanDefinition 是属于 Spring Bean 模块的,它是对 spring ...
- Spring扩展:Spring的IoC容器(注入对象的方式和编码方式)
二.Spring的IoC容器 IoC:Inversion of Control(控制反转) DI:Dependency Injection(依赖注入) 三.依赖注入的方式 (1)构造注入 (2)set ...
- Spring源码:Spring IoC容器加载过程(2)
Spring源码版本:4.3.23.RELEASE 一.加载XML配置 通过XML配置创建Spring,创建入口是使用org.springframework.context.support.Class ...
- 【死磕 Spring】----- IOC 之 加载 Bean
原文出自:http://cmsblogs.com 先看一段熟悉的代码: ClassPathResource resource = new ClassPathResource("bean.xm ...
- 【死磕 Spring】—— IoC 之加载 BeanDefinition
本文主要基于 Spring 5.0.6.RELEASE 摘要: 原创出处 http://cmsblogs.com/?p=2658 「小明哥」,谢谢! 作为「小明哥」的忠实读者,「老艿艿」略作修改,记录 ...
- spring装配注解(IOC容器加载控制)ComponentScan及ComponentScans使用
ComponentScan,只写入value,可扫描路径下装配的@Contrller.@Service.@Repository @ComponentScan(value = "com.tes ...
- 梳理源码:spring ioc容器加载的流程图
- spring的bean容器加载
1.在单独使用的时候可以通过ClassPathXmlApplicationContext(“配置文件.xml”);来启动容器. 2.在MVC下是通过启动servlet容器,初始化DispatcherS ...
随机推荐
- Android 墙纸设置代码 详细说明
使游戏图像列表.思考添加壁纸功能.我发了一些资料. 1 别忘记在ApplicationManifest.xml 中加上权限的设置. <uses-permission android:name = ...
- 博客搬到了http://xianglong.me
自己用Django建立个人博客.这个博客的部分已经迁移到新的个人博客. 博客地址:龙 (http://xianglong.me),欢迎. 版权声明:本文博客原创文章,博客,未经同意,不得转载.
- C语言文件操作函数大全
http://blog.csdn.net/mu0206mu/article/details/18980913 clearerr(清除文件流的错误旗标) 相关函数 feof表头文件 #include&l ...
- Https 客户端与服务器交互过程梳理(转)
本文试图以通俗易通的方式介绍Https的工作原理,不纠结具体的术语,不考证严格的流程.我相信弄懂了原理之后,到了具体操作和实现的时候,方向就不会错,然后条条大路通罗马.阅读文本需要提前大致了解对称加密 ...
- 关于JavaScript中的事件代理
今天面试某家公司Web前端开发岗位,前面的问题回答的都还算凑活,并且又问了一下昨天面试时做的一道数组去重问题的解题思路(关于数组去重问题,可以观赏我前几天写的:http://www.cnblogs.c ...
- 基于Android的ELF PLT/GOT符号和重定向过程ELF Hook实现(by 低端农业代码 2014.10.27)
介绍 技术原因写这篇文章,有两种: 一个是在大多数在线叙述性说明发现PLT/GOT第二十符号重定向过程定向x86的,例<Redirecting functions in shared ELF l ...
- Python的print中国输出对齐问题
问题叙述性说明: 在使用Python内置函数print当输出英语,应用格输出类型可以对齐很好: s1 = 'I am a long sentence.' s2 = 'I\'m short.' prin ...
- 大数据系列修炼-Scala课程06
关于Scala中的正则表达式与模式匹配结合的正则表达式Reg 正则表达式的实现:正则表达式的定义与其它语言差不多,只需在表达式后加一个.r,并且可以遍历相应的表达式进行匹配 //定义的正则表达式 va ...
- hdu Write a simple HTML Browser
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1088 对比输出 代码: #include <stdio.h> #include <s ...
- Ambari-部署文档
Ambari-server搭建过程 部署环境要求 操作系统:centos 5 或 centos 6 能够使用yum jdk版本号 1.7 官网安装教程 https://cwiki.apache.org ...