0 前言
如下是配置Spring bean的基本代码,该代码位于src/main/java/com/zheng/lesson001/demo1中
//1.bean配置文件位置
String beanXml = "classpath:/com/zheng/lesson001/demo1/beans.xml";
//2.创建ClassPathXmlApplicationContext容器,给容器指定需要加载的bean配置文件
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(beanXml);
beans.xml文件位于src/main/resources/com/zheng/lesson001/demo1中,代码如下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
定义一个bean
id:bean的唯一标识,可以通过这个标识从容器中获取这个bean对象 clss:这个bean的类型,完整类名称
-->
<bean id="helloWorld" class="com.zheng.lesson001.demo1.HelloWorld"/>
</beans>
当运行时,ClassPathXmlApplicationContext会加载beans.xml文件,进一步加载com.zheng.lesson001.demo1.HelloWorld类。
问题是ClassPathXmlApplicationContext是如何根据"classpath:/com/zheng/lesson001/demo1/beans.xml"找到该文件的,而Spring IOC又是如何找到com.zheng.lesson001.demo1.HelloWorld?
1 CLASSPATH变量与jar包
java文件分为源文件(.java)和字节码文件(.class),在编写完java源文件之后,如果想要运行java程序,就需要对其进行编译,再使用java虚拟机运行。编译过程中,idea(IDE)会将所有的java文件编译之后输出到classpath中,附带着将所有resources中的文件也打包到里边。而所有的java程序都是从这里边寻找资源文件的(包括xml和.class)文件。
Spring的ClassPathXmlApplicationContext便是从classpath下寻找Spring bean的配置文件,当然如果希望通过绝对路径加载配置文件可以使用FileSystemXmlApplicationContext。
Spring IOC容器通过bean配置文件加载各个类。在编译时,HelloWorld.class的全名为com.zheng.lesson001.demo1.HelloWorld.class,bean文件规定了id与类的映射,可以通过id找到需要的class。