• 一起写框架-Ioc内核容器的实现-基础功能-容器对象名默认首字母小写(八)


    实现功能

    --前面实现的代码--

    默认的对象名就类名。不符合Java的命名规范。我们希望默认的对象名首字母小写。

    实现思路

    创建一个命名规则的帮助类。实现将对大写开头的对象名修改为小写开头。

    实现步骤

    1.创建一个命名规则帮助类

     1 package ioc.core.utils;
     2 
     3 /**
     4  * 创建命名规则帮助类
     5  * 
     6  * @author ranger
     7  *
     8  */
     9 public class NamingUtils {
    10     /**
    11      * 将类名修改为对象名,首字母小写
    12      * 
    13      * @param className
    14      */
    15     public static String firstCharToLower(String className) {
    16         StringBuilder sb = new StringBuilder(className);
    17         //修改首字符为小写
    18         sb.setCharAt(0, Character.toLowerCase(sb.charAt(0)));
    19         return sb.toString();
    20 
    21     }
    22 
    23 }

    2.在创建对象是调用该方法,AbstractApplicationContext类的构造方法修改标红处

         /**
          * 将容器操作加载创建对象的代码写抽象类里面,这样可以方便以后扩展多种实现。
          * @param classType
          */
        public AbstractApplicationContext(Class<?> classType) {
             //判断配置类是否有Configuration注解
             Configuration annotation = classType.getDeclaredAnnotation(Configuration.class);
             if(annotation!=null){
                 //获得组件扫描注解
                 ComponentScan componentScan = classType.getDeclaredAnnotation(ComponentScan.class);
                 //获得包名
                 this.basePackage = componentScan.basePackages();
                 //根据包名获得类全限制名
                 //Set<String> classNames = PackageUtils.getClassName(this.basePackage[0], true);
                 //将扫描一个包,修改为多个包
                 Set<String> classNames = PackageUtils.getClassNames(this.basePackage, true);
                 //通过类名创建对象
                 Iterator<String> iteratorClassName = classNames.iterator();
                 while(iteratorClassName.hasNext()){
                     
                     String className = iteratorClassName.next();
                     //System.out.println(className);
                     try {
                         //通过类全名创建对象
                         Class<?> objectClassType = Class.forName(className);
                         /*
                          * 判断如果类权限名对应的不是接口,并且包含有@Component|@Controller|@Service|@Repository
                          * 才可以创建对象
                          */
                         if(this.isComponent(objectClassType)){
                            Object instance = objectClassType.newInstance();
                            //将对象加到容器中,对象名就类全名
                          //this.getContext().addObject(instance.getClass().getSimpleName(),instance);
                    //修改为,默认对象支持首字符小写
                      String objectName = NamingUtils.firstCharToLower(instance.getClass().getSimpleName());
                            this.getContext().addObject(objectName,instance);
                         }
                    } catch (InstantiationException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    } catch (ClassNotFoundException e) {
                        e.printStackTrace();
                    }
                 }
             }
        }

    测试代码

    package ioc.core.test;
    
    import org.junit.Test;
    
    import ioc.core.impl.AnntationApplicationContext;
    import ioc.core.test.config.Config;
    import ioc.core.test.service.UserService;
    
    public class AnntationApplicationContextTest {
        
        @Test
        public void login(){
            try {
                AnntationApplicationContext context=new AnntationApplicationContext(Config.class);
                     //使用小写的对象名
                UserService userService = context.getBean("userService", UserService.class);
                userService.login();
            
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    --测试结果

  • 相关阅读:
    Javascript设计模式理论与实战:单例模式
    详解CSS盒模型
    linux添加计划任务
    python删除目录下七天前创建的文件
    centos上源码安装clang 3.8
    使用postman发送数据并构建collections执行测试
    python多线程实现同时执行两个while循环
    使用Python写Windows Service服务程序
    用Pyinstaller打包发布exe应用
    使用Jmeter监测服务器cpu、内存等性能
  • 原文地址:https://www.cnblogs.com/zhuyuejiu/p/7819386.html
Copyright © 2020-2023  润新知