前言:加深对spring的理解,把spring ioc的大致流程抽出来,自己动手撸一个简洁版的
- 新建一个maven工程,这里使用idea工具
pom文件只依赖一个servlet
<?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>com.fanday</groupId>
<artifactId>spring</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
项目结构:
- ioc spring的bean工厂,完成定位 注册 初始化 注入等过程
- mvc spring的web层mvc框架,负责请求的分发
- demo 用于测试框架使用
编写接口定义
- ApplicationContext主要定义获取bean的方法,有根据id获取的,也有获取所有bean的
package com.fanday.ioc;
import java.util.Map;
public interface ApplicationContext {
/**
* 根据id获取bean
* @param id
* @return
*/
Object getBean(String id);
/**
* 根据id获取特定类型的bean,完成强转
* @param id
* @param clazz
* @param <T>
* @return
*/
<T>T getBean(String id,Class<T> clazz);
/**
* 获取工厂内的所有bean集合
* @return
*/
Map<String,Object> getBeans();
}
- BeanRegister定义向工厂注册bean 和BeanDefinition的方法
package com.fanday.ioc;
import com.fanday.ioc.support.BeanDefinition;
import java.util.List;
public interface BeanRegister {
/**
* 向工厂内注册BeanDefinition
* @param bds
*/
void registBeanDefinition(List<BeanDefinition> bds);
/**
* 向工厂内注册bean实例对象
* @param id
* @param instance
*/
void registInstanceMapping(String id,Object instance);
}
support包主要是一些默认的工厂实现,annotation包是一些需要的注解
package com.fanday.ioc.annotation;
import java.lang.annotation.*;
<