- 手写Spring框架IoC
- Spring框架核心接口实现ApplicationContext
- Spring框架核心接口实现类ClassPathXmlApplicationContext
十一、手写Spring框架IoC
- Spring
IoC
的实现原理:工厂模式 + 解析 XML + 反射机制。
10.1 环境准备
创建模块
myspring
。
配置
pom.xml
文件,引入以下依赖:dom4j
依赖、jaxen
依赖、junit
依赖。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<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>com.f</groupId>
<artifactId>myspring</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<dependencies>
<!--dom4j解析XML文件-->
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>
<!--jaxen用以使用xpath-->
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.2.0</version>
</dependency>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>创建
JavaBean
文件。- 注意:这些
JavaBean
是使用框架的用户写的,与框架自身代码无关。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26package com.f.myspring.bean;
/**
* @author fzy
* @date 2024/1/21 20:36
*/
public class User {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}1
2
3
4
5
6
7
8
9
10
11package com.f.myspring.bean;
/**
* @author fzy
* @date 2024/1/21 20:36
*/
public class UserDao {
public void insert() {
System.out.println("Mysql数据库正在保存用户信息...");
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17package com.f.myspring.bean;
/**
* @author fzy
* @date 2024/1/21 20:37
*/
public class UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void save() {
userDao.insert();
}
}- 注意:这些
创建配置文件。
- 注意:这个配置文件是使用框架的用户写的,与框架自身代码无关。
1
2
3
4
5
6
7
8
9
10
11
12
<!--这个配置文件是使用myspring框架的开发人员提供的-->
<beans>
<bean id="user" class="com.f.myspring.bean.User">
<property name="name" value="jack"/>
<property name="age" value="30"/>
</bean>
<bean id="userService" class="com.f.myspring.bean.UserService">
<property name="userDao" ref="userDao"/>
</bean>
<bean id="userDao" class="com.f.myspring.bean.UserDao"/>
</beans>
10.2 Spring框架核心接口实现ApplicationContext
1 | package org.myspringframework.core; |
10.3 Spring框架核心接口实现类ClassPathXmlApplicationContext
1 | package org.myspringframework.core; |
10.4 MySpring框架测试
1 | package com.f.myspring.test; |