从零开始写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框架启动时最基本的功能,实现了依赖注入解耦了对象与对象之间的依赖。

posted @ 2017-06-08 11:11  青檬凝  阅读(310)  评论(0编辑  收藏  举报