从零开始写javaweb框架 (1)
在本篇中我们主要来聊聊在网页的连接过程中,框架分别完成了哪些事情。
当我们输入网址按下回车键,http发送一个请求至web框架
- 获取所有类的包名,将拥有Service、Controller注解的类加入到Bean容器中
- 对Bean容器中的类通过反射创建实例
- IOC容器的加载:循环Bean容器中的每一个属性参数,如果有Inject注解,表示需要依赖注入,则从Bean容器中获取相对应的对象实现依赖注入
今天我们来实现一下4个帮助类的实现,从而完成服务器框架启动时完成的任务。
1.注解类的实现
目前只有四个注解类,以Controller为例
package annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 控制器的注解类
* @author cs
* @since 1.0.0
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Controller {
}
其中@interface表示这个类是一个注解类,在这个类上还有两个JAVA提供的注解,分别表示
@Target(ElementType.TYPE) //接口、类、枚举、注解
@Target(ElementType.FIELD) //字段、枚举的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法参数
@Target(ElementType.CONSTRUCTOR) //构造函数
@Target(ElementType.LOCAL_VARIABLE)//局部变量
@Target(ElementType.ANNOTATION_TYPE)//注解
@Target(ElementType.PACKAGE) ///包
@Retention(RetentionPolicy.RUNTIME)//在运行时被JVM或其他使用反射机制的代码所读取和使用
2.BeanHelper类的实现
private static final Map<Class<?>,Object> BEAN_MAP = new HashMap<Class<?>,Object>();
static {
Set<Class<?>> beanClassSet = ClassHelper.getBeanClassSet();
for(Class<?> beanClass:beanClassSet){
Object obj = ReflectionUtil.newInstance(beanClass);
BEAN_MAP.put(beanClass, obj);
}
}
这个方法非常简单,在静态块中对BEAN_MAP容器进行初始化,这个BEAN_MAP将以单例模式保存所有加了Service和Controller注解的类的实例。
3.IOCHelper类的实现
static {
Map<Class<?>,Object> beanMap = BeanHelper.getBeanMap();
if(CollectionUtil.isNotEmpty(beanMap)){
//循环遍历 Bean Map
for(Map.Entry<Class<?>, Object> beanEntry:beanMap.entrySet()){
//获取每个类的对象
Class<?> beanClass = beanEntry.getKey();
Object beanInstance = beanEntry.getValue();
//获得这个类的每个参数
Field[] beanFields = beanClass.getDeclaredFields();
if(ArrayUtil.isNotEmpty(beanFields)){
//Bean Field
for(Field beanField:beanFields){
//Bean Field中如果有注入标志则从beanMap中进行注入
if(beanField.isAnnotationPresent(Inject.class)){
Class<?> beanFieldClass = beanField.getType();
Object beanFieldInstance = beanMap.get(beanFieldClass);
if(beanFieldInstance != null){
//通过反射进行创建
ReflectionUtil.setField(beanInstance, beanField, beanFieldInstance);
}
}
}
}
}
}
}
这个类在整个框架是中非常重要的,因为他实现了依赖注入,解耦了对象与对象之间的依赖,现在所有的对象都是由框架来实现创建和注入。
在本节中,我们实现了几个helper类 ,完成了JAVAWEB框架启动时最基本的功能,实现了依赖注入解耦了对象与对象之间的依赖。