从零开始java web_从零开始写javaweb框架 (1)

在本篇中我们主要来聊聊在网页的连接过程中,框架分别完成了哪些事情。

当我们输入网址按下回车键,http发送一个请求至web框架

f14be552af06cb533a09c37c8bc04df3.png

获取所有类的包名,将拥有Service、Controller注解的类加入到Bean容器中

对Bean容器中的类通过反射创建实例

IOC容器的加载:循环Bean容器中的每一个属性参数,如果有Inject注解,表示需要依赖注入,则从Bean容器中获取相对应的对象实现依赖注入

今天我们来实现一下4个帮助类的实现,从而完成服务器框架启动时完成的任务。

1.注解类的实现

89c96a1ce6961d014238bcc71eef30e8.png

目前只有四个注解类,以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,Object> BEAN_MAP = new HashMap,Object>();

static {

Set> 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,Object> beanMap = BeanHelper.getBeanMap();

if(CollectionUtil.isNotEmpty(beanMap)){

//循环遍历 Bean Map

for(Map.Entry, 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框架启动时最基本的功能,实现了依赖注入解耦了对象与对象之间的依赖。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值