架构探险——从零开始的MVC框架(一)

本文是《架构探险》读书笔记,介绍如何构建一个轻量级Java Web MVC框架,涵盖配置文件读取、Ioc依赖注入、类扫描与注解运用。通过ClassUtil和ReflectionUtil工具类实现类的加载与反射操作,BeanHelper作为Bean容器,实现单例模式的依赖注入。
摘要由CSDN通过智能技术生成

这一系列主要是《架构探险——从零开始写java web框架》这本书的读书笔记,同时记录下自己实现代码过程中遇到的一些java类的基本原理和用法。
从第三章“搭建轻量级 java web框架”开始,基本讲述的是如何自己去实现一个mvc框架的基本功能,其中用到很多新颖的知识。
最开始,书中设计的是一个非常简单的框架,只有几个核心功能:1、通过Controller注解定义Controller类,Service注解定义Service类;2、通过Inject注解进行依赖注入;3、用Action注解标明方法;4、从项目的配置文件中获取配置参数。
首先完成的是读取配置文件的功能。书中用了一个ConfigConstant接口,里面维护着很多字符串常量,如JDBC_USERNAME、JDBC_PASSWORD等等,是读取配置文件时默认的key(配置项名称)。然后写了一个ConfigHelper助手类,通过调用PropsUtil(第二章里写的工具类)的方法,写了一系列方法读取配置文件中的配置项。如获取jdbc用户名、获取jdbc密码等等。
然后完成前三个功能。为了用注解标记类、方法和变量,首先我们要知道哪些类、方法和变量上用了这个注解。同时,为了实现Ioc依赖注入(就是框架帮助开发者把对象注入到正确的位置进行使用),框架要承担起新建对象和管理对象的责任,所以这里我们需要写一个ClassUtil工具类,用于提供与类相关的方法,如获取类加载器、加载类、获取指定包名下的所有类等。
获取类加载器就是获取当前线程的ClassLoader:

/**
     * 获取类加载器
     */
    public static ClassLoader getClassLoader(){
   
        return Thread.currentThread().getContextClassLoader();
    }

加载类:

/**
     * 加载类
     */
    public static Class<?> loadClass(String className, boolean isInitialized){
   
        //需要提供类名和是否初始化的标志
        //为了提高加载类的性能,可以将loadClass方法的isInitialized参数设置为false
        Class<?> cls;
        try{
   
            cls = Class.forName(className, isInitialized, getClassLoader());
        }catch(ClassNotFoundException e){
   
            LOGGER.error("load class failure", e);
            throw new RuntimeException(e);
        }
        return cls;
    }

这里用到两个知识点:一个是泛型,就是上面的Class<?>,代表着方法返回一个Class对象,但type是什么依照被传入的类名而定。泛型的信息只在编译时起作用,编译完成后会被擦除,这也就意味着这个方法本身可以处理很多种类型的Class。另一个是反射,也就是中间的Class.forName(),调用这个方法可以根据className和一些其他的信息创建一个类。
最复杂的:获取执行包名下的所有类:

/**
     * 获取指定包名下的所有类
     */
    public static Set<Class<?>> getClassSet(String packageName){
   
        //需要根据包名将其转换为文件路径,读取class文件或jar包,获取指定的类名去加载类
        Set<Class<?>> classSet = new HashSet<Class<?>>();
        try{
   
        	//这里用到getResources()方法,发现如果类路径上有重复的资源,getResource()方法会返回类路径上碰到的第一个资源,
        	//而getResources()则会返回当前类加载器路径上的所有重复资源以及父类加载器上的所有重复资源。
            Enumeration<URL> urls = getClassLoader().getResources(packageName.replace(".","/"));
           
            while(urls.hasMoreElements()){
   
                URL url = urls.nextElement();
                if(url != null){
   
                    String protocol = url.getProtocol();
                    if(protocol.equals("file")){
   
                        String packagePath = url.getPath().replaceAll("%20",
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值