本例子讲解是基于IDEA作为开发工具,使用maven进行包管理
一、项目pom.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>spring-mvc-sample</groupId>
<artifactId>spring-mvc-sample</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>spring-mvc入门简单</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.9.RELEASE</version>
</dependency>
<!--servlet -->
<!--<dependency>-->
<!--<groupId>javax.servlet</groupId>-->
<!--<artifactId>servlet-api</artifactId>-->
<!--<version>2.5</version>-->
<!--</dependency>-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--servlet -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.2.1.RELEASE</version>
</dependency>
<!--commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--spring junit-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.2.1.RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>spring-mvc-sample</finalName>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
</project>
二、项目关键代码
- spring配置文件applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.2.xsd">
<!-- <context:annotation-config /> -->
<context:component-scan base-package="com.wolf"/>
<!--<bean name="ApplicationContextUtil;zwApplicationUtil" class="com.wolf.util.ApplicationContextUtil">-->
<!--</bean>-->
<bean name="myBean,gagBean" class="com.wolf.bean.Mybean1">
<property name="name">
<value>郑先生</value>
</property>
<property name="pwd">
<value>666666888888</value>
</property>
</bean>
</beans>
- Mybean1类
public class Mybean1 {
private String name;
private String pwd;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
- testCase
public class BeanFactoryTest {
@Test
public void testBeanFactory(){
BeanFactory bf = new XmlBeanFactory(new ClassPathResource("myresource/applicationContext.xml"));
System.out.println("判断myBean是否存在。返回结果:"+bf.containsBean("myBean"));
System.out.println("判断zwBean是否存在。返回结果:"+bf.containsBean("gagBean"));
Mybean1 mybean1 = bf.getBean("myBean",Mybean1.class);
System.out.println("---show myBean properties");
System.out.println("myBean name:"+mybean1.getName());
System.out.println("myBean pwd:"+mybean1.getPwd());
System.out.println("---end show myBean properties");
}
//MyComponentBean zwBean = bf.getBean("zwBean",MyComponentBean.class);
}
控制台输出:
七月 26, 2017 11:44:04 上午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [myresource/applicationContext.xml]
判断myBean是否存在。返回结果:true
判断zwBean是否存在。返回结果:true
---show myBean properties
myBean name:郑先生
myBean pwd:666666888888
---end show myBean properties
三、基于XmlBeanFactory源代码分析第一句代码
BeanFactory bf = new XmlBeanFactory(new ClassPathResource("myresource/applicationContext.xml"));
也就是BeanFactory到底是怎么来的?怎么被创建出来的?在执行逻辑中又做了哪些事情,这里几乎完成了spring-beans的初始化。里面的执行的逻辑非常复杂,但是我们不要被复杂所蒙蔽,我们分析代码一定要了解主线(它做了些什么),然后在具体深入某一个点了解(例如:对xml文件进行初始化时,到底做了哪些事;对注解初始化时又做了哪些事)
通过序列图我们看到具体的执行过程,这里我们并不会具体深入分析到某个分支,因为到某个分支时,太过于复杂了。
【这里设计到了一个核心的类XmlBeanDefinitionReader】